package info.limpet.stackedcharts.model.tests;
import java.awt.Color;
import java.io.IOException;
import java.util.HashMap;
import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.Resource;
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
import org.junit.Assert;
import org.junit.Test;
import info.limpet.stackedcharts.model.AxisDirection;
import info.limpet.stackedcharts.model.Chart;
import info.limpet.stackedcharts.model.ChartSet;
import info.limpet.stackedcharts.model.DataItem;
import info.limpet.stackedcharts.model.Dataset;
import info.limpet.stackedcharts.model.Datum;
import info.limpet.stackedcharts.model.DependentAxis;
import info.limpet.stackedcharts.model.IndependentAxis;
import info.limpet.stackedcharts.model.Marker;
import info.limpet.stackedcharts.model.ScatterSet;
import info.limpet.stackedcharts.model.SelectiveAnnotation;
import info.limpet.stackedcharts.model.StackedchartsFactory;
import info.limpet.stackedcharts.model.StackedchartsPackage;
import info.limpet.stackedcharts.model.Zone;
/**
* A JUnit Plug-in Test to demonstrate basic EMF operations, such as model manipulaton, persistnce
* and event handling
*/
public class ModelTests
{
@Test
public void testReadModel()
{
URI resourceURI = URI.createFileURI("testRead.stackedcharts");
Resource resource = new ResourceSetImpl().createResource(resourceURI);
try
{
resource.load(new HashMap<>());
}
catch (IOException e)
{
e.printStackTrace();
Assert.fail("Could not read model: " + e.getMessage());
}
ChartSet chartsSet = (ChartSet) resource.getContents().get(0);
Assert.assertNotNull(chartsSet);
Assert.assertEquals(2, chartsSet.getCharts().size());
Chart chart = chartsSet.getCharts().get(0);
Assert.assertEquals("Temperature & Salinity", chart.getName());
// have a look at the innads
EList<DependentAxis> axes = chart.getMinAxes();
Assert.assertEquals("Correct number", 1, axes.size());
DependentAxis axis1 = axes.get(0);
Assert.assertEquals("correct name", "Temperature", axis1.getName());
Assert.assertEquals("correct direction", AxisDirection.ASCENDING, axis1.getDirection());
axes = chart.getMaxAxes();
DependentAxis axis2 = axes.get(0);
Assert.assertEquals("correct name", "Salinity", axis2.getName());
}
@Test
public void testWriteModel()
{
ChartSet chartsSet = createModel();
URI resourceURI = URI.createFileURI("testWrite.stackedcharts");
Resource resource = new ResourceSetImpl().createResource(resourceURI);
resource.getContents().add(chartsSet);
try
{
resource.save(null);
}
catch (IOException e)
{
e.printStackTrace();
Assert.fail("Could not write model: " + e.getMessage());
}
}
@Test
public void testNotifications()
{
Chart chart = createModel().getCharts().get(0);
ChartNameChangeListener listener = new ChartNameChangeListener();
chart.eAdapters().add(listener);
Assert.assertFalse(listener.isNotified());
chart.setName("Changed");
Assert.assertTrue(listener.isNotified());
}
private ChartSet createModel()
{
StackedchartsFactory factory = StackedchartsFactory.eINSTANCE;
ChartSet chartsSet = factory.createChartSet();
// set the common x axis
IndependentAxis depthAxis = factory.createIndependentAxis();
depthAxis.setName("Depth");
chartsSet.setSharedAxis(depthAxis);
// first chart
Chart tempChart = factory.createChart();
tempChart.setName("Temperature & Salinity");
chartsSet.getCharts().add(tempChart);
DependentAxis yAxis1 = factory.createDependentAxis();
yAxis1.setName("Temperature");
tempChart.getMinAxes().add(yAxis1);
Dataset temperatureVsDepth1 = factory.createDataset();
temperatureVsDepth1.setName("Temp vs Depth");
yAxis1.getDatasets().add(temperatureVsDepth1);
DataItem item1 = factory.createDataItem();
item1.setIndependentVal(1000);
item1.setDependentVal(30);
temperatureVsDepth1.getMeasurements().add(item1);
item1 = factory.createDataItem();
item1.setIndependentVal(2000);
item1.setDependentVal(50);
temperatureVsDepth1.getMeasurements().add(item1);
item1 = factory.createDataItem();
item1.setIndependentVal(3000);
item1.setDependentVal(60);
temperatureVsDepth1.getMeasurements().add(item1);
// second axis/dataset on this first graph
DependentAxis yAxis2 = factory.createDependentAxis();
yAxis2.setName("Salinity");
tempChart.getMaxAxes().add(yAxis2);
Dataset salinityVsDepth1 = factory.createDataset();
salinityVsDepth1.setName("Salinity Vs Depth");
yAxis2.getDatasets().add(salinityVsDepth1);
item1 = factory.createDataItem();
item1.setIndependentVal(1000);
item1.setDependentVal(3000);
salinityVsDepth1.getMeasurements().add(item1);
item1 = factory.createDataItem();
item1.setIndependentVal(2000);
item1.setDependentVal(5000);
salinityVsDepth1.getMeasurements().add(item1);
item1 = factory.createDataItem();
item1.setIndependentVal(3000);
item1.setDependentVal(9000);
salinityVsDepth1.getMeasurements().add(item1);
// create a second chart
// first chart
Chart pressureChart = factory.createChart();
pressureChart.setName("Pressure Gradient");
chartsSet.getCharts().add(pressureChart);
// have a go at an annotation on the x axis
IndependentAxis shared = chartsSet.getSharedAxis();
Marker marker = factory.createMarker();
marker.setValue(1200);
marker.setName("A marker");
SelectiveAnnotation sel = factory.createSelectiveAnnotation();
sel.setAnnotation(marker);
shared.getAnnotations().add(sel);
Zone zone = factory.createZone();
zone.setStart(2100);
zone.setEnd(2500);
zone.setName("A Zone");
sel = factory.createSelectiveAnnotation();
sel.setAnnotation(zone);
shared.getAnnotations().add(sel);
DependentAxis pressureAxis = factory.createDependentAxis();
pressureAxis.setName("Pressure");
pressureChart.getMinAxes().add(pressureAxis);
Dataset pressureVsDepth = factory.createDataset();
pressureVsDepth.setName("Pressure vs Depth");
pressureAxis.getDatasets().add(pressureVsDepth);
DataItem item = factory.createDataItem();
item.setIndependentVal(1000);
item.setDependentVal(400);
pressureVsDepth.getMeasurements().add(item);
item = factory.createDataItem();
item.setIndependentVal(2000);
item.setDependentVal(500);
pressureVsDepth.getMeasurements().add(item);
item = factory.createDataItem();
item.setIndependentVal(3000);
item.setDependentVal(100);
pressureVsDepth.getMeasurements().add(item);
// have a go at a scatter set
ScatterSet scatter = factory.createScatterSet();
scatter.setName("Pressure Markers");
Datum datum = factory.createDatum();
datum.setVal(1650d);
scatter.getDatums().add(datum);
datum = factory.createDatum();
datum.setVal(1700d);
scatter.getDatums().add(datum);
datum = factory.createDatum();
datum.setVal(1720d);
scatter.getDatums().add(datum);
datum = factory.createDatum();
datum.setVal(1790d);
scatter.getDatums().add(datum);
SelectiveAnnotation sa = factory.createSelectiveAnnotation();
sa.setAnnotation(scatter);
sa.getAppearsIn().add(pressureChart);
chartsSet.getSharedAxis().getAnnotations().add(sa);
// and another one
scatter = factory.createScatterSet();
scatter.setName("Common Markers");
datum = factory.createDatum();
datum.setVal(650d);
scatter.getDatums().add(datum);
datum = factory.createDatum();
datum.setVal(700d);
scatter.getDatums().add(datum);
datum = factory.createDatum();
datum.setVal(720d);
scatter.getDatums().add(datum);
datum = factory.createDatum();
datum.setVal(790d);
scatter.getDatums().add(datum);
sa = factory.createSelectiveAnnotation();
sa.setAnnotation(scatter);
chartsSet.getSharedAxis().getAnnotations().add(sa);
// oh, try markers on the dependent axis
ScatterSet pScatter = factory.createScatterSet();
datum = factory.createDatum();
datum.setVal(100d);
pScatter.getDatums().add(datum);
datum = factory.createDatum();
datum.setVal(500d);
pScatter.getDatums().add(datum);
pressureAxis.getAnnotations().add(pScatter);
// hey, how about a zone on the dependent axis?
Zone pZone = factory.createZone();
pZone.setStart(380);
pZone.setEnd(450);
pZone.setColor(Color.yellow);
pZone.setName("Pixel Zone");
pressureAxis.getAnnotations().add(pZone);
return chartsSet;
}
/**
* Helper class to test notifications
*/
private static class ChartNameChangeListener implements Adapter
{
private Notifier notifier;
private boolean notified;
@Override
public void notifyChanged(Notification notification)
{
int featureId = notification.getFeatureID(StackedchartsPackage.class);
switch (featureId)
{
case StackedchartsPackage.CHART__NAME:
notified = true;
}
}
@Override
public Notifier getTarget()
{
return notifier;
}
@Override
public void setTarget(Notifier newTarget)
{
this.notifier = newTarget;
}
@Override
public boolean isAdapterForType(Object type)
{
return ChartSet.class.equals(type);
}
public boolean isNotified()
{
return notified;
}
}
}