/*
* Copyright (C) 2014 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* 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.esa.snap.binning.operator.ui;
import com.bc.ceres.binding.Property;
import com.bc.ceres.binding.PropertyDescriptor;
import com.bc.ceres.binding.PropertySet;
import com.bc.ceres.binding.accessors.DefaultPropertyAccessor;
import org.esa.snap.binning.AggregatorConfig;
import org.esa.snap.binning.aggregators.AggregatorAverage;
import org.esa.snap.binning.operator.BinningOp;
import org.esa.snap.binning.operator.VariableConfig;
import org.esa.snap.core.datamodel.Product;
import org.junit.Test;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.text.SimpleDateFormat;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;
import static org.esa.snap.binning.operator.ui.BinningFormModel.*;
import static org.junit.Assert.*;
/**
* @author Thomas Storm
*/
public class BinningFormModelTest {
@Test
public void testSetGetProperty() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
PropertySet propertySet = binningFormModel.getBindingContext().getPropertySet();
propertySet.addProperty(createProperty("key", Float[].class));
propertySet.addProperty(createProperty("key2", Integer[].class));
binningFormModel.setProperty("key", new Float[]{2.0f, 3.0f});
binningFormModel.setProperty("key2", new Integer[]{10, 20, 30});
assertArrayEquals(new Product[0], binningFormModel.getSourceProducts());
assertArrayEquals(new Float[]{2.0f, 3.0f}, binningFormModel.getPropertyValue("key"));
assertArrayEquals(new Integer[]{10, 20, 30}, binningFormModel.getPropertyValue("key2"));
}
@Test
public void testAggregatorConfigsProperty() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
assertArrayEquals(new AggregatorConfig[0], binningFormModel.getAggregatorConfigs());
final AggregatorConfig aggConf1 = new AggregatorAverage.Config("x", "y", 0.4, true, false);
final AggregatorConfig aggConf2 = new AggregatorAverage.Config("a", "b", 0.6, false, null);
binningFormModel.setProperty(PROPERTY_KEY_AGGREGATOR_CONFIGS, new AggregatorConfig[]{aggConf1, aggConf2});
assertArrayEquals(new AggregatorConfig[]{aggConf1, aggConf2}, binningFormModel.getAggregatorConfigs());
}
@Test
public void testVariableConfigsProperty() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
assertArrayEquals(new VariableConfig[0], binningFormModel.getVariableConfigs());
final VariableConfig varConf = new VariableConfig();
varConf.setName("prefix");
varConf.setExpr("NOT algal_2");
binningFormModel.setProperty(PROPERTY_KEY_VARIABLE_CONFIGS, new VariableConfig[]{varConf});
assertArrayEquals(new VariableConfig[]{varConf}, binningFormModel.getVariableConfigs());
}
@Test
public void testListening() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
PropertySet propertySet = binningFormModel.getBindingContext().getPropertySet();
propertySet.addProperty(createProperty("key1", String.class));
propertySet.addProperty(createProperty("key2", String.class));
final MyPropertyChangeListener listener = new MyPropertyChangeListener();
binningFormModel.addPropertyChangeListener(listener);
binningFormModel.setProperty("key1", "value1");
binningFormModel.setProperty("key2", "value2");
assertEquals("value1", listener.targetMap.get("key1"));
assertEquals("value2", listener.targetMap.get("key2"));
}
@Test
public void testGetStartDate() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_TIME_FILTER_METHOD, BinningOp.TimeFilterMethod.NONE);
assertNull(binningFormModel.getStartDateTime());
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_TIME_FILTER_METHOD, BinningOp.TimeFilterMethod.TIME_RANGE);
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_START_DATE_TIME, "2000-01-01");
assertNotNull(binningFormModel.getStartDateTime());
SimpleDateFormat dateFormat = new SimpleDateFormat(BinningOp.DATE_INPUT_PATTERN);
String expectedString = dateFormat.format(new GregorianCalendar(2000, 0, 1).getTime());
assertEquals(expectedString, binningFormModel.getStartDateTime());
}
@Test
public void testGetValidExpression() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
assertTrue(Boolean.parseBoolean(binningFormModel.getMaskExpr()));
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_MASK_EXPR, "some_expression");
assertEquals("some_expression", binningFormModel.getMaskExpr());
}
@Test
public void testGetSuperSampling() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
assertEquals(1, binningFormModel.getSuperSampling());
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_SUPERSAMPLING, 10);
assertEquals(10, binningFormModel.getSuperSampling());
}
@Test
public void testGetNumRows() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
assertEquals(2160, binningFormModel.getNumRows());
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_NUM_ROWS, 2000);
assertEquals(2000, binningFormModel.getNumRows());
}
@Test(expected = IllegalStateException.class)
public void testGetRegion_Fail() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
binningFormModel.getRegion();
}
@Test
public void testGetRegion_Global() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_GLOBAL, true);
assertEquals("POLYGON ((-180 -90, 180 -90, 180 90, -180 90, -180 -90))", binningFormModel.getRegion().toText());
}
@Test
public void testGetRegion_Compute() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_COMPUTE_REGION, true);
assertNull(binningFormModel.getRegion());
}
@Test
public void testGetRegion_WithSpecifiedRegion() throws Exception {
final BinningFormModel binningFormModel = new BinningFormModel();
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_BOUNDS, true);
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_NORTH_BOUND, 50.0);
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_EAST_BOUND, 15.0);
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_WEST_BOUND, 10.0);
binningFormModel.setProperty(BinningFormModel.PROPERTY_KEY_SOUTH_BOUND, 40.0);
assertEquals("POLYGON ((10 40, 10 50, 15 50, 15 40, 10 40))", binningFormModel.getRegion().toText());
}
private Property createProperty(String propertyName, Class<?> type) {
return new Property(new PropertyDescriptor(propertyName, type), new DefaultPropertyAccessor());
}
private static class MyPropertyChangeListener implements PropertyChangeListener {
Map<String, Object> targetMap = new HashMap<>();
@Override
public void propertyChange(PropertyChangeEvent evt) {
targetMap.put(evt.getPropertyName(), evt.getNewValue());
}
}
}