package org.esa.snap.timeseries.ui.graph; import org.esa.snap.core.jexp.ParseException; import org.esa.snap.timeseries.core.timeseries.datamodel.AxisMapping; import org.jfree.data.time.Day; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesDataItem; import org.junit.Before; import org.junit.Test; import static org.junit.Assert.*; public class TimeSeriesValidatorTest { private final TimeSeriesDataItem ITEM_NAN = new TimeSeriesDataItem(Day.parseDay("2012-01-11"), Double.NaN); private final TimeSeriesDataItem ITEM_0 = new TimeSeriesDataItem(Day.parseDay("2012-01-12"), 0); private final TimeSeriesDataItem ITEM_3 = new TimeSeriesDataItem(Day.parseDay("2012-01-13"), 3); private final TimeSeriesDataItem ITEM_4 = new TimeSeriesDataItem(Day.parseDay("2012-01-14."), 4); private final TimeSeriesDataItem ITEM_7 = new TimeSeriesDataItem(Day.parseDay("2012-01-15"), 7); private final TimeSeriesDataItem ITEM_24_5 = new TimeSeriesDataItem(Day.parseDay("2012-01-16"), 24.5); private TimeSeriesValidator validator; private AxisMapping mapping; @Before public void setUp() throws Exception { validator = new TimeSeriesValidator(); mapping = new AxisMapping(); mapping.addRasterName("alias1", "raster1"); mapping.addRasterName("alias2", "raster2"); mapping.addRasterName("alias1", "raster3"); mapping.addInsituName("alias1", "insitu1"); mapping.addInsituName("alias1", "insitu2"); mapping.addInsituName("alias2", "insitu3"); validator.adaptTo("key1", mapping); } @Test public void testValidateWithDefaultExpression() throws Exception { final TimeSeries unvalidatedTimeSeries = new TimeSeries("insitu1"); unvalidatedTimeSeries.add(ITEM_NAN); unvalidatedTimeSeries.add(ITEM_0); unvalidatedTimeSeries.add(ITEM_24_5); final TimeSeries validatedTimeSeries = validator.validate(unvalidatedTimeSeries, "insitu1", TimeSeriesType.INSITU); assertSame(unvalidatedTimeSeries, validatedTimeSeries); assertEquals(3, validatedTimeSeries.getItemCount()); assertEquals(ITEM_NAN, validatedTimeSeries.getDataItem(0)); assertEquals(ITEM_0, validatedTimeSeries.getDataItem(1)); assertEquals(ITEM_24_5, validatedTimeSeries.getDataItem(2)); } @Test public void testValidateWithExpression() throws Exception { final TimeSeries unvalidatedTimeSeries = new TimeSeries("insitu1"); unvalidatedTimeSeries.add(ITEM_NAN); unvalidatedTimeSeries.add(ITEM_0); unvalidatedTimeSeries.add(ITEM_24_5); assertTrue(validator.setExpression("i.insitu1", "i.insitu1 > 0")); final TimeSeries validatedTimeSeries = validator.validate(unvalidatedTimeSeries, "insitu1", TimeSeriesType.INSITU); assertNotSame(unvalidatedTimeSeries, validatedTimeSeries); assertEquals(1, validatedTimeSeries.getItemCount()); assertEquals(ITEM_24_5, validatedTimeSeries.getDataItem(0)); } @Test public void testValidateWithWrongType() throws Exception { final TimeSeries unvalidatedTimeSeries = new TimeSeries("raster1"); assertTrue(validator.setExpression("r.raster1", "r.raster1 > 5")); try { validator.validate(unvalidatedTimeSeries, "raster1", TimeSeriesType.INSITU); fail("ParseException expected"); } catch (ParseException e) { assertEquals("No variable for identifier 'i.raster1' registered.", e.getMessage()); } } @Test public void testValidate() throws Exception { final TimeSeries unvalidatedTimeSeries = new TimeSeries("raster1"); unvalidatedTimeSeries.add(ITEM_0); unvalidatedTimeSeries.add(ITEM_4); unvalidatedTimeSeries.add(ITEM_7); unvalidatedTimeSeries.add(ITEM_24_5); assertTrue(validator.setExpression("r.raster1", "r.raster1 > 5")); final TimeSeries validated = validator.validate(unvalidatedTimeSeries, "raster1", TimeSeriesType.PIN); assertNotSame(unvalidatedTimeSeries, validated); assertEquals(2, validated.getItemCount()); assertEquals(ITEM_7, validated.getDataItem(0)); assertEquals(ITEM_24_5, validated.getDataItem(1)); } @Test() public void testTryToSetInvalidExpression() throws Exception { assertFalse(validator.setExpression("r.raster1", "raster1 groesserAls 5")); } @Test public void testThatValidatorIsCorrectlyInitialized() throws Exception { assertTrue(validator.setExpression("r.raster1", "r.raster1 > 5")); assertFalse(validator.setExpression("r.raster4", "r.raster4 > 5")); } @Test public void testThatOnlyBooleanExpressionsCanBeSet() throws Exception { assertTrue(validator.setExpression("r.raster1", "r.raster1 > 5")); assertFalse(validator.setExpression("r.raster1", "r.raster1 + r.raster1")); } @Test public void testRepeatedAdapting() throws Exception { TimeSeries validated; final TimeSeries series = new TimeSeries("raster1"); series.add(ITEM_0); series.add(ITEM_3); series.add(ITEM_4); series.add(ITEM_7); assertTrue(validator.setExpression("r.raster1", "r.raster1 > 3")); validated = validator.validate(series, "raster1", TimeSeriesType.CURSOR); assertEquals(2, validated.getItemCount()); validator.adaptTo("key2", new AxisMapping()); assertFalse(validator.setExpression("r.raster1", "r.raster1 > 3")); try { validator.validate(series, "raster1", TimeSeriesType.CURSOR); fail(); } catch (ParseException expected) { assertEquals("No variable for identifier 'r.raster1' registered.", expected.getMessage()); } validator.adaptTo("key1", mapping); validated = validator.validate(series, "raster1", TimeSeriesType.CURSOR); assertEquals(2, validated.getItemCount()); assertTrue(validator.setExpression("r.raster1", "r.raster1 < 5")); validated = validator.validate(series, "raster1", TimeSeriesType.CURSOR); assertEquals(3, validated.getItemCount()); } @Test public void testInvalidIfExpressionEqualsSourceName() throws Exception { assertFalse(validator.setExpression("r.raster1", "r.raster1")); } @Test public void testEmptyExpression() throws Exception { TimeSeries validated; final TimeSeries series = new TimeSeries("raster1"); series.add(ITEM_3); series.add(ITEM_4); validated = validator.validate(series, "raster1", TimeSeriesType.CURSOR); assertEquals(2, validated.getItemCount()); assertTrue(validator.setExpression("r.raster1", "r.raster1 < 4")); validated = validator.validate(series, "raster1", TimeSeriesType.CURSOR); assertEquals(1, validated.getItemCount()); assertTrue(validator.setExpression("r.raster1", "")); validated = validator.validate(series, "raster1", TimeSeriesType.CURSOR); assertEquals(2, validated.getItemCount()); assertTrue(validator.setExpression("r.raster1", "r.raster1 < 4")); validated = validator.validate(series, "raster1", TimeSeriesType.CURSOR); assertEquals(1, validated.getItemCount()); assertTrue(validator.setExpression("r.raster1", "true")); validated = validator.validate(series, "raster1", TimeSeriesType.CURSOR); assertEquals(2, validated.getItemCount()); } }