From 722b2561bd1b62bf18a26dd0d73b7e2b147d0b35 Mon Sep 17 00:00:00 2001 From: Robin Maisch Date: Thu, 29 Feb 2024 17:50:34 +0100 Subject: [PATCH] Fix errors from merging JPlag v5.0.0 --- .../test/java/de/jplag/cli/LanguageTest.java | 2 +- .../java/de/jplag/java_cpg/CpgAdapter.java | 21 +++++++++++++++---- .../main/java/de/jplag/java_cpg/Language.java | 4 ++-- .../passes/CleanupTransformationPass.kt | 6 +++--- .../java_cpg/passes/TransformationPass.kt | 8 +++---- .../transformation/GraphTransformation.java | 4 ++-- .../matching/pattern/PatternRegistry.java | 4 ++-- .../operations/InsertOperation.java | 6 +++--- .../operations/RemoveOperation.java | 6 +++--- .../operations/ReplaceOperation.java | 6 +++--- .../operations/SetOperation.java | 8 +++---- .../operations/TransformationHelper.java | 16 +++++++------- .../java_cpg/AbstractJavaCpgLanguageTest.java | 6 +++--- .../java/de/jplag/java_cpg/JavaBlockTest.java | 2 +- .../java/de/jplag/java_cpg/JavaTryTest.java | 2 +- .../java/de/jplag/java_cpg/TransformTest.java | 2 +- .../transform/PlagiarismDetectionTest.java | 8 +++---- 17 files changed, 62 insertions(+), 49 deletions(-) diff --git a/cli/src/test/java/de/jplag/cli/LanguageTest.java b/cli/src/test/java/de/jplag/cli/LanguageTest.java index 6561c8034..4a867bcd9 100644 --- a/cli/src/test/java/de/jplag/cli/LanguageTest.java +++ b/cli/src/test/java/de/jplag/cli/LanguageTest.java @@ -26,7 +26,7 @@ void testInvalidLanguage() { @Test void testLoading() { var languages = LanguageLoader.getAllAvailableLanguages(); - assertEquals(19, languages.size(), "Loaded Languages: " + languages.keySet()); + assertEquals(20, languages.size(), "Loaded Languages: " + languages.keySet()); } @Test diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/CpgAdapter.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/CpgAdapter.java index 73c0ffa10..7cd2cfa6d 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/CpgAdapter.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/CpgAdapter.java @@ -17,6 +17,7 @@ import java.io.File; import java.net.ConnectException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Set; @@ -28,13 +29,19 @@ public class CpgAdapter { private List tokenList; + private boolean reorderingEnabled = true; public CpgAdapter(GraphTransformation... transformations) { addTransformations(transformations); } - /* package-private */ List adapt(Set files) throws ParsingException { + /* package-private */ List adapt(Set files, boolean normalize) throws ParsingException { assert !files.isEmpty(); + + if (!normalize) { + clearTransformations(); + setReorderingEnabled(false); + } TranslationResult translationResult = translate(files); boolean doPushToNeo4j = false; @@ -57,7 +64,7 @@ public CpgAdapter(GraphTransformation... transformations) { .registerLanguage(new CPPLanguage()); - List>> passClasses = List.of( + List>> passClasses = new ArrayList<>(List.of( TypeResolver.class, TypeHierarchyResolver.class, ImportResolver.class, @@ -69,7 +76,9 @@ public CpgAdapter(GraphTransformation... transformations) { DFGSortPass.class, CleanupTransformationPass.class, TokenizationPass.class - ); + )); + + if (!reorderingEnabled) passClasses.remove(DFGSortPass.class); for (Class> passClass : passClasses) { configBuilder.registerPass(getKClass(passClass)); @@ -78,7 +87,7 @@ public CpgAdapter(GraphTransformation... transformations) { translationResult = TranslationManager.builder().config(configBuilder.build()).build().analyze().get(); } catch (InterruptedException | ExecutionException | ConfigurationException e) { - throw new ParsingException(List.copyOf(files).get(0), e); + throw new ParsingException(List.copyOf(files).getFirst(), e); } return translationResult; } @@ -123,5 +132,9 @@ public void clearTransformations() { TransformationPass.clearTransformations(); CleanupTransformationPass.clearTransformations(); } + + public void setReorderingEnabled(boolean enabled) { + this.reorderingEnabled = enabled; + } } diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/Language.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/Language.java index 27a5ecd22..9ffcb2516 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/Language.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/Language.java @@ -46,8 +46,8 @@ public int minimumTokenMatch() { } @Override - public List parse(Set files) throws ParsingException { - return cpgAdapter.adapt(files); + public List parse(Set files, boolean normalize) throws ParsingException { + return cpgAdapter.adapt(files, normalize); } private GraphTransformation[] standardTransformations() { diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/passes/CleanupTransformationPass.kt b/languages/java-cpg/src/main/java/de/jplag/java_cpg/passes/CleanupTransformationPass.kt index f6fb332f2..f6cd468f7 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/passes/CleanupTransformationPass.kt +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/passes/CleanupTransformationPass.kt @@ -40,7 +40,7 @@ class CleanupTransformationPass(ctx: TranslationContext) : TranslationResultPass } @JvmStatic - val LOGGER: Logger = LoggerFactory.getLogger(CleanupTransformationPass::class.java) + val logger: Logger = LoggerFactory.getLogger(CleanupTransformationPass::class.java) } override fun accept(t: TranslationResult) { @@ -75,7 +75,7 @@ class CleanupTransformationPass(ctx: TranslationContext) : TranslationResultPass } } while (invalidated) - LOGGER.info("%s: Found %d matches".format(transformation.name, count)) + logger.info("%s: Found %d matches".format(transformation.name, count)) } override fun cleanup() { @@ -89,7 +89,7 @@ class CleanupTransformationPass(ctx: TranslationContext) : TranslationResultPass if (successors.size == 1 && successors[0] == dummy && predecessors.size == 1 && predecessors[0] == dummy ) { - LOGGER.debug("The node %s got isolated and will likely be removed.".format(it)) + logger.debug("The node %s got isolated and will likely be removed.".format(it)) dummy.nextEOGEdges.removeIf { e -> e.end == it } dummy.prevEOGEdges.removeIf { e -> e.start == it } } diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/passes/TransformationPass.kt b/languages/java-cpg/src/main/java/de/jplag/java_cpg/passes/TransformationPass.kt index a5ee8b077..fa563bed8 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/passes/TransformationPass.kt +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/passes/TransformationPass.kt @@ -40,7 +40,7 @@ class TransformationPass(ctx: TranslationContext) : TranslationResultPass(ctx) { } @JvmStatic - val LOGGER: Logger = LoggerFactory.getLogger(TransformationPass::class.java) + val logger: Logger = LoggerFactory.getLogger(TransformationPass::class.java) } override fun accept(t: TranslationResult) { @@ -63,13 +63,13 @@ class TransformationPass(ctx: TranslationContext) : TranslationResultPass(ctx) { val sourcePattern: GraphPattern = transformation.sourcePattern val matches: Iterator = detector.getMatches(sourcePattern) - var count = 0; + var count = 0 while (matches.hasNext()) { val match = matches.next() - count++; + count++ transformation.apply(match, ctx) } - LOGGER.info("%s: Found %d matches".format(transformation.name, count)) + logger.info("%s: Found %d matches".format(transformation.name, count)) } diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/GraphTransformation.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/GraphTransformation.java index 0fe73c275..9ae8a3ee0 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/GraphTransformation.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/GraphTransformation.java @@ -66,7 +66,7 @@ enum ExecutionPhase { } class GraphTransformationImpl implements GraphTransformation { - private final static Logger LOGGER = LoggerFactory.getLogger(GraphTransformationImpl.class); + private final static Logger logger = LoggerFactory.getLogger(GraphTransformationImpl.class); protected final GraphPattern sourcePattern; protected final GraphPattern targetPattern; private final List> newNodes; @@ -90,7 +90,7 @@ public void apply(Match match, TranslationContext ctx) { // create nodes of the target sourceGraph missing parentPattern the source sourceGraph newNodes.forEach(op -> op.resolve(match, ctx)); - LOGGER.debug("Apply %s to node %s".formatted(name, match.get(sourcePattern.getRepresentingNode()))); + logger.debug("Apply %s to node %s".formatted(name, match.get(sourcePattern.getRepresentingNode()))); // apply other operations apply(match, concreteOperations, ctx); } diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/matching/pattern/PatternRegistry.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/matching/pattern/PatternRegistry.java index dfc55271b..248ed9418 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/matching/pattern/PatternRegistry.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/matching/pattern/PatternRegistry.java @@ -15,7 +15,7 @@ public class PatternRegistry { private final Map, String> idByPattern; private NodePattern representingNode; - private static final Logger LOGGER = LoggerFactory.getLogger(PatternRegistry.class); + private static final Logger logger = LoggerFactory.getLogger(PatternRegistry.class); private int wildcardCounter; @@ -44,7 +44,7 @@ public Collection allIds() { public void put(String id, NodePattern pattern) { if (patternById.containsKey(id)) { - LOGGER.warn("A NodePattern with the id '%s' is already present in the PatternRegistry"); + logger.warn("A NodePattern with the id '%s' is already present in the PatternRegistry"); } this.patternById.put(id, pattern); this.idByPattern.put(pattern, id); diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/InsertOperation.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/InsertOperation.java index aec8a2465..a93995016 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/InsertOperation.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/InsertOperation.java @@ -24,10 +24,10 @@ */ public final class InsertOperation extends GraphOperationImpl { - private static final Logger LOGGER; + private static final Logger logger; static { - LOGGER = LoggerFactory.getLogger(RemoveOperation.class); + logger = LoggerFactory.getLogger(RemoveOperation.class); } private final CpgNthEdge edge; @@ -56,7 +56,7 @@ public void resolve(Match match, TranslationContext ctx) { // match should contain newChildPattern node because of Builder.createNewNodes() T newTarget = match.get(newChildPattern); int index = edge.getIndex(); - LOGGER.debug("Insert %s into %s at position #%d".formatted(desc(newTarget), desc(parent), index)); + logger.debug("Insert %s into %s at position #%d".formatted(desc(newTarget), desc(parent), index)); apply(ctx, parent, newTarget, index); diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/RemoveOperation.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/RemoveOperation.java index 6fbcb196f..276867224 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/RemoveOperation.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/RemoveOperation.java @@ -34,10 +34,10 @@ public RemoveOperation(NodePattern parentPattern, CpgEdge edg } } - private static final Logger LOGGER; + private static final Logger logger; static { - LOGGER = LoggerFactory.getLogger(RemoveOperation.class); + logger = LoggerFactory.getLogger(RemoveOperation.class); } @@ -49,7 +49,7 @@ public void resolve(Match match, TranslationContext ctx) throws TransformationEx } public static void apply(T element, S parent, CpgEdge edge, boolean disconnectEog) { - LOGGER.debug("Remove " + element.toString()); + logger.debug("Remove " + element.toString()); if (!(edge instanceof CpgNthEdge nthEdge)) { edge.setter().accept(parent, null); diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/ReplaceOperation.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/ReplaceOperation.java index e093a572d..343a1cbf5 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/ReplaceOperation.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/ReplaceOperation.java @@ -21,10 +21,10 @@ */ public final class ReplaceOperation extends GraphOperationImpl { - private static final Logger LOGGER; + private static final Logger logger; static { - LOGGER = LoggerFactory.getLogger(ReplaceOperation.class); + logger = LoggerFactory.getLogger(ReplaceOperation.class); } private final NodePattern newChildPattern; @@ -52,7 +52,7 @@ public void resolve(Match match, TranslationContext ctx) { // Replace AST edge T oldTarget = edge.getter().apply(parent); - LOGGER.debug("Replace %s by %s".formatted(desc(oldTarget), desc(newTarget))); + logger.debug("Replace %s by %s".formatted(desc(oldTarget), desc(newTarget))); if (Objects.isNull(newTarget.getLocation())) { newTarget.setLocation(oldTarget.getLocation()); } diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/SetOperation.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/SetOperation.java index 41f6b7aa2..23ca24909 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/SetOperation.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/SetOperation.java @@ -13,7 +13,7 @@ import java.util.Objects; public final class SetOperation extends GraphOperationImpl { - private static final Logger LOGGER; + private static final Logger logger; private final NodePattern newChildPattern; private final boolean disconnectEog; @@ -26,7 +26,7 @@ public SetOperation(NodePattern parentPattern, } static { - LOGGER = LoggerFactory.getLogger(SetOperation.class); + logger = LoggerFactory.getLogger(SetOperation.class); } @Override @@ -34,7 +34,7 @@ public void resolve(Match match, TranslationContext ctx) { S parent = match.get(parentPattern); // match should contain newChildPattern node because of Builder.createNewNodes() T newChild = match.get(newChildPattern); - LOGGER.debug("Set %s as AST child of %s".formatted(desc(newChild), desc(parent))); + logger.debug("Set %s as AST child of %s".formatted(desc(newChild), desc(parent))); assert Objects.isNull(edge.getter().apply(parent)); edge.setter().accept(parent, newChild); @@ -43,7 +43,7 @@ public void resolve(Match match, TranslationContext ctx) { newChild.setScope(parentScope); if (disconnectEog) { - LOGGER.warn("disconnectEog in SetOperation – not yet implemented"); + logger.warn("disconnectEog in SetOperation – not yet implemented"); } } diff --git a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/TransformationHelper.java b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/TransformationHelper.java index 8c6458b29..6f0bcb92e 100644 --- a/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/TransformationHelper.java +++ b/languages/java-cpg/src/main/java/de/jplag/java_cpg/transformation/operations/TransformationHelper.java @@ -14,7 +14,7 @@ public final class TransformationHelper { - static final Logger LOGGER = LoggerFactory.getLogger(TransformationHelper.class); + static final Logger logger = LoggerFactory.getLogger(TransformationHelper.class); public static final DummyNeighbor DUMMY = DummyNeighbor.getInstance(); private TransformationHelper() { @@ -39,11 +39,11 @@ public static SubgraphWalker.Border getEogBorders(Node astRoot) { result = SubgraphWalker.INSTANCE.getEOGPathEdges(astRoot); if (result.getEntries().isEmpty()) { Node entry = astRoot; - while (!entry.getPrevEOG().isEmpty()) entry = entry.getPrevEOG().get(0); + while (!entry.getPrevEOG().isEmpty()) entry = entry.getPrevEOG().getFirst(); result.setEntries(List.of(entry)); } if (result.getExits().isEmpty()) { Node exit = astRoot; - while (!exit.getNextEOG().isEmpty()) exit = exit.getNextEOG().get(0); + while (!exit.getNextEOG().isEmpty()) exit = exit.getNextEOG().getFirst(); result.setExits(List.of(exit)); } @@ -56,9 +56,9 @@ public static SubgraphWalker.Border getEogBorders(Node astRoot) { private static void checkBorder(Node astRoot, SubgraphWalker.Border result) { if (result.getEntries().isEmpty()) { - LOGGER.debug("AST subtree of %s has no EOG entry".formatted(astRoot)); + logger.debug("AST subtree of %s has no EOG entry".formatted(astRoot)); } else if (result.getEntries().size() > 1) { - LOGGER.debug("AST subtree of %s has multiple EOG entries".formatted(astRoot)); + logger.debug("AST subtree of %s has multiple EOG entries".formatted(astRoot)); } } @@ -91,7 +91,7 @@ public static Node disconnectFromSuccessor(Node astRoot) { List> exitEdges = getExitEdges(astRoot, List.of(exit), true); if (exitEdges.isEmpty()) return null; - Node entry = exitEdges.get(0).getEnd(); + Node entry = exitEdges.getFirst().getEnd(); exitEdges.stream() .filter(e -> !Objects.equals(e.getEnd(), DUMMY)) @@ -181,11 +181,11 @@ public static List disconnectFromPredecessor(Node astRoot) { } private static Node getEntry(Node astRoot) { - return getEogBorders(astRoot).getEntries().get(0); + return getEogBorders(astRoot).getEntries().getFirst(); } private static Node getExit(Node astRoot) { - return getEogBorders(astRoot).getExits().get(0); + return getEogBorders(astRoot).getExits().getFirst(); } static Node connectNewPredecessor(Node target, Node newPredecessor, boolean asAstRoot) { diff --git a/languages/java-cpg/src/test/java/de/jplag/java_cpg/AbstractJavaCpgLanguageTest.java b/languages/java-cpg/src/test/java/de/jplag/java_cpg/AbstractJavaCpgLanguageTest.java index 779d1ba3b..1304e226f 100644 --- a/languages/java-cpg/src/test/java/de/jplag/java_cpg/AbstractJavaCpgLanguageTest.java +++ b/languages/java-cpg/src/test/java/de/jplag/java_cpg/AbstractJavaCpgLanguageTest.java @@ -24,7 +24,7 @@ public abstract class AbstractJavaCpgLanguageTest { protected static final Path BASE_PATH = Path.of("src", "test", "resources", "java"); private static final String LOG_MESSAGE = "Tokens of {}: {}"; private final Logger logger = LoggerFactory.getLogger(AbstractJavaCpgLanguageTest.class); - private de.jplag.Language language; + private de.jplag.java_cpg.Language language; protected File baseDirectory; /** @@ -43,8 +43,8 @@ void setUp() { * @return the token types. * @throws ParsingException if parsing fails. */ - protected List parseJavaFile(String fileName) throws ParsingException { - List parsedTokens = language.parse(Set.of(new File(baseDirectory.getAbsolutePath(), fileName))); + protected List parseJavaFile(String fileName, boolean transform) throws ParsingException { + List parsedTokens = language.parse(Set.of(new File(baseDirectory.getAbsolutePath(), fileName)), transform); List tokenTypes = parsedTokens.stream().map(Token::getType).toList(); logger.info(LOG_MESSAGE, fileName, tokenTypes); logger.info(TokenPrinter.printTokens(parsedTokens, BASE_PATH.toAbsolutePath().toFile())); diff --git a/languages/java-cpg/src/test/java/de/jplag/java_cpg/JavaBlockTest.java b/languages/java-cpg/src/test/java/de/jplag/java_cpg/JavaBlockTest.java index 6fbb4a38c..9a28968b9 100644 --- a/languages/java-cpg/src/test/java/de/jplag/java_cpg/JavaBlockTest.java +++ b/languages/java-cpg/src/test/java/de/jplag/java_cpg/JavaBlockTest.java @@ -16,7 +16,7 @@ class JavaBlockTest extends AbstractJavaCpgLanguageTest { @MethodSource("provideSrcDirectories") @DisplayName("Test pairs of classes with explicit vs. implicit blocks.") void testJavaClassPair(String dir) throws ParsingException { - parseJavaFile(dir); + parseJavaFile(dir, false); } /** diff --git a/languages/java-cpg/src/test/java/de/jplag/java_cpg/JavaTryTest.java b/languages/java-cpg/src/test/java/de/jplag/java_cpg/JavaTryTest.java index b29f48655..d1caa3ec0 100644 --- a/languages/java-cpg/src/test/java/de/jplag/java_cpg/JavaTryTest.java +++ b/languages/java-cpg/src/test/java/de/jplag/java_cpg/JavaTryTest.java @@ -14,6 +14,6 @@ class JavaTryTest extends AbstractJavaCpgLanguageTest { @Test @DisplayName("Test difference between try block and try-with-resource block.") void testJavaClassPair() throws ParsingException { - assertIterableEquals(parseJavaFile("try/Try.java"), parseJavaFile("try/TryWithResource.java")); + assertIterableEquals(parseJavaFile("try/Try.java", true), parseJavaFile("try/TryWithResource.java", true)); } } diff --git a/languages/java-cpg/src/test/java/de/jplag/java_cpg/TransformTest.java b/languages/java-cpg/src/test/java/de/jplag/java_cpg/TransformTest.java index 595f6d2e1..baa42bf1b 100644 --- a/languages/java-cpg/src/test/java/de/jplag/java_cpg/TransformTest.java +++ b/languages/java-cpg/src/test/java/de/jplag/java_cpg/TransformTest.java @@ -11,6 +11,6 @@ class TransformTest extends AbstractJavaCpgLanguageTest { @Test @DisplayName("Test the transformation of source code files to graphs.") void testJavaTransformation() throws ParsingException { - parseJavaFile("GetterSetter.java"); + parseJavaFile("GetterSetter.java", true); } } diff --git a/languages/java-cpg/src/test/java/de/jplag/java_cpg/transform/PlagiarismDetectionTest.java b/languages/java-cpg/src/test/java/de/jplag/java_cpg/transform/PlagiarismDetectionTest.java index 355bb3c45..87085f785 100644 --- a/languages/java-cpg/src/test/java/de/jplag/java_cpg/transform/PlagiarismDetectionTest.java +++ b/languages/java-cpg/src/test/java/de/jplag/java_cpg/transform/PlagiarismDetectionTest.java @@ -57,17 +57,17 @@ public void testPlagiarismPair(String submissionsPath, GraphTransformation[] Set submissionSet = Set.of(new File(baseDirectory, submissionsPath)); language.addTransformations(transformation); JPlagOptions options = new JPlagOptions(language, submissionSet, Set.of()) - .withMinimumTokenMatch(5); + .withMinimumTokenMatch(5).withNormalize(true); JPlagResult result; try { - result = new JPlag(options).run(); + result = JPlag.run(options); } catch (ExitException e) { throw new RuntimeException(e); } - JPlagComparison jPlagComparison = result.getAllComparisons().get(0); - Assertions.assertEquals(jPlagComparison.similarity(), 1.0); + JPlagComparison jPlagComparison = result.getAllComparisons().getFirst(); + Assertions.assertEquals(1.0, jPlagComparison.similarity()); } @AfterEach