package org.geotools.image.test; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.IOException; import org.geotools.image.test.ImageComparator.Mode; import org.junit.Test; public class ImageComparatorTest { @Test public void testDifferentImage() { compareDifferentImage(BufferedImage.TYPE_4BYTE_ABGR); compareDifferentImage(BufferedImage.TYPE_3BYTE_BGR); compareDifferentImage(BufferedImage.TYPE_BYTE_GRAY); compareDifferentImage(BufferedImage.TYPE_BYTE_INDEXED); } private void compareDifferentImage(int imageType) { BufferedImage image1 = new BufferedImage(200, 200, imageType); Graphics2D gr = image1.createGraphics(); gr.setColor(Color.BLUE); gr.setStroke(new BasicStroke(4)); gr.drawLine(0, 0, 200, 200); gr.dispose(); BufferedImage image2 = new BufferedImage(200, 200, imageType); gr = image2.createGraphics(); gr.setColor(Color.BLUE); gr.setStroke(new BasicStroke(4)); gr.drawLine(0, 0, 200, 200); gr.fillRect(180, 50, 10, 10); gr.dispose(); ImageComparator comparator = new ImageComparator(Mode.IgnoreNothing, image1, image2); assertEquals(100, comparator.getMismatchCount()); assertEquals(0.0025, comparator.getMismatchPercent(), 0.0001); } @Test public void testSameImage() { compareSameImage(BufferedImage.TYPE_4BYTE_ABGR); compareSameImage(BufferedImage.TYPE_3BYTE_BGR); compareSameImage(BufferedImage.TYPE_BYTE_GRAY); compareSameImage(BufferedImage.TYPE_BYTE_INDEXED); } private void compareSameImage(int imageType) { BufferedImage image1 = new BufferedImage(200, 200, imageType); Graphics2D gr = image1.createGraphics(); gr.setColor(Color.BLUE); gr.setStroke(new BasicStroke(4)); gr.drawLine(0, 0, 200, 200); gr.dispose(); BufferedImage image2 = new BufferedImage(200, 200, imageType); gr = image2.createGraphics(); gr.setColor(Color.BLUE); gr.setStroke(new BasicStroke(4)); gr.drawLine(0, 0, 200, 200); gr.dispose(); ImageComparator comparator = new ImageComparator(Mode.IgnoreNothing, image1, image2); assertEquals(0l, comparator.getMismatchCount()); assertEquals(0d, comparator.getMismatchPercent(), 0d); } @Test public void testAntialiasDifferences() throws Exception { compareAntialiasedImage(BufferedImage.TYPE_4BYTE_ABGR); compareAntialiasedImage(BufferedImage.TYPE_3BYTE_BGR); compareAntialiasedImage(BufferedImage.TYPE_BYTE_GRAY); compareAntialiasedImage(BufferedImage.TYPE_BYTE_INDEXED); } private void compareAntialiasedImage(int imageType) throws IOException { BufferedImage image1 = new BufferedImage(200, 200, imageType); Graphics2D gr = image1.createGraphics(); gr.setColor(Color.BLUE); gr.setStroke(new BasicStroke(4)); gr.drawLine(0, 0, 200, 200); gr.dispose(); BufferedImage image2 = new BufferedImage(200, 200, imageType); gr = image2.createGraphics(); gr.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); gr.setColor(Color.BLUE); gr.setStroke(new BasicStroke(4)); gr.drawLine(0, 0, 200, 200); gr.dispose(); ImageComparator comparatorStrict = new ImageComparator(Mode.IgnoreNothing, image1, image2); assertTrue(comparatorStrict.getMismatchCount() > 0); assertTrue(comparatorStrict.getMismatchPercent() < 0.05); ImageComparator comparatorAA = new ImageComparator(Mode.IgnoreAntialiasing, image1, image2); assertEquals(0l, comparatorAA.getMismatchCount()); assertEquals(0d, comparatorAA.getMismatchPercent(), 0d); } @Test public void testColorDifferences() throws Exception { compareDifferentColor(BufferedImage.TYPE_4BYTE_ABGR); compareDifferentColor(BufferedImage.TYPE_3BYTE_BGR); compareDifferentColor(BufferedImage.TYPE_BYTE_GRAY); compareDifferentColor(BufferedImage.TYPE_BYTE_INDEXED); } private void compareDifferentColor(int imageType) throws IOException { BufferedImage image1 = new BufferedImage(200, 200, imageType); Graphics2D gr = image1.createGraphics(); gr.setColor(new Color(0, 0, 255)); gr.setStroke(new BasicStroke(4)); gr.drawLine(0, 0, 200, 200); gr.dispose(); BufferedImage image2 = new BufferedImage(200, 200, imageType); gr = image2.createGraphics(); gr.setColor(new Color((int) Math.round(255 * 0.11 / 0.3), 0, 0)); gr.setStroke(new BasicStroke(4)); gr.drawLine(0, 0, 200, 200); gr.dispose(); ImageComparator comparatorIC = new ImageComparator(Mode.IgnoreColors, image1, image2); assertEquals(0l, comparatorIC.getMismatchCount()); assertEquals(0d, comparatorIC.getMismatchPercent(), 0d); } }