From 35a9a6ca1d04ff17e702c0a61716fe558f24b32d Mon Sep 17 00:00:00 2001 From: Lennart van Koot Date: Tue, 10 Aug 2021 21:51:03 +0200 Subject: [PATCH 1/3] Add page difference percentages to CompareResult interface --- .../java/de/redsix/pdfcompare/CompareResult.java | 8 ++++++++ .../de/redsix/pdfcompare/CompareResultImpl.java | 16 +++++++++++++--- .../de/redsix/pdfcompare/PageDiffCalculator.java | 8 ++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) 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..eca0537 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 @@ -131,10 +132,14 @@ public synchronized void addPage(final PageDiffCalculator diffCalculator, final isEqual = false; diffAreas.add(diffCalculator.getDiffArea()); diffImages.put(pageIndex, diffImage); + diffPercentages.put(pageIndex, diffCalculator.getDifferenceInPercent()); pages++; - } else if (environment.addEqualPagesToResult()) { - diffImages.put(pageIndex, diffImage); - pages++; + } else { + diffPercentages.put(pageIndex, 0.0); + if (environment.addEqualPagesToResult()) { + diffImages.put(pageIndex, diffImage); + pages++; + } } } @@ -193,6 +198,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) { From d5d1e099eaefa13e3a45383e13b13b1d225f8b3f Mon Sep 17 00:00:00 2001 From: Lennart van Koot Date: Tue, 10 Aug 2021 22:15:52 +0200 Subject: [PATCH 2/3] Add tests for calculating and collecting percentages --- .../pdfcompare/CompareResultImplTest.java | 20 +++++++++++++ .../pdfcompare/PageDiffCalculatorTest.java | 28 +++++++++++++++++++ 2 files changed, 48 insertions(+) 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 From 3aff29be7e550bb76b6b1844c413c6b592157cac Mon Sep 17 00:00:00 2001 From: Lennart van Koot Date: Wed, 11 Aug 2021 19:41:22 +0200 Subject: [PATCH 3/3] Fix to always use getDifferenceInPercent when collecting percentages --- .../java/de/redsix/pdfcompare/CompareResultImpl.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java b/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java index eca0537..f239c46 100644 --- a/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java +++ b/src/main/java/de/redsix/pdfcompare/CompareResultImpl.java @@ -128,18 +128,15 @@ 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()); diffImages.put(pageIndex, diffImage); - diffPercentages.put(pageIndex, diffCalculator.getDifferenceInPercent()); pages++; - } else { - diffPercentages.put(pageIndex, 0.0); - if (environment.addEqualPagesToResult()) { - diffImages.put(pageIndex, diffImage); - pages++; - } + } else if (environment.addEqualPagesToResult()) { + diffImages.put(pageIndex, diffImage); + pages++; } }