diff --git a/src/main/java/de/redsix/pdfcompare/CompareResult.java b/src/main/java/de/redsix/pdfcompare/CompareResult.java index ef05be9..1e061c0 100644 --- a/src/main/java/de/redsix/pdfcompare/CompareResult.java +++ b/src/main/java/de/redsix/pdfcompare/CompareResult.java @@ -2,6 +2,7 @@ import java.io.OutputStream; import java.util.Collection; +import java.util.Map; public interface CompareResult { @@ -99,4 +100,11 @@ public interface CompareResult { * @return collection of page numbers, that have a difference */ Collection getPagesWithDifferences(); + + /** + * Gives a map of the difference percentages per page. + * + * @return difference percentages mapped to the page index. + */ + Map getPageDiffsInPercent(); } diff --git a/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java b/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java index 24dcbc2..f239c46 100644 --- a/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java +++ b/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java @@ -47,6 +47,7 @@ public class CompareResultImpl implements ResultCollector, CompareResult { private boolean expectedOnly; private boolean actualOnly; private final Collection diffAreas = new ArrayList<>(); + private final Map diffPercentages = new TreeMap<>(); private int pages = 0; @Override @@ -127,6 +128,7 @@ public synchronized void addPage(final PageDiffCalculator diffCalculator, final Objects.requireNonNull(actualImage, "actualImage is null"); Objects.requireNonNull(diffImage, "diffImage is null"); this.hasDifferenceInExclusion |= diffCalculator.differencesFoundInExclusion(); + diffPercentages.put(pageIndex, diffCalculator.getDifferenceInPercent()); if (diffCalculator.differencesFound()) { isEqual = false; diffAreas.add(diffCalculator.getDiffArea()); @@ -193,6 +195,11 @@ public Collection getPagesWithDifferences() { return diffAreas.stream().map(a -> a.page).collect(Collectors.toList()); } + @Override + public Map getPageDiffsInPercent() { + return diffPercentages; + } + public void expectedOnly() { this.expectedOnly = true; } diff --git a/src/main/java/de/redsix/pdfcompare/PageDiffCalculator.java b/src/main/java/de/redsix/pdfcompare/PageDiffCalculator.java index 1fd523d..5243094 100644 --- a/src/main/java/de/redsix/pdfcompare/PageDiffCalculator.java +++ b/src/main/java/de/redsix/pdfcompare/PageDiffCalculator.java @@ -50,6 +50,14 @@ public boolean differencesFoundInExclusion() { return diffsFoundInExclusion > 0; } + public double getDifferenceInPercent() { + if (totalPixels == 0) { + return diffsFound > 0 ? 100.0 : 0.0; + } else { + return (double)diffsFound / (double)totalPixels * 100.0; + } + } + @Override public boolean equals(final Object o) { if (this == o) { diff --git a/src/test/java/de/redsix/pdfcompare/CompareResultImplTest.java b/src/test/java/de/redsix/pdfcompare/CompareResultImplTest.java index c264a59..70a73ce 100644 --- a/src/test/java/de/redsix/pdfcompare/CompareResultImplTest.java +++ b/src/test/java/de/redsix/pdfcompare/CompareResultImplTest.java @@ -1,5 +1,6 @@ package de.redsix.pdfcompare; +import static org.hamcrest.collection.IsMapContaining.hasEntry; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; @@ -7,6 +8,7 @@ import org.junit.jupiter.api.Test; import java.awt.image.BufferedImage; +import java.util.Map; class CompareResultImplTest { @@ -35,4 +37,22 @@ public void addEqualPagesAreNotStored() { assertThat(compareResult.getNumberOfPages(), is(1)); assertThat(compareResult.diffImages.size(), is(1)); } + + @Test + public void mapsDiffPercentagesCorrectly() { + CompareResultImpl compareResult = new CompareResultImpl(); + compareResult.setEnvironment(new SimpleEnvironment()); + ImageWithDimension image = new ImageWithDimension(new BufferedImage(1, 1, BufferedImage.TYPE_BYTE_BINARY), 0.0f, 0.0f); + + PageDiffCalculator pageWithDiff = new PageDiffCalculator(5, 0); + pageWithDiff.diffFound(); + PageDiffCalculator pageWithoutDiff = new PageDiffCalculator(10, 0); + + compareResult.addPage(pageWithDiff, 1, image, image, image); + compareResult.addPage(pageWithoutDiff, 2, image, image, image); + + Map result = compareResult.getPageDiffsInPercent(); + assertThat(result, hasEntry(1, 20.0)); + assertThat(result, hasEntry(2, 0.0)); + } } \ No newline at end of file diff --git a/src/test/java/de/redsix/pdfcompare/PageDiffCalculatorTest.java b/src/test/java/de/redsix/pdfcompare/PageDiffCalculatorTest.java index ba769d8..2970ded 100644 --- a/src/test/java/de/redsix/pdfcompare/PageDiffCalculatorTest.java +++ b/src/test/java/de/redsix/pdfcompare/PageDiffCalculatorTest.java @@ -1,5 +1,6 @@ package de.redsix.pdfcompare; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -62,4 +63,31 @@ public void diffAbovePercentageAsFractionIsReported() { diffCalculator.diffFound(); assertTrue(diffCalculator.differencesFound()); } + + @Test + public void zeroTotalPixelsWithDiffFoundReportsHundredPercentDifference() { + final PageDiffCalculator diffCalculator = new PageDiffCalculator(0, 0); + diffCalculator.diffFound(); + assertEquals(100.0, diffCalculator.getDifferenceInPercent()); + } + + @Test + public void zeroTotalPixelsWithNoDiffFoundReportsZeroPercentDifference() { + final PageDiffCalculator diffCalculator = new PageDiffCalculator(0, 0); + assertEquals(0.0, diffCalculator.getDifferenceInPercent()); + } + + @Test + public void diffsFoundReportsCorrectPercentage() { + final PageDiffCalculator diffCalculator = new PageDiffCalculator(10, 0); + diffCalculator.diffFound(); + diffCalculator.diffFound(); + assertEquals(20.0, diffCalculator.getDifferenceInPercent()); + } + + @Test + public void noDiffsFoundReportsCorrectPercentage() { + final PageDiffCalculator diffCalculator = new PageDiffCalculator(6, 0); + assertEquals(0.0, diffCalculator.getDifferenceInPercent()); + } } \ No newline at end of file