/*
* This file is part of ADDIS (Aggregate Data Drug Information System).
* ADDIS is distributed from http://drugis.org/.
* Copyright © 2009 Gert van Valkenhoef, Tommi Tervonen.
* Copyright © 2010 Gert van Valkenhoef, Tommi Tervonen, Tijs Zwinkels,
* Maarten Jacobs, Hanno Koeslag, Florin Schimbinschi, Ahmad Kamal, Daniel
* Reid.
* Copyright © 2011 Gert van Valkenhoef, Ahmad Kamal, Daniel Reid, Florin
* Schimbinschi.
* Copyright © 2012 Gert van Valkenhoef, Daniel Reid, Joël Kuiper, Wouter
* Reckman.
* Copyright © 2013 Gert van Valkenhoef, Joël Kuiper.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.drugis.addis.plot;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.image.ImageObserver;
import java.awt.image.RenderedImage;
import java.awt.image.renderable.RenderableImage;
import java.text.AttributedCharacterIterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import org.apache.batik.ext.awt.g2d.AbstractGraphics2D;
import org.apache.batik.ext.awt.g2d.GraphicContext;
import org.drugis.common.JUnitUtil;
/**
* A mock object for testing drawing code. Takes a list of shapes that the client code should draw.
* verify() then check whether all (and only) expected shapes have been drawn.
*/
public class MockGraphics2D extends AbstractGraphics2D {
private Collection<? extends Shape> d_expected;
private Collection<Shape> d_actual;
public MockGraphics2D(Collection<? extends Shape> expected) {
super(true);
gc = new GraphicContext();
d_expected = expected;
d_actual = new ArrayList<Shape>();
}
public void verify() throws AssertionError {
JUnitUtil.assertAllAndOnly(d_expected, d_actual);
}
@SuppressWarnings("rawtypes")
@Override
public void addRenderingHints(Map arg0) {
throw new RuntimeException("Not Implemented");
}
@Override
public void draw(Shape s) {
d_actual.add(getTransformed(s));
}
private Shape getTransformed(Shape s) {
Shape transformed = null;
if (s instanceof Rectangle) {
Rectangle r = (Rectangle) s;
if (gc.getTransform().getType() == AffineTransform.TYPE_TRANSLATION ||
gc.getTransform().getType() == AffineTransform.TYPE_IDENTITY) {
r.x += gc.getTransform().getTranslateX();
r.y += gc.getTransform().getTranslateY();
transformed = r;
} else {
throw new RuntimeException("Unsupported Transformation");
}
} else if (s instanceof Line2D) {
Line2D l = (Line2D) s;
if (gc.getTransform().getType() == AffineTransform.TYPE_TRANSLATION ||
gc.getTransform().getType() == AffineTransform.TYPE_IDENTITY) {
transformed = new Line(
l.getX1() + gc.getTransform().getTranslateX(),
l.getY1() + gc.getTransform().getTranslateY(),
l.getX2() + gc.getTransform().getTranslateX(),
l.getY2() + gc.getTransform().getTranslateY()
);
} else {
throw new RuntimeException("Unsupported Transformation");
}
} else {
throw new RuntimeException("Unsupported Shape");
}
return transformed;
}
@Override
public void drawRenderableImage(RenderableImage arg0, AffineTransform arg1) {
throw new RuntimeException("Not Implemented");
}
@Override
public void drawRenderedImage(RenderedImage arg0, AffineTransform arg1) {
throw new RuntimeException("Not Implemented");
}
@Override
public void drawString(String arg0, float arg1, float arg2) {
throw new RuntimeException("Not Implemented");
}
@Override
public void drawString(AttributedCharacterIterator arg0, float arg1,
float arg2) {
throw new RuntimeException("Not Implemented");
}
@Override
public void fill(Shape s) {
Shape t = getTransformed(s);
if (t instanceof Rectangle) {
d_actual.add(new FilledRectangle((Rectangle)t, gc.getColor()));
} else {
throw new RuntimeException("Unsupported Shape");
}
}
@Override
public GraphicsConfiguration getDeviceConfiguration() {
throw new RuntimeException("Not Implemented");
}
@SuppressWarnings("rawtypes")
@Override
public void setRenderingHints(Map arg0) {
throw new RuntimeException("Not Implemented");
}
@Override
public void copyArea(int arg0, int arg1, int arg2, int arg3, int arg4,
int arg5) {
throw new RuntimeException("Not Implemented");
}
@Override
public Graphics create() {
throw new RuntimeException("Not Implemented");
}
@Override
public void dispose() {
throw new RuntimeException("Not Implemented");
}
@Override
public boolean drawImage(Image arg0, int arg1, int arg2, ImageObserver arg3) {
throw new RuntimeException("Not Implemented");
}
@Override
public boolean drawImage(Image arg0, int arg1, int arg2, int arg3,
int arg4, ImageObserver arg5) {
throw new RuntimeException("Not Implemented");
}
@Override
public FontMetrics getFontMetrics(Font arg0) {
throw new RuntimeException("Not Implemented");
}
@Override
public void setXORMode(Color arg0) {
throw new RuntimeException("Not Implemented");
}
}