ソースを参照

new: ImageAssert

Ranides Atterwim 2 年 前
コミット
745afdca55

+ 63 - 0
assira.junit/src/main/java/net/ranides/assira/junit/ImageAssert.java

@@ -0,0 +1,63 @@
+package net.ranides.assira.junit;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+
+import static org.junit.Assert.fail;
+
+public class ImageAssert {
+
+    public static void assertEquals(String expected, BufferedImage value) throws IOException {
+        URL resource = ImageAssert.class.getClassLoader().getResource(expected);
+        if(resource == null) {
+            fail("Expected resource not found: " + expected);
+        }
+        BufferedImage expectedImage = ImageIO.read(resource);
+
+        int ew = expectedImage.getWidth((img, flags, x, y, width, height) -> false);
+        int eh = expectedImage.getHeight((img, flags, x, y, width, height) -> false);
+        int vw = value.getWidth((img, flags, x, y, width, height) -> false);
+        int vh = value.getHeight((img, flags, x, y, width, height) -> false);
+
+        int w = Math.max(ew, vw) + 20;
+        int h = eh + vh + Math.max(eh, vh) + 40;
+
+        BufferedImage view = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics graphics = view.getGraphics();
+        graphics.setColor(Color.MAGENTA);
+        graphics.fillRect(0,0,w,h);
+
+        graphics.drawImage(expectedImage, 10, 10, (img, flags, x, y, width, height) -> false);
+        graphics.drawImage(value, 10, eh + 20, (img, flags, x, y, width, height) -> false);
+
+        boolean equal = true;
+
+        for(int y=0; y<Math.min(eh, vh); y++) {
+            for(int x=0; x<Math.min(ew, vw); x++) {
+                Color diff;
+                if(expectedImage.getRGB(x, y) == value.getRGB(x, y)) {
+                    diff = Color.WHITE;
+                } else {
+                    diff = Color.RED;
+                    equal = false;
+                }
+                view.setRGB(x+10, eh+vh+30 +y, diff.getRGB());
+            }
+        }
+
+        if(!equal) {
+            File compareFile = new File("target/" + expected.replace("/", "_"));
+            File outputFile = new File("target/out_" + expected.replace("/", "_"));
+            ImageIO.write(view, "bmp", compareFile);
+            ImageIO.write(value, "bmp", outputFile);
+            fail("Image is different than \"" + expected +"\". Look at " + compareFile.getAbsolutePath());
+        }
+
+    }
+
+
+}

+ 2 - 3
assira.ui/src/main/java/net/ranides/assira/ui/primitives/ImageLoader.java

@@ -13,6 +13,7 @@ import net.ranides.assira.trace.LoggerUtils;
 
 import javax.imageio.ImageIO;
 import java.awt.*;
+import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 
@@ -21,8 +22,6 @@ import java.io.UncheckedIOException;
  */
 @UtilityClass
 public final class ImageLoader {
-    
-    private static final org.slf4j.Logger LOGGER = LoggerUtils.getLogger();
 
     /**
      * Loads image from resource in classpath.
@@ -31,7 +30,7 @@ public final class ImageLoader {
      * @param path resource path
      * @return Image or null
      */
-    public static Image fromResource(String path) {
+    public static BufferedImage fromResource(String path) {
         try {
             return ImageIO.read(ResourceUtils.url(path));
         } catch (IOException cause) {

+ 29 - 1
assira.ui/src/test/java/net/ranides/assira/ui/primitives/CssParserTest.java

@@ -7,16 +7,19 @@ import net.ranides.assira.grammar.G4Selector;
 import net.ranides.assira.grammar.G4SelectorBuilder;
 import net.ranides.assira.grammar.G4Support;
 import net.ranides.assira.io.ResourceUtils;
+import net.ranides.assira.junit.ImageAssert;
 import net.ranides.assira.junit.NewAssert;
 import net.ranides.assira.system.HostSystem;
 import net.ranides.assira.text.StrAppender;
 import net.ranides.assira.ui.helpers.ColorUtils;
 import net.ranides.grammars.generated.CssGrammarLexer;
 import net.ranides.grammars.generated.CssGrammarParser;
-import org.junit.Ignore;
 import org.junit.Test;
 
+import javax.swing.*;
+import javax.swing.border.Border;
 import java.awt.*;
+import java.awt.image.BufferedImage;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.util.Arrays;
@@ -305,4 +308,29 @@ public class CssParserTest {
         assertNotNull( CssParser.PARSER.parse("root_border", "#808080 1px") );
         assertNotNull( CssParser.PARSER.parse("root_border", "solid") );
     }
+
+    @Test
+    public void testBorder1() throws IOException {
+        JPanel panel = new JPanel();
+        panel.setBackground(new Color(128,192,192));
+        panel.setForeground(Color.RED);
+
+        ImageAssert.assertEquals("borders/border1a.bmp", paintBorder(panel, CssParser.border(panel, "solid 1px #f00")));
+
+        ImageAssert.assertEquals("borders/border1b.bmp", paintBorder(panel, CssParser.border(panel, "outset 1px #f00")));
+        ImageAssert.assertEquals("borders/border1c.bmp", paintBorder(panel, CssParser.border(panel, "outset 4px #800")));
+        ImageAssert.assertEquals("borders/border1d.bmp", paintBorder(panel, CssParser.border(panel, "outset 4px")));
+        ImageAssert.assertEquals("borders/border1e.bmp", paintBorder(panel, CssParser.border(panel, "outset #800")));
+        ImageAssert.assertEquals("borders/border1f.bmp", paintBorder(panel, CssParser.border(panel, "outset")));
+    }
+
+    private BufferedImage paintBorder(JPanel panel, Border border) throws IOException {
+        BufferedImage output = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
+        Graphics graphics3 = output.getGraphics();
+        graphics3.setColor(panel.getBackground());
+        graphics3.fillRect(0,0,200,100);
+        border.paintBorder(panel, graphics3, 1, 1, 198, 98);
+        return output;
+    }
+
 }

BIN
assira.ui/src/test/resources/borders/border1a.bmp


BIN
assira.ui/src/test/resources/borders/border1b.bmp


BIN
assira.ui/src/test/resources/borders/border1c.bmp


BIN
assira.ui/src/test/resources/borders/border1d.bmp


BIN
assira.ui/src/test/resources/borders/border1e.bmp


BIN
assira.ui/src/test/resources/borders/border1f.bmp