From 07851f1e6f696ad5bb77cc9fcef0493430f5b8cb Mon Sep 17 00:00:00 2001 From: Alex | Kronox Date: Thu, 29 Aug 2024 18:14:04 +0200 Subject: [PATCH 1/4] fix extraction of end token --- .../reporting/jsonfactory/BaseCodeReportWriter.java | 7 ++++--- .../reporting/jsonfactory/ComparisonReportWriter.java | 11 ++++++----- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/core/src/main/java/de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java b/core/src/main/java/de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java index e5217330d..c956a9f79 100644 --- a/core/src/main/java/de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java +++ b/core/src/main/java/de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java @@ -66,9 +66,10 @@ private BaseCodeMatch convertToBaseCodeMatch(Submission submission, Match match, List tokens = submission.getTokenList().subList(takeLeft ? match.startOfFirst() : match.startOfSecond(), (takeLeft ? match.endOfFirst() : match.endOfSecond()) + 1); - Comparator lineComparator = Comparator.comparingInt(Token::getLine); - Token start = tokens.stream().min(lineComparator).orElseThrow(); - Token end = tokens.stream().max(lineComparator).orElseThrow(); + Comparator lineStartComparator = Comparator.comparingInt(Token::getLine).thenComparingInt(Token::getColumn); + Comparator lineEndComparator = Comparator.comparingInt(Token::getLine).thenComparingInt((Token t) -> t.getColumn() + t.getLength()); + Token start = tokens.stream().min(lineStartComparator).orElseThrow(); + Token end = tokens.stream().max(lineEndComparator).orElseThrow(); CodePosition startPosition = new CodePosition(start.getLine(), start.getColumn() - 1, takeLeft ? match.startOfFirst() : match.startOfSecond()); diff --git a/core/src/main/java/de/jplag/reporting/jsonfactory/ComparisonReportWriter.java b/core/src/main/java/de/jplag/reporting/jsonfactory/ComparisonReportWriter.java index f8732dac4..04d8de97d 100644 --- a/core/src/main/java/de/jplag/reporting/jsonfactory/ComparisonReportWriter.java +++ b/core/src/main/java/de/jplag/reporting/jsonfactory/ComparisonReportWriter.java @@ -99,12 +99,13 @@ private Match convertMatchToReportMatch(JPlagComparison comparison, de.jplag.Mat List tokensFirst = comparison.firstSubmission().getTokenList().subList(match.startOfFirst(), match.endOfFirst() + 1); List tokensSecond = comparison.secondSubmission().getTokenList().subList(match.startOfSecond(), match.endOfSecond() + 1); - Comparator lineComparator = Comparator.comparingInt(Token::getLine).thenComparingInt(Token::getColumn); + Comparator lineStartComparator = Comparator.comparingInt(Token::getLine).thenComparingInt(Token::getColumn); + Comparator lineEndComparator = Comparator.comparingInt(Token::getLine).thenComparingInt((Token t) -> t.getColumn() + t.getLength()); - Token startOfFirst = tokensFirst.stream().min(lineComparator).orElseThrow(); - Token endOfFirst = tokensFirst.stream().max(lineComparator).orElseThrow(); - Token startOfSecond = tokensSecond.stream().min(lineComparator).orElseThrow(); - Token endOfSecond = tokensSecond.stream().max(lineComparator).orElseThrow(); + Token startOfFirst = tokensFirst.stream().min(lineStartComparator).orElseThrow(); + Token endOfFirst = tokensFirst.stream().max(lineEndComparator).orElseThrow(); + Token startOfSecond = tokensSecond.stream().min(lineStartComparator).orElseThrow(); + Token endOfSecond = tokensSecond.stream().max(lineEndComparator).orElseThrow(); String firstFileName = FilePathUtil.getRelativeSubmissionPath(startOfFirst.getFile(), comparison.firstSubmission(), submissionToIdFunction) .toString(); From d74a7ad3f4248bf2d9687baa6a987639ea805c9a Mon Sep 17 00:00:00 2001 From: Alex | Kronox Date: Fri, 30 Aug 2024 08:42:39 +0200 Subject: [PATCH 2/4] fix spottless --- .../de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java | 3 ++- .../de/jplag/reporting/jsonfactory/ComparisonReportWriter.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java b/core/src/main/java/de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java index c956a9f79..1f4a9a279 100644 --- a/core/src/main/java/de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java +++ b/core/src/main/java/de/jplag/reporting/jsonfactory/BaseCodeReportWriter.java @@ -67,7 +67,8 @@ private BaseCodeMatch convertToBaseCodeMatch(Submission submission, Match match, (takeLeft ? match.endOfFirst() : match.endOfSecond()) + 1); Comparator lineStartComparator = Comparator.comparingInt(Token::getLine).thenComparingInt(Token::getColumn); - Comparator lineEndComparator = Comparator.comparingInt(Token::getLine).thenComparingInt((Token t) -> t.getColumn() + t.getLength()); + Comparator lineEndComparator = Comparator.comparingInt(Token::getLine) + .thenComparingInt((Token t) -> t.getColumn() + t.getLength()); Token start = tokens.stream().min(lineStartComparator).orElseThrow(); Token end = tokens.stream().max(lineEndComparator).orElseThrow(); diff --git a/core/src/main/java/de/jplag/reporting/jsonfactory/ComparisonReportWriter.java b/core/src/main/java/de/jplag/reporting/jsonfactory/ComparisonReportWriter.java index 04d8de97d..35ef87de5 100644 --- a/core/src/main/java/de/jplag/reporting/jsonfactory/ComparisonReportWriter.java +++ b/core/src/main/java/de/jplag/reporting/jsonfactory/ComparisonReportWriter.java @@ -100,7 +100,8 @@ private Match convertMatchToReportMatch(JPlagComparison comparison, de.jplag.Mat List tokensSecond = comparison.secondSubmission().getTokenList().subList(match.startOfSecond(), match.endOfSecond() + 1); Comparator lineStartComparator = Comparator.comparingInt(Token::getLine).thenComparingInt(Token::getColumn); - Comparator lineEndComparator = Comparator.comparingInt(Token::getLine).thenComparingInt((Token t) -> t.getColumn() + t.getLength()); + Comparator lineEndComparator = Comparator.comparingInt(Token::getLine) + .thenComparingInt((Token t) -> t.getColumn() + t.getLength()); Token startOfFirst = tokensFirst.stream().min(lineStartComparator).orElseThrow(); Token endOfFirst = tokensFirst.stream().max(lineEndComparator).orElseThrow(); From a2b4048715556c79e04aa47c14e51b0df6ff5213 Mon Sep 17 00:00:00 2001 From: Alex | Kronox Date: Fri, 30 Aug 2024 12:58:31 +0200 Subject: [PATCH 3/4] test token position exporting --- .../ReportTokenPositionTestTest.java | 150 ++++++++++++++++++ .../jsonfactory/TestableReportWriter.java | 25 +++ 2 files changed, 175 insertions(+) create mode 100644 core/src/test/java/de/jplag/reporting/jsonfactory/ReportTokenPositionTestTest.java create mode 100644 core/src/test/java/de/jplag/reporting/jsonfactory/TestableReportWriter.java diff --git a/core/src/test/java/de/jplag/reporting/jsonfactory/ReportTokenPositionTestTest.java b/core/src/test/java/de/jplag/reporting/jsonfactory/ReportTokenPositionTestTest.java new file mode 100644 index 000000000..e28aca75c --- /dev/null +++ b/core/src/test/java/de/jplag/reporting/jsonfactory/ReportTokenPositionTestTest.java @@ -0,0 +1,150 @@ +package de.jplag.reporting.jsonfactory; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.nio.file.Path; +import java.util.List; +import java.util.Map; + +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import de.jplag.JPlagComparison; +import de.jplag.JPlagResult; +import de.jplag.Match; +import de.jplag.Submission; +import de.jplag.Token; +import de.jplag.options.JPlagOptions; +import de.jplag.reporting.FilePathUtil; +import de.jplag.reporting.reportobject.model.BaseCodeMatch; +import de.jplag.reporting.reportobject.model.CodePosition; +import de.jplag.reporting.reportobject.model.ComparisonReport; + +public class ReportTokenPositionTestTest { + + @Test + void testCorrectTokenPositionsInComparisonReport() { + JPlagResult result = mock(JPlagResult.class); + JPlagOptions mockOptions = createMockOptions(); + when(result.getOptions()).thenReturn(mockOptions); + JPlagComparison comparison = mock(JPlagComparison.class); + String firstID = "first"; + String secondID = "second"; + Submission firstSubmission = createMockSubmission(firstID); + Submission secondSubmission = createMockSubmission(secondID); + when(comparison.firstSubmission()).thenReturn(firstSubmission); + when(comparison.secondSubmission()).thenReturn(secondSubmission); + Match mockMatch = createMockMatch(0, 2, 0, 1); + when(comparison.matches()).thenReturn(List.of(mockMatch)); + + when(result.getComparisons(1)).thenReturn(List.of(comparison)); + + TestableReportWriter resultWriter = new TestableReportWriter(); + Map> comparisonReportOutput; + + try (MockedStatic mockedFilePathUtil = Mockito.mockStatic(FilePathUtil.class)) { + mockedFilePathUtil.when(() -> FilePathUtil.getRelativeSubmissionPath(any(), any(), any())).thenReturn(Path.of("file.java")); + comparisonReportOutput = new ComparisonReportWriter(Submission::getName, resultWriter).writeComparisonReports(result); + } + ComparisonReport comparisonReport = (ComparisonReport) resultWriter.getJsonEntry(Path.of(comparisonReportOutput.get(firstID).get(secondID))); + + assertEquals(1, comparisonReport.matches().size()); + + CodePosition startInFirst = comparisonReport.matches().get(0).startInFirst(); + CodePosition endInFirst = comparisonReport.matches().get(0).endInFirst(); + CodePosition startInSecond = comparisonReport.matches().get(0).startInSecond(); + CodePosition endInSecond = comparisonReport.matches().get(0).endInSecond(); + + assertEquals(1, startInFirst.lineNumber()); + assertEquals(0, startInFirst.column()); + assertEquals(0, startInFirst.tokenListIndex()); + + assertEquals(2, endInFirst.lineNumber()); + assertEquals(10, endInFirst.column()); + assertEquals(2, endInFirst.tokenListIndex()); + + assertEquals(1, startInSecond.lineNumber()); + assertEquals(0, startInSecond.column()); + assertEquals(0, startInSecond.tokenListIndex()); + + assertEquals(2, endInSecond.lineNumber()); + assertEquals(10, endInSecond.column()); + assertEquals(1, endInSecond.tokenListIndex()); + } + + @Test + void testCorrectTokenPositionsInBasecodeReport() { + JPlagResult result = mock(JPlagResult.class); + JPlagOptions mockOptions = createMockOptions(); + when(result.getOptions()).thenReturn(mockOptions); + JPlagComparison comparison = mock(JPlagComparison.class); + String submissionID = "first"; + String basecodeID = "basecode"; + Submission submission = createMockSubmission(submissionID); + Submission baseCodeSubmission = createMockSubmission(basecodeID); + when(comparison.firstSubmission()).thenReturn(submission); + when(comparison.secondSubmission()).thenReturn(baseCodeSubmission); + Match mockMatch = createMockMatch(0, 2, 0, 1); + when(comparison.matches()).thenReturn(List.of(mockMatch)); + when(submission.getBaseCodeComparison()).thenReturn(comparison); + + when(result.getComparisons(1)).thenReturn(List.of(comparison)); + + TestableReportWriter resultWriter = new TestableReportWriter(); + try (MockedStatic mockedFilePathUtil = Mockito.mockStatic(FilePathUtil.class)) { + mockedFilePathUtil.when(() -> FilePathUtil.getRelativeSubmissionPath(any(), any(), any())).thenReturn(Path.of("file.java")); + new BaseCodeReportWriter(Submission::getName, resultWriter).writeBaseCodeReport(result); + } + + List baseCodeMatches = (List) resultWriter.getJsonEntry(Path.of("basecode", submissionID + ".json")); + + assertEquals(1, baseCodeMatches.size()); + + CodePosition start = baseCodeMatches.get(0).start(); + CodePosition end = baseCodeMatches.get(0).end(); + + assertEquals(1, start.lineNumber()); + assertEquals(0, start.column()); + assertEquals(0, start.tokenListIndex()); + + assertEquals(2, end.lineNumber()); + assertEquals(10, end.column()); + assertEquals(2, end.tokenListIndex()); + } + + JPlagOptions createMockOptions() { + JPlagOptions options = mock(JPlagOptions.class); + when(options.maximumNumberOfComparisons()).thenReturn(1); + return options; + } + + Submission createMockSubmission(String name) { + Submission submission = mock(Submission.class); + when(submission.getName()).thenReturn(name); + List tokens = List.of(createMockToken(1, 1, 10), createMockToken(2, 1, 10), createMockToken(2, 3, 2), createMockToken(2, 10, 2)); + when(submission.getTokenList()).thenReturn(tokens); + return submission; + } + + Match createMockMatch(int startOfFirst, int endOfFirst, int startOfSecond, int endOfSecond) { + Match match = mock(Match.class); + when(match.startOfFirst()).thenReturn(startOfFirst); + when(match.endOfFirst()).thenReturn(endOfFirst); + when(match.startOfSecond()).thenReturn(startOfSecond); + when(match.endOfSecond()).thenReturn(endOfSecond); + return match; + } + + Token createMockToken(int line, int column, int length) { + Token token = mock(Token.class); + when(token.getLine()).thenReturn(line); + when(token.getColumn()).thenReturn(column); + when(token.getLength()).thenReturn(length); + return token; + } + +} diff --git a/core/src/test/java/de/jplag/reporting/jsonfactory/TestableReportWriter.java b/core/src/test/java/de/jplag/reporting/jsonfactory/TestableReportWriter.java new file mode 100644 index 000000000..77362106f --- /dev/null +++ b/core/src/test/java/de/jplag/reporting/jsonfactory/TestableReportWriter.java @@ -0,0 +1,25 @@ +package de.jplag.reporting.jsonfactory; + +import java.nio.file.Path; +import java.util.HashMap; +import java.util.Map; + +import de.jplag.reporting.reportobject.writer.DummyResultWriter; + +public class TestableReportWriter extends DummyResultWriter { + + public final Map jsonEntries; + + public TestableReportWriter() { + jsonEntries = new HashMap<>(); + } + + @Override + public void addJsonEntry(Object jsonContent, Path path) { + jsonEntries.put(path, jsonContent); + } + + public Object getJsonEntry(Path path) { + return jsonEntries.get(path); + } +} From 96967c6166b9d7353d5286400a2c9f5e69c1df22 Mon Sep 17 00:00:00 2001 From: Alex | Kronox Date: Fri, 30 Aug 2024 13:12:25 +0200 Subject: [PATCH 4/4] remove test class visibility modifier --- .../reporting/jsonfactory/ReportTokenPositionTestTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/java/de/jplag/reporting/jsonfactory/ReportTokenPositionTestTest.java b/core/src/test/java/de/jplag/reporting/jsonfactory/ReportTokenPositionTestTest.java index e28aca75c..d186863e9 100644 --- a/core/src/test/java/de/jplag/reporting/jsonfactory/ReportTokenPositionTestTest.java +++ b/core/src/test/java/de/jplag/reporting/jsonfactory/ReportTokenPositionTestTest.java @@ -24,7 +24,7 @@ import de.jplag.reporting.reportobject.model.CodePosition; import de.jplag.reporting.reportobject.model.ComparisonReport; -public class ReportTokenPositionTestTest { +class ReportTokenPositionTestTest { @Test void testCorrectTokenPositionsInComparisonReport() {