import graphlib.edges.UndirectedEdge; import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; import graphlib.graphs.UndirectedGraph; import graphlib.nodes.Node; import java.util.Collection; import java.util.Collections; import java.util.List; public class SimpleTest { private static final List voorbeelden = List.of( new Indiening("Anna", "00112233"), new Indiening("Bert", "00000030"), new Indiening("Ciel", "00112233"), new Indiening("Dora", "99999999"), new Indiening("Erik", "99990000"), new Indiening("Fien", "55555555"), new Indiening("Gert", "98765432"), new Indiening("Hans", "90705030") ); /** * Deze plagiaatdetector kijkt naar het aantal gelijke karakters in de code. * De kans op plagiaat is het aantal gelijke karakters op dezelfde positie, * gedeeld door de lengte van de langste code. */ public static class GedeeldeKaraktersPlagiaatDetector implements PlagiaatDetector { @Override public double probabiliteit(Indiening indiening1, Indiening indiening2) { int overlap = 0; for (int i = 0; i < Math.min(indiening1.code().length(), indiening2.code().length()); i++) { if (indiening1.code().charAt(i) == indiening2.code().charAt(i)) { overlap++; } } return overlap / (double) Math.max(indiening1.code().length(), indiening2.code().length()); } } public static void checkGroepen(Collection> expected, Collection> actual) { Assert.assertEquals("Aantal groepen komt niet overeen.", expected.size(), actual.size()); for (Collection groep : actual) { Assert.assertTrue( String.format("Groep %s komt niet overeen met een verwachte groep (%s).", groep, expected), expected.stream().anyMatch(expectedGroep -> groep.containsAll(expectedGroep) && expectedGroep.containsAll(groep)) ); } } public static void checkBoog(UndirectedGraph graph, Indiening indiening1, Indiening indiening2, double expectedWeight) { Node node1 = graph.getNode(indiening1); Node node2 = graph.getNode(indiening2); UndirectedEdge edge = graph.getEdge(node1, node2); Assert.assertNotNull(String.format("Boog tussen %s en %s ontbreekt.", indiening1, indiening2), edge); Assert.assertEquals(String.format("Boog tussen %s en %s heeft verkeerd gewicht.", indiening1, indiening2), expectedWeight, edge.getWeight(), 0.0001); } private static PlagiaatGraafMaker pgm; @BeforeClass public static void init() { pgm = new PlagiaatGraafMaker(); } @Test public void geenBoogBijProbabiliteit0() { List indieningen = List.of( voorbeelden.get(1), voorbeelden.get(3) ); UndirectedGraph graph = pgm.maakPlagiaatgraaf(indieningen, new GedeeldeKaraktersPlagiaatDetector()); Assert.assertFalse("Wanneer twee indieningen een probabiliteit op plagiaat van 0 hebben, mag er geen boog tussen de toppen bestaan.", graph.containsEdge(graph.getNode(indieningen.get(0)), graph.getNode(indieningen.get(1)))); } @Test public void testGroepen1() { UndirectedGraph graph = new UndirectedGraph<>(); Node a = graph.addNode(voorbeelden.get(0)); Node b = graph.addNode(voorbeelden.get(1)); graph.addEdge(new UndirectedEdge<>(a, b, .8)); checkGroepen(Collections.singleton(List.of(voorbeelden.get(0), voorbeelden.get(1))), pgm.maximaleGroepen(graph)); } @Test public void testGroepen2() { UndirectedGraph graph = new UndirectedGraph<>(); Node a = graph.addNode(voorbeelden.get(0)); Node b = graph.addNode(voorbeelden.get(1)); Node c = graph.addNode(voorbeelden.get(2)); Node d = graph.addNode(voorbeelden.get(3)); graph.addEdge(new UndirectedEdge<>(a, b, .8)); graph.addEdge(new UndirectedEdge<>(b, c, .5)); graph.addEdge(new UndirectedEdge<>(c, d, .7)); graph.addEdge(new UndirectedEdge<>(d, a, .4)); checkGroepen( List.of( List.of(voorbeelden.get(0), voorbeelden.get(1)), List.of(voorbeelden.get(2), voorbeelden.get(3)) ), pgm.maximaleGroepen(graph) ); } @Test public void testGraaf1() { Collection indieningen = List.of( voorbeelden.get(6), voorbeelden.get(7) ); UndirectedGraph graph = pgm.maakPlagiaatgraaf(indieningen, new GedeeldeKaraktersPlagiaatDetector()); Assert.assertEquals("Aantal toppen komt niet overeen.", indieningen.size(), graph.getAllNodes().size()); Assert.assertEquals("Aantal bogen is niet correct.", 1, graph.getAllEdges().size()); checkBoog(graph, voorbeelden.get(6), voorbeelden.get(7), .5); } @Test public void testGraaf2() { Collection indieningen = List.of( voorbeelden.get(0), voorbeelden.get(1), voorbeelden.get(2), voorbeelden.get(3) ); UndirectedGraph graph = pgm.maakPlagiaatgraaf(indieningen, new GedeeldeKaraktersPlagiaatDetector()); Assert.assertEquals("Aantal toppen komt niet overeen.", indieningen.size(), graph.getAllNodes().size()); Assert.assertEquals("Aantal bogen is niet correct.", 3, graph.getAllEdges().size()); checkBoog(graph, voorbeelden.get(0), voorbeelden.get(1), .375); checkBoog(graph, voorbeelden.get(0), voorbeelden.get(2), 1); checkBoog(graph, voorbeelden.get(1), voorbeelden.get(2), .375); } @Test public void testMaximaleGroepjes() { checkGroepen( List.of( List.of(voorbeelden.get(0), voorbeelden.get(2)), List.of(voorbeelden.get(1), voorbeelden.get(6), voorbeelden.get(7)), List.of(voorbeelden.get(3), voorbeelden.get(4)) ), pgm.plagiaatGroepen(voorbeelden, new GedeeldeKaraktersPlagiaatDetector()) ); } }