package org.esa.snap.rcp.statistics;
import org.esa.snap.core.datamodel.Band;
import org.esa.snap.core.datamodel.Product;
import org.esa.snap.core.datamodel.TransectProfileData;
import org.esa.snap.core.datamodel.TransectProfileDataBuilder;
import org.esa.snap.core.datamodel.VectorDataNode;
import org.geotools.feature.DefaultFeatureCollection;
import org.geotools.feature.simple.SimpleFeatureImpl;
import org.geotools.feature.simple.SimpleFeatureTypeBuilder;
import org.geotools.filter.identity.FeatureIdImpl;
import org.junit.Before;
import org.junit.Test;
import org.opengis.feature.simple.SimpleFeatureType;
import javax.swing.table.TableModel;
import java.awt.geom.Path2D;
import static org.junit.Assert.*;
/**
* @author Norman Fomferra
*/
public class ProfileDataTableModelTest {
private Product product;
private Band band;
private Path2D path;
private ProfilePlotPanel.DataSourceConfig dataSourceConfig;
@Before
public void setUp() throws Exception {
// Draw a "Z"
path = new Path2D.Double();
path.moveTo(0, 0);
path.lineTo(3, 0);
path.lineTo(0, 3);
path.lineTo(3, 3);
product = new Product("p", "t", 4, 4);
band = product.addBand("b", "4 * (Y-0.5) + (X-0.5) + 0.1");
dataSourceConfig = new ProfilePlotPanel.DataSourceConfig();
SimpleFeatureTypeBuilder ftb = new SimpleFeatureTypeBuilder();
ftb.setName("ft");
ftb.add("lat", Double.class);
ftb.add("lon", Double.class);
ftb.add("data", Double.class);
SimpleFeatureType ft = ftb.buildFeatureType();
DefaultFeatureCollection fc = new DefaultFeatureCollection("id", ft);
fc.add(new SimpleFeatureImpl(new Object[]{0, 0, 0.3}, ft, new FeatureIdImpl("id1"), false));
fc.add(new SimpleFeatureImpl(new Object[]{0, 0, 0.5}, ft, new FeatureIdImpl("id2"), false));
fc.add(new SimpleFeatureImpl(new Object[]{0, 0, 0.7}, ft, new FeatureIdImpl("id3"), false));
fc.add(new SimpleFeatureImpl(new Object[]{0, 0, 0.1}, ft, new FeatureIdImpl("id4"), false));
dataSourceConfig.pointDataSource = new VectorDataNode("vd", fc);
dataSourceConfig.dataField = ft.getDescriptor("data");
dataSourceConfig.boxSize = 1;
dataSourceConfig.computeInBetweenPoints = true;
}
@Test
public void testModelWithCorrData() throws Exception {
TransectProfileData profileData = new TransectProfileDataBuilder()
.raster(band)
.path(path)
.boxSize(dataSourceConfig.boxSize)
.build();
TableModel tableModel = new ProfileDataTableModel(band.getName(), profileData, dataSourceConfig);
assertEquals(10, tableModel.getColumnCount());
assertEquals("pixel_no", tableModel.getColumnName(0));
assertEquals("pixel_x", tableModel.getColumnName(1));
assertEquals("pixel_y", tableModel.getColumnName(2));
assertEquals("latitude", tableModel.getColumnName(3));
assertEquals("longitude", tableModel.getColumnName(4));
assertEquals("b_mean", tableModel.getColumnName(5));
assertEquals("b_sigma", tableModel.getColumnName(6));
assertEquals("data_ref", tableModel.getColumnName(7));
assertEquals("lat_ref", tableModel.getColumnName(8));
assertEquals("lon_ref", tableModel.getColumnName(9));
assertEquals(10, tableModel.getRowCount());
assertEquals(1, tableModel.getValueAt(0, 0));
assertEquals(0.0, tableModel.getValueAt(0, 1));
assertEquals(0.0, tableModel.getValueAt(0, 2));
assertEquals(null, tableModel.getValueAt(0, 3));
assertEquals(null, tableModel.getValueAt(0, 4));
assertEquals(0.1F, tableModel.getValueAt(0, 5));
assertEquals(0.0F, tableModel.getValueAt(0, 6));
assertEquals(0.3, tableModel.getValueAt(0, 7));
assertEquals(0, tableModel.getValueAt(0, 8));
assertEquals(0, tableModel.getValueAt(0, 9));
assertEquals(2, tableModel.getValueAt(1, 0));
assertEquals(1.0, tableModel.getValueAt(1, 1));
assertEquals(0.0, tableModel.getValueAt(1, 2));
assertEquals(null, tableModel.getValueAt(1, 3));
assertEquals(null, tableModel.getValueAt(1, 4));
assertEquals(1.1F, tableModel.getValueAt(1, 5));
assertEquals(0.0F, tableModel.getValueAt(1, 6));
assertEquals(null, tableModel.getValueAt(1, 7));
assertEquals(null, tableModel.getValueAt(1, 8));
assertEquals(null, tableModel.getValueAt(1, 9));
assertEquals(10, tableModel.getValueAt(9, 0));
assertEquals(3.0, tableModel.getValueAt(9, 1));
assertEquals(3.0, tableModel.getValueAt(9, 2));
assertEquals(null, tableModel.getValueAt(9, 3));
assertEquals(null, tableModel.getValueAt(9, 4));
assertEquals(15.1F, tableModel.getValueAt(9, 5));
assertEquals(0.0F, tableModel.getValueAt(9, 6));
assertEquals(0.1, tableModel.getValueAt(9, 7));
assertEquals(0, tableModel.getValueAt(9, 8));
assertEquals(0, tableModel.getValueAt(9, 9));
}
@Test
public void testModelWithoutCorrData() throws Exception {
dataSourceConfig.dataField = null;
dataSourceConfig.boxSize = 1;
TransectProfileData profileData = new TransectProfileDataBuilder()
.raster(band)
.path(path)
.boxSize(dataSourceConfig.boxSize)
.build();
TableModel tableModel = new ProfileDataTableModel(band.getName(), profileData, dataSourceConfig);
assertEquals(8, tableModel.getColumnCount());
assertEquals("pixel_no", tableModel.getColumnName(0));
assertEquals("pixel_x", tableModel.getColumnName(1));
assertEquals("pixel_y", tableModel.getColumnName(2));
assertEquals("latitude", tableModel.getColumnName(3));
assertEquals("longitude", tableModel.getColumnName(4));
assertEquals("b_mean", tableModel.getColumnName(5));
assertEquals("b_sigma", tableModel.getColumnName(6));
assertEquals("", tableModel.getColumnName(7));
assertEquals(10, tableModel.getRowCount());
assertEquals(1, tableModel.getValueAt(0, 0));
assertEquals(0.0, tableModel.getValueAt(0, 1));
assertEquals(0.0, tableModel.getValueAt(0, 2));
assertEquals(null, tableModel.getValueAt(0, 3));
assertEquals(null, tableModel.getValueAt(0, 4));
assertEquals(0.1F, tableModel.getValueAt(0, 5));
assertEquals(0.0F, tableModel.getValueAt(0, 6));
assertEquals(null, tableModel.getValueAt(0, 7));
assertEquals(2, tableModel.getValueAt(1, 0));
assertEquals(1.0, tableModel.getValueAt(1, 1));
assertEquals(0.0, tableModel.getValueAt(1, 2));
assertEquals(null, tableModel.getValueAt(1, 3));
assertEquals(null, tableModel.getValueAt(1, 4));
assertEquals(1.1F, tableModel.getValueAt(1, 5));
assertEquals(0.0F, tableModel.getValueAt(1, 6));
assertEquals(null, tableModel.getValueAt(1, 7));
assertEquals(10, tableModel.getValueAt(9, 0));
assertEquals(3.0, tableModel.getValueAt(9, 1));
assertEquals(3.0, tableModel.getValueAt(9, 2));
assertEquals(null, tableModel.getValueAt(9, 3));
assertEquals(null, tableModel.getValueAt(9, 4));
assertEquals(15.1F, tableModel.getValueAt(9, 5));
assertEquals(0.0F, tableModel.getValueAt(9, 6));
assertEquals(null, tableModel.getValueAt(9, 7));
}
@Test
public void testModelCsv() throws Exception {
TransectProfileData profileData = new TransectProfileDataBuilder()
.raster(band)
.path(path)
.boxSize(dataSourceConfig.boxSize)
.build();
ProfileDataTableModel tableModel = new ProfileDataTableModel(band.getName(), profileData, dataSourceConfig);
String csv = tableModel.toCsv();
assertEquals("pixel_no\tpixel_x\tpixel_y\tlatitude\tlongitude\tb_mean\tb_sigma\tdata_ref\tlat_ref\tlon_ref\n" +
"1\t0.0\t0.0\t\t\t0.1\t0.0\t0.3\t0\t0\n" +
"2\t1.0\t0.0\t\t\t1.1\t0.0\t\t\t\n" +
"3\t2.0\t0.0\t\t\t2.1\t0.0\t\t\t\n" +
"4\t3.0\t0.0\t\t\t3.1\t0.0\t0.5\t0\t0\n" +
"5\t2.0\t1.0\t\t\t6.1\t0.0\t\t\t\n" +
"6\t1.0\t2.0\t\t\t9.1\t0.0\t\t\t\n" +
"7\t0.0\t3.0\t\t\t12.1\t0.0\t0.7\t0\t0\n" +
"8\t1.0\t3.0\t\t\t13.1\t0.0\t\t\t\n" +
"9\t2.0\t3.0\t\t\t14.1\t0.0\t\t\t\n" +
"10\t3.0\t3.0\t\t\t15.1\t0.0\t0.1\t0\t0\n", csv);
}
@Test
public void testModelCsvNoInBetweenPoints() throws Exception {
dataSourceConfig.computeInBetweenPoints = false;
TransectProfileData profileData = new TransectProfileDataBuilder()
.raster(band)
.path(path)
.boxSize(dataSourceConfig.boxSize)
.build();
ProfileDataTableModel tableModel = new ProfileDataTableModel(band.getName(), profileData, dataSourceConfig);
String csv = tableModel.toCsv();
assertEquals("pixel_no\tpixel_x\tpixel_y\tlatitude\tlongitude\tb_mean\tb_sigma\tdata_ref\tlat_ref\tlon_ref\n" +
"1\t0.0\t0.0\t\t\t0.1\t0.0\t0.3\t0\t0\n" +
"4\t3.0\t0.0\t\t\t3.1\t0.0\t0.5\t0\t0\n" +
"7\t0.0\t3.0\t\t\t12.1\t0.0\t0.7\t0\t0\n" +
"10\t3.0\t3.0\t\t\t15.1\t0.0\t0.1\t0\t0\n", csv);
}
}