/*******************************************************************************
* Mission Control Technologies, Copyright (c) 2009-2012, United States Government
* as represented by the Administrator of the National Aeronautics and Space
* Administration. All rights reserved.
*
* The MCT platform is licensed under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* MCT includes source code licensed under additional open source licenses. See
* the MCT Open Source Licenses file included with this distribution or the About
* MCT Licenses dialog available at runtime from the MCT Help menu for additional
* information.
*******************************************************************************/
package plotter.xy;
import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.Stroke;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import plotter.Axis;
import plotter.CountingGraphics;
import plotter.LineChecker;
import plotter.TickMarkCalculator;
import junit.framework.TestCase;
public class JUnitXYGrid extends TestCase {
private XYGrid grid;
private XYPlot plot;
@Override
protected void setUp() throws Exception {
LinearXYAxis xAxis = new LinearXYAxis(XYDimension.X);
LinearXYAxis yAxis = new LinearXYAxis(XYDimension.Y);
xAxis.setStart(0);
xAxis.setEnd(1);
yAxis.setStart(0);
yAxis.setEnd(1);
xAxis.setPreferredSize(new Dimension(1, 10));
yAxis.setPreferredSize(new Dimension(10, 1));
xAxis.setTickMarkCalculator(new TickMarkCalculator() {
@Override
public double[][] calculateTickMarks(Axis axis) {
return new double[][] { { 0, .25, .5, .75, 1 }, {} };
}
});
yAxis.setTickMarkCalculator(new TickMarkCalculator() {
@Override
public double[][] calculateTickMarks(Axis axis) {
return new double[][] { { 0, .25, .5, .75, 1 }, {} };
}
});
grid = new XYGrid(xAxis, yAxis);
XYPlotContents contents = new XYPlotContents();
contents.add(grid);
plot = new XYPlot();
plot.add(contents);
plot.add(xAxis);
plot.add(yAxis);
plot.setXAxis(xAxis);
plot.setYAxis(yAxis);
new DefaultXYLayoutGenerator().generateLayout(plot);
}
public void testPaintSimple() throws InterruptedException, InvocationTargetException {
CountingGraphics g = paint();
LineChecker c = new LineChecker();
c.require(199, 0, 199, 200);
c.require(149, 0, 149, 200);
c.require(99, 0, 99, 200);
c.require(49, 0, 49, 200);
c.require(0, 150, 200, 150);
c.require(0, 100, 200, 100);
c.require(0, 50, 200, 50);
c.require(0, 0, 200, 0);
c.check(g.getLines());
}
public void testPaintClip() throws InterruptedException, InvocationTargetException {
CountingGraphics g = paint(new Rectangle(25, 25, 50, 2));
LineChecker c = new LineChecker();
c.require(49, 24, 49, 27);
c.check(g.getLines());
}
public void testPaintClipCustomStroke() throws InterruptedException, InvocationTargetException {
grid.setStroke(new BasicStroke(1, 0, 0, 1, new float[] { 5, 5 }, 0));
CountingGraphics g = paint(new Rectangle(25, 25, 50, 2));
LineChecker c = new LineChecker();
c.require(49, 20, 49, 27);
c.check(g.getLines());
}
public void testPaintClipNonBasicStroke() throws InterruptedException, InvocationTargetException {
grid.setStroke(new Stroke() {
Stroke s = new BasicStroke(1, 0, 0, 1, new float[] { 4, 4 }, 0);
@Override
public Shape createStrokedShape(Shape p) {
return s.createStrokedShape(p);
}
});
CountingGraphics g = paint(new Rectangle(25, 25, 50, 2));
LineChecker c = new LineChecker();
c.require(49, 0, 49, 199);
c.check(g.getLines());
}
private CountingGraphics paint() throws InterruptedException, InvocationTargetException {
return paint(null);
}
// Ensures that the line is 200x200, paints it, and returns the stats.
// We can't use 100x100 because on Mac OSX, the minimum frame width is 128.
private CountingGraphics paint(Shape clip) throws InterruptedException, InvocationTargetException {
final JFrame frame = new JFrame();
frame.getContentPane().add(plot);
BufferedImage image = new BufferedImage(200, 200, BufferedImage.TYPE_3BYTE_BGR);
final Graphics2D imageG = image.createGraphics();
final CountingGraphics g = new CountingGraphics(imageG);
try {
if(clip != null) {
g.setClip(clip);
}
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
try {
frame.pack();
int xo = 200 - grid.getWidth();
int yo = 200 - grid.getHeight();
frame.setSize(frame.getWidth() + xo, frame.getHeight() + yo);
frame.validate();
// These are sanity checks to make sure our setup is correct, not actual functionality tests.
assertEquals(200, grid.getWidth());
assertEquals(200, grid.getHeight());
grid.paint(g);
} finally {
frame.dispose();
}
}
});
} finally {
imageG.dispose();
}
return g;
}
}