package rabbitescape.ui.swing; import java.awt.image.BufferedImage; import java.awt.image.Raster; import java.io.File; import java.io.IOException; import java.util.Arrays; import javax.imageio.ImageIO; import static org.hamcrest.CoreMatchers.*; import static org.hamcrest.MatcherAssert.*; import org.hamcrest.BaseMatcher; import org.hamcrest.Description; import org.hamcrest.Matcher; public class Tools { public static class SwingBitmapMatcher extends BaseMatcher<SwingBitmap> { private final SwingBitmap expected; private SwingBitmap actual; public SwingBitmapMatcher( SwingBitmap expected ) { this.expected = expected; this.actual = null; } @Override public boolean matches( Object actual ) { if ( !( actual instanceof SwingBitmap ) ) { throw new AssertionError( actual + " is not a SwingBitmap" ); } this.actual = (SwingBitmap)actual; return Arrays.equals( pixels( expected ), pixels( this.actual ) ); } @Override public void describeTo( Description _desc ) { _desc.appendText( expected.name() ); writeToFile( "./exp.png", this.expected ); writeToFile( "./act.png", this.actual ); _desc.appendText( "\n[Comparison written to ./exp.png and ./act.png]" ); } private int[] pixels( SwingBitmap bitmap ) { BufferedImage img = bitmap.image; Raster r = img.getData(); int w = r.getWidth(); int h = r.getHeight(); int[] ret = new int[r.getNumBands() * w * h]; return r.getPixels( r.getMinX(), r.getMinY(), w, h, ret ); } private void writeToFile( String fileName, SwingBitmap bitmap ) { try { boolean written = ImageIO.write( bitmap.image, "png", new File( fileName ) ); assertThat( written, is( true ) ); } catch ( IOException e ) { e.printStackTrace(); throw new AssertionError( e ); } catch ( Throwable e ) { e.printStackTrace(); } } } public static Matcher<SwingBitmap> equalTo( final SwingBitmap expected ) { return new SwingBitmapMatcher( expected ); } }