package info.monitorenter.gui.chart;
import info.monitorenter.gui.chart.axis.AAxis;
import info.monitorenter.gui.chart.axis.AxisLinear;
import info.monitorenter.gui.chart.errorbars.ErrorBarPainter;
import info.monitorenter.gui.chart.errorbars.ErrorBarPolicyRelative;
import info.monitorenter.gui.chart.labelformatters.LabelFormatterDate;
import info.monitorenter.gui.chart.labelformatters.LabelFormatterNumber;
import info.monitorenter.gui.chart.pointpainters.PointPainterDisc;
import info.monitorenter.gui.chart.pointpainters.PointPainterLine;
import info.monitorenter.gui.chart.rangepolicies.RangePolicyFixedViewport;
import info.monitorenter.gui.chart.test.ATestChartOperations;
import info.monitorenter.gui.chart.traces.Trace2DLtd;
import info.monitorenter.gui.chart.traces.Trace2DLtdReplacing;
import info.monitorenter.gui.chart.traces.Trace2DLtdSorted;
import info.monitorenter.gui.chart.traces.Trace2DSimple;
import info.monitorenter.util.Range;
import java.awt.BasicStroke;
import java.awt.Color;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.SortedSet;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* Visual test of operations upon the chart with basic ui for human judgement of
* success or failure.
* <p>
*
* @author <a href="mailto:Achim.Westermann@gmx.de">Achim Westermann</a>
*
*
* @version $Revision: 1.34 $
*/
public class TestChartOperationsVisual extends ATestChartOperations {
/**
* Test suite for this test class.
* <p>
*
* @return the test suite
*/
public static Test suite() {
TestSuite suite = new TestSuite();
suite.setName(TestChartOperationsVisual.class.getName());
suite.addTest(new TestChartOperationsVisual("testRemoveAllPoints"));
suite.addTest(new TestChartOperationsVisual("testRemoveAllTraces"));
suite.addTest(new TestChartOperationsVisual("testAddPoint"));
suite.addTest(new TestChartOperationsVisual("testSetStroke"));
suite.addTest(new TestChartOperationsVisual("testSetTraceName"));
suite.addTest(new TestChartOperationsVisual(
"testSetTraceNameEmptyTrace"));
suite.addTest(new TestChartOperationsVisual("testSetRangePolicyX"));
suite.addTest(new TestChartOperationsVisual(
"testAxisLabelFormatterNumberFormatSetNumberFormat"));
suite
.addTest(new TestChartOperationsVisual(
"testAxisSetLabelFormatter"));
suite.addTest(new TestChartOperationsVisual(
"testTraceSetErrorBarPolicy"));
suite.addTest(new TestChartOperationsVisual(
"testIErrorBarPainterSetStartPointPainter"));
suite.addTest(new TestChartOperationsVisual("testZoom"));
suite.addTest(new TestChartOperationsVisual(
"testDeadLockAddPointThread"));
suite
.addTest(new TestChartOperationsVisual(
"testTracePointSetLocation"));
suite.addTest(new TestChartOperationsVisual("testSetNullTraceTitle"));
suite.addTest(new TestChartOperationsVisual("testSetEmptyTraceTitle"));
suite.addTest(new TestChartOperationsVisual(
"testSetTraceTitleOnEmptyTitleTrace"));
suite.addTest(new TestChartOperationsVisual("testAddRemoveTrace"));
suite.addTest(new TestChartOperationsVisual("testSetZIndex"));
suite.addTest(new TestChartOperationsVisual(
"testRemoveTraceForBug2891801"));
suite.addTest(new TestChartOperationsVisual("testAddDiscontinuation"));
return suite;
}
/**
* Constructor with the test name.
* <p>
*
* @param arg0
* the name of the test.
*/
public TestChartOperationsVisual(final String arg0) {
super(arg0);
}
/**
* Adds a point (50,110) and prompts for visual judgement.
* <p>
*/
public void testAddPoint() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.addPoint(50, 110)") {
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
assertNotNull(trace);
trace.addPoint(50, 110);
return null;
}
};
this.setTestOperation(operation);
}
/**
* Adds three traces and removes the 3rd one again.
* <p>
* Bug report
* http://sourceforge.net/tracker/index.php?func=detail&aid=2605832&
* group_id=50440&atid=459734: <cite> The effect I can observe is that
* traces[2] is _not_ removed from the graph (it changes its appearance
* though, as if it would not be correctly scaled anymore). On the other
* hand, removing traces[0] or traces[1] instead of traces[2] works as
* expected!
*
* I tried to look inside to figure out what's going on, but I failed; I
* don't really understand the TreeSetGreedy idea (why is it even there? I'm
* sure there is a reason for it being more appropriate than a regular
* TreeSet, but I cannot guess what it is).
*
* Maybe this helps: the values for the ComparableProperty (that is,
* m_zIndex) for the 3 traces are -1, 0, and 1. Are these plausible? </cite>
*/
public void testAddRemoveTrace() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"add 3 traces, remove last one.") {
/** Traces to add. */
private final ITrace2D[] m_testTraces = new ITrace2D[3];
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
chart.removeTrace(this.m_testTraces[2]);
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#createTraces()
*/
@Override
public ITrace2D[] createTraces() {
return new ITrace2D[] {};
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#preCondition(info.monitorenter.gui.chart.Chart2D)
*/
@Override
public void preCondition(final Chart2D chart) throws Exception {
super.preCondition(chart);
Color[] colors = new Color[] { Color.green, Color.red,
Color.blue };
for (int i = 0; i < 3; i++) {
this.m_testTraces[i] = new Trace2DLtd(300);
this.m_testTraces[i].setStroke(new BasicStroke(8));
this.m_testTraces[i].setColor(colors[i]);
AAxis<?> axisY = new AxisLinear<IAxisScalePolicy>();
chart.addAxisYLeft(axisY);
chart.addTrace(this.m_testTraces[i], chart.getAxisX(),
axisY);
for (int j = 0; j < 300; j++) {
this.m_testTraces[i].addPoint(j, j + 100
* (i + Math.random()));
}
}
}
};
this.setTestOperation(operation);
}
/**
* Sets a new number format to a <code>{@link LabelFormatterNumber}</code>
* of the y axis.
* <p>
*/
public void testAxisLabelFormatterNumberFormatSetNumberFormat() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"chart.getAxisY().getFormatter().setNumberFormat(new DecimalFormat(\"000.000\"))") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
NumberFormat nf = new DecimalFormat("000.000");
LabelFormatterNumber labelFormatter = (LabelFormatterNumber) chart
.getAxisY().getFormatter();
labelFormatter.setNumberFormat(nf);
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#preCondition(info.monitorenter.gui.chart.Chart2D)
*/
@Override
public void preCondition(final Chart2D chart) throws Exception {
super.preCondition(chart);
chart.getAxisY().setFormatter(new LabelFormatterNumber());
// force the precondition visual change to have time show.
// else the repaint could occur after the number format has been
// set to the LabelFormatterNumber!
Thread.sleep(1000);
}
};
this.setTestOperation(operation);
}
/**
* Invokes <code>{@link IAxis#setFormatter(IAxisLabelFormatter)}</code> on
* axis x with a <code>{@link LabelFormatterDate}</code>.
*/
public void testAxisSetLabelFormatter() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"chart.getAxisX().setFormatter(new LabelFormatterNumber(new SimpleDateFormat(\"HH:mm:ss SSS\")))") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss SSS");
chart.getAxisX().setFormatter(new LabelFormatterDate(df));
return null;
}
};
this.setTestOperation(operation);
}
/**
* Tests if creating a chart with one Thread and adding points from another
* results in deadlocks.
* <p>
*
*/
public void testDeadLockAddPointThread() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"add points from another Thread") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
Thread t = new Thread(new Runnable() {
public void run() {
ITrace2D trace = chart.getTraces().iterator().next();
for (int i = 100; i < 200; i++) {
trace.addPoint(i, (Math.random() + 1.0) * -i);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.setDaemon(true);
t.start();
// wait for termination:
while (t.isAlive()) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#createChartInstance()
*/
@Override
public Chart2D createChartInstance() {
return new Chart2D();
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#createTraces()
*/
@Override
public ITrace2D[] createTraces() {
ITrace2D trace = new Trace2DSimple();
return new ITrace2D[] { trace };
}
};
this.setTestOperation(operation);
}
/**
* Invokes
* <code>{@link IErrorBarPainter#setStartPointPainter(IPointPainterConfigurableUI)}
* </code> with a <code>{@link PointPainterDisc}</code>.
* <p>
*/
public void testIErrorBarPainterSetStartPointPainter() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.getErrorbarPainter().setStartPointPainter(new PointPainterDisc())") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().iterator().next();
IErrorBarPolicy<?> errorBarPolicy = trace.getErrorBarPolicies()
.iterator().next();
IErrorBarPainter errorBarPainter = errorBarPolicy
.getErrorBarPainters().iterator().next();
errorBarPainter.setStartPointPainter(new PointPainterDisc(12));
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#preCondition(info.monitorenter.gui.chart.Chart2D)
*/
@Override
public void preCondition(final Chart2D chart) throws Exception {
super.preCondition(chart);
ITrace2D trace = chart.getTraces().iterator().next();
// create an error bar policy and configure it
IErrorBarPolicy<?> errorBarPolicy = new ErrorBarPolicyRelative(
0.2, 0.2);
errorBarPolicy.setShowNegativeYErrors(true);
errorBarPolicy.setShowPositiveYErrors(true);
// errorBarPolicy.setShowNegativeXErrors(true);
// errorBarPolicy.setShowPositiveXErrors(true);
// configure how error bars are rendered with an error bar
// painter:
IErrorBarPainter errorBarPainter = new ErrorBarPainter();
errorBarPainter.setEndPointPainter(new PointPainterDisc());
errorBarPainter.setEndPointColor(Color.GRAY);
errorBarPainter.setConnectionPainter(new PointPainterLine());
errorBarPainter.setConnectionColor(Color.LIGHT_GRAY);
// add the painter to the policy
errorBarPolicy.setErrorBarPainter(errorBarPainter);
trace.setErrorBarPolicy(errorBarPolicy);
// let the update be shown:
Thread.sleep(1000);
}
};
this.setTestOperation(operation);
}
/**
* Removes all points of the trace and prompts for visual judgment.
* <p>
*/
public void testRemoveAllPoints() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.removeAllPoints()") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
trace.removeAllPoints();
if (Chart2D.DEBUG_THREADING) {
System.out.println(this.getClass().getName()
+ " removed all points. ");
}
return null;
}
};
this.setTestOperation(operation);
}
/**
* Removes all traces of the chart and prompts for visual judgment.
* <p>
*/
public void testRemoveAllTraces() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"chart.removeAllTraces()") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
chart.removeAllTraces();
if (Chart2D.DEBUG_THREADING) {
System.out.println(this.getClass().getName()
+ " removed all traces. ");
}
return null;
}
};
this.setTestOperation(operation);
}
/**
* Sets an empty String title to the trace: The label should disappear.
* <p>
*/
public void testSetEmptyTraceTitle() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.setName(\"\")") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
trace.setName("");
return null;
}
};
this.setTestOperation(operation);
}
/**
* Sets null title to the trace: The label should disappear.
* <p>
*/
public void testSetNullTraceTitle() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.setName(null)") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
trace.setName(null);
return null;
}
};
this.setTestOperation(operation);
}
/**
* Sets a new range policy (RangePolicyFixedViewport(new Range(20,30))) to
* the x axis of the chart and prompts for visual judgement.
* <p>
*/
public void testSetRangePolicyX() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"chart.getAxisX().setRangePolicy( "
+ "new RangePolicyFixedViewport(new Range(20, 30)))") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
IRangePolicy rangePolicy = new RangePolicyFixedViewport(
new Range(20, 30));
chart.getAxisX().setRangePolicy(rangePolicy);
return null;
}
};
this.setTestOperation(operation);
}
/**
* Sets a bold stroke to the trace and prompts for visual judgement.
* <p>
*/
public void testSetStroke() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.setStroke(new BasicStroke(2f))") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
trace.setStroke(new BasicStroke(2f));
return null;
}
};
this.setTestOperation(operation);
}
/**
* Sets a new name to the trace and prompts for visual judgment.
* <p>
*/
public void testSetTraceName() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.setName(\"Iphigenie\")") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
trace.setName("Iphigenie");
return null;
}
};
this.setTestOperation(operation);
}
/**
* Sets a new name to an empty trace and prompts for visual judgement.
* <p>
*/
public void testSetTraceNameEmptyTrace() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.setName(\"Tauris\") on empty trace") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
trace.setName("Tauris");
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#createTraces()
*/
@Override
public ITrace2D[] createTraces() {
ITrace2D result = new Trace2DLtdSorted();
return new ITrace2D[] { result };
}
};
this.setTestOperation(operation);
}
/**
* Sets a String title to the trace that has an empty title initially: The
* label should appear.
* <p>
*/
public void testSetTraceTitleOnEmptyTitleTrace() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.setName(\"foobar\")") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
trace.setName("foobar");
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#preCondition(info.monitorenter.gui.chart.Chart2D)
*/
@Override
public void preCondition(final Chart2D chart) throws Exception {
super.preCondition(chart);
ITrace2D trace = chart.getTraces().first();
trace.setName("");
}
};
this.setTestOperation(operation);
}
/**
* Inserts a new TracePoint with an y value <code>{@link Double#NaN}</code>
* to a sorted trace to get a discontinued trace.
* <p>
*/
public void testAddDiscontinuation() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"Inserting a discontinuation: Trace should be split afterwards!") {
/**
* Creates a <code>{@link Trace2DLtdReplacing}</code>.
* <p>
*
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation
* #createTraces()
*/
@Override
public ITrace2D[] createTraces() {
ITrace2D sortedTrace = new Trace2DLtdSorted(500);
return new ITrace2D[] { sortedTrace };
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#fillTrace(info.monitorenter.gui.chart.ITrace2D)
*/
@Override
public void fillTrace(ITrace2D trace) {
for (int i = 0; i < 10; i++) {
trace.addPoint(i, (Math.random() + 1.0) * i);
}
super.fillTrace(trace);
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().first();
trace.addPoint(5, Double.NaN);
return null;
}
};
this.setTestOperation(operation);
}
/**
* Adds two traces and sets the Z-Index of the one behind to top.
* <p>
*/
public void testSetZIndex() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.setZIndex(100)") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
SortedSet<ITrace2D> traces = chart.getTraces();
Iterator<ITrace2D> itTraces = traces.iterator();
boolean first = true;
ITrace2D firstTrace = null;
ITrace2D trace;
while (itTraces.hasNext()) {
trace = itTraces.next();
if (first) {
first = false;
firstTrace = trace;
System.out.println("selected trace: "
+ firstTrace.getName());
}
System.out.println(trace.getName() + " " + trace.getColor()
+ " : " + trace.getZIndex());
}
if (firstTrace != null) {
firstTrace.setZIndex(Integer.valueOf(100));
}
// order after change test:
System.out.println("after change: ");
traces = chart.getTraces();
itTraces = traces.iterator();
while (itTraces.hasNext()) {
trace = itTraces.next();
System.out.println(trace.getName() + " " + trace.getColor()
+ " : " + trace.getZIndex());
}
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#preCondition(info.monitorenter.gui.chart.Chart2D)
*/
@Override
public void preCondition(Chart2D chart) throws Exception {
super.preCondition(chart);
Color[] colors = new Color[] { Color.RED, Color.BLUE };
int count = 0;
for (ITrace2D trace : chart.getTraces()) {
trace.setColor(colors[count % 2]);
trace.setStroke(new BasicStroke(8));
trace.setZIndex(new Integer(count));
count++;
}
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#createTraces()
*/
@Override
public ITrace2D[] createTraces() {
ITrace2D[] result = new ITrace2D[2];
for (int i = 0; i < 2; i++) {
result[i] = new Trace2DLtd(300);
}
return result;
}
};
this.setTestOperation(operation);
}
/**
* Invokes <code>{@link TracePoint2D#setLocation(java.awt.geom.Point2D)}
* </code> on an extremum point to move away from the extremum.
* <p>
*/
public void testTracePointSetLocation() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"TracePoint2D.setLocation(4,-1)") {
/** An extremum point that is shifted away from this extremum. */
private ITracePoint2D m_extremum;
/**
*
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
this.m_extremum.setLocation(4, -1);
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#createTraces()
*/
@Override
public ITrace2D[] createTraces() {
ITrace2D result = new Trace2DLtdSorted();
return new ITrace2D[] { result };
}
@Override
public void fillTrace(ITrace2D trace) {
this.m_extremum = new TracePoint2D(10, 10);
trace.addPoint(new TracePoint2D(2, 3));
trace.addPoint(new TracePoint2D(3, 2));
trace.addPoint(new TracePoint2D(5, 7));
trace.addPoint(this.m_extremum);
}
};
this.setTestOperation(operation);
}
/**
* Invokes <code>{@link ITrace2D#setErrorBarPolicy(IErrorBarPolicy)}</code>
* with a configuration that should be noticed as a visual change.
* <p>
*/
public void testTraceSetErrorBarPolicy() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"trace.setErrorBarPolicy(...)") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ITrace2D trace = chart.getTraces().iterator().next();
// create an error bar policy and configure it
IErrorBarPolicy<?> errorBarPolicy = new ErrorBarPolicyRelative(
0.2, 0.2);
errorBarPolicy.setShowNegativeYErrors(true);
errorBarPolicy.setShowPositiveYErrors(true);
// errorBarPolicy.setShowNegativeXErrors(true);
// errorBarPolicy.setShowPositiveXErrors(true);
// configure how error bars are rendered with an error bar
// painter:
IErrorBarPainter errorBarPainter = new ErrorBarPainter();
errorBarPainter.setEndPointPainter(new PointPainterDisc());
errorBarPainter.setEndPointColor(Color.GRAY);
errorBarPainter.setConnectionPainter(new PointPainterLine());
errorBarPainter.setConnectionColor(Color.LIGHT_GRAY);
// add the painter to the policy
errorBarPolicy.setErrorBarPainter(errorBarPainter);
trace.setErrorBarPolicy(errorBarPolicy);
return null;
}
};
this.setTestOperation(operation);
}
/**
* Sets a bold stroke to the trace and prompts for visual judgement.
* <p>
*/
public void testZoom() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"zoomableChart.zoom()") {
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(final Chart2D chart) {
ZoomableChart zoomChart = (ZoomableChart) chart;
zoomChart.zoom(0.01, 20, 0, 20);
return null;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#createChartInstance()
*/
@Override
public Chart2D createChartInstance() {
return new ZoomableChart();
}
@Override
public ITrace2D[] createTraces() {
ITrace2D trace = new Trace2DSimple();
return new ITrace2D[] { trace };
}
};
this.setTestOperation(operation);
}
/**
* Test the following procedure from bug report:
* https://sourceforge.net/tracker
* /?func=detail&aid=2891801&group_id=50440&atid=459734.
* <p>
* <ol>
* <li>Add a chart.</li>
* <li>Add a first trace on a first Y axis.</li>
* <li>Add a second trace on a second Y axis.</li>
* <li>Add a third trace on a third Y axis.</li>
* <li>Add a fourth trace on the first Y axis.</li>
* <li>try to remove it.</li>
* </ol>
* <p>
*/
public void testRemoveTraceForBug2891801() {
ATestChartOperations.AChartOperation operation = new AChartOperation(
"testRemoveTraceForBug2891801") {
/** The trace to check remove on. **/
private ITrace2D m_trace4;
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#preCondition(info.monitorenter.gui.chart.Chart2D)
*/
@Override
public void preCondition(Chart2D chart) throws Exception {
super.preCondition(chart);
AAxis<?> axisY1 = new AxisLinear<IAxisScalePolicy>();
axisY1.getAxisTitle().setTitle("asisY1");
AAxis<?> axisY2 = new AxisLinear<IAxisScalePolicy>();
axisY2.getAxisTitle().setTitle("asisY2");
AAxis<?> axisY3 = new AxisLinear<IAxisScalePolicy>();
axisY3.getAxisTitle().setTitle("asisY3");
chart.addAxisYLeft(axisY1);
chart.addAxisYLeft(axisY2);
chart.addAxisYLeft(axisY3);
// trace1
IAxis<?> xAxis = chart.getAxisX();
ITrace2D trace1 = new Trace2DLtd();
trace1.setColor(Color.BLUE);
chart.addTrace(trace1, xAxis, axisY1);
this.fillTrace(trace1);
// trace2
ITrace2D trace2 = new Trace2DLtd();
trace2.setColor(Color.RED);
chart.addTrace(trace2, xAxis, axisY2);
this.fillTrace(trace2);
// trace3
ITrace2D trace3 = new Trace2DLtd();
trace3.setColor(Color.BLACK);
chart.addTrace(trace3, xAxis, axisY3);
this.fillTrace(trace3);
// trace4 to axis1
ITrace2D trace4 = new Trace2DLtd();
trace4.setColor(Color.MAGENTA);
trace4.setStroke(new BasicStroke(3f));
chart.addTrace(trace4, xAxis, axisY1);
this.fillTrace(trace4);
this.m_trace4 = trace4;
}
/**
* Overridden to have an empty array returned and be in control to
* which axes the traces are added in
*
* <code>{@link info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#preCondition(Chart2D)}</code>
* <p>
*
* @see info.monitorenter.gui.chart.test.ATestChartOperations.AChartOperation#createTraces()
*/
@Override
public ITrace2D[] createTraces() {
ITrace2D[] result = new ITrace2D[] {};
return result;
}
/**
* @see info.monitorenter.gui.chart.test.ATestChartOperations.IChart2DOperation#action(info.monitorenter.gui.chart.Chart2D)
*/
public Object action(Chart2D chart) throws Exception {
chart.removeTrace(this.m_trace4);
return null;
}
};
this.setTestOperation(operation);
}
}