package com.mebigfatguy.polycasso; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import java.awt.image.BufferedImage; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * tests the feedback scoring of an image */ public class DefaultFeedbackTest { private static final long ONE_COMPLETE_GRID_COLOR_DIFFERENCE = 16L * ((255L*255L) + (255L*255L)); DefaultFeedback feedBack; private BufferedImage target; @Before public void setup() { feedBack = new DefaultFeedback(); target = buildSampleImage(); Graphics g = target.getGraphics(); try { g.setColor(Color.BLUE); g.fillRect(4, 4, 8, 8); feedBack.setTargetImage(target); } finally { g.dispose(); } } @Test public void testCalculateScoreWithNoChangeArea() { BufferedImage sampleImage = buildSampleImage(); Score score = feedBack.calculateScore(sampleImage, null, null); Assert.assertEquals(4L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } @Test public void testCalculateScoreWithChangeAreaTotallyAbove() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(4, 0, 8, 2); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(5L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } @Test public void testCalculateScoreWithChangeAreaPartiallyAbove() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(4, 2, 8, 4); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(4L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } @Test public void testCalculateScoreWithChangeAreaTotallyIn() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(4, 4, 8, 4); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(2L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } @Test public void testCalculateScoreWithChangeAreaPartiallyBelow() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(4, 10, 8, 4); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(4L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } @Test public void testCalculateScoreWithChangeAreaTotallyBelow() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(4, 14, 8, 2); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(5L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } @Test public void testCalculateScoreWithChangeAreaTotallyLeft() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(0, 4, 2, 8); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(5L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } @Test public void testCalculateScoreWithChangeAreaPartiallyLeft() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(2, 4, 4, 8); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(4L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } @Test public void testCalculateScoreWithChangeAreaPartiallyRight() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(10, 4, 4, 8); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(4L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } @Test public void testCalculateScoreWithChangeAreaTotallyRight() { BufferedImage sampleImage = buildSampleImage(); Score previousScore = feedBack.calculateScore(sampleImage, null, null); Graphics g = sampleImage.getGraphics(); try { g.setColor(Color.BLUE); Rectangle changedArea = new Rectangle(14, 4, 2, 8); g.fillRect(changedArea.x, changedArea.y, changedArea.width, changedArea.height); Score score = feedBack.calculateScore(sampleImage, previousScore, changedArea); Assert.assertEquals(5L * ONE_COMPLETE_GRID_COLOR_DIFFERENCE, score.getDelta()); } finally { g.dispose(); } } private BufferedImage buildSampleImage() { BufferedImage sample = new BufferedImage(16, 16, BufferedImage.TYPE_4BYTE_ABGR); Graphics g = sample.getGraphics(); try { for (int y = 0; y < 16; y+=4) { for (int x = 0; x < 16; x+=4) { g.setColor((((x + y) & 0x01) == 0) ? Color.RED : Color.GREEN); g.fillRect(x, y, 4, 4); } } return sample; } finally { g.dispose(); } } }