package org.esa.beam.smos.ee2netcdf;
import org.esa.beam.framework.datamodel.MetadataAttribute;
import org.esa.beam.framework.datamodel.MetadataElement;
import org.esa.beam.framework.datamodel.ProductData;
import org.esa.beam.smos.ee2netcdf.variable.VariableDescriptor;
import org.junit.Before;
import org.junit.Test;
import ucar.ma2.DataType;
import java.util.Properties;
import static org.junit.Assert.*;
public class AbstractFormatExporterTest {
private MetadataElement metadataRoot;
@Before
public void setUp() {
metadataRoot = new MetadataElement("root");
}
@Test
public void testExtractMetadata_noMetadata() {
final Properties metaProperties = AbstractFormatExporter.extractMetadata(metadataRoot);
assertNotNull(metaProperties);
assertEquals(0, metaProperties.size());
}
@Test
public void testExtractMetadata_firstLevel() {
metadataRoot.addAttribute(new MetadataAttribute("attribute_1", ProductData.ASCII.createInstance("hoppla_1"), true));
metadataRoot.addAttribute(new MetadataAttribute("attribute_2", ProductData.ASCII.createInstance("hoppla_2"), true));
final Properties properties = AbstractFormatExporter.extractMetadata(metadataRoot);
assertEquals(2, properties.size());
assertEquals("hoppla_1", properties.getProperty("attribute_1"));
}
@Test
public void testExtractMetadata_secondLevel() {
final MetadataElement secondary = new MetadataElement("secondary");
secondary.addAttribute(new MetadataAttribute("attribute_1", ProductData.ASCII.createInstance("hoppla_1"), true));
secondary.addAttribute(new MetadataAttribute("attribute_2", ProductData.ASCII.createInstance("hoppla_2"), true));
metadataRoot.addElement(secondary);
final Properties properties = AbstractFormatExporter.extractMetadata(metadataRoot);
assertEquals(2, properties.size());
assertEquals("hoppla_2", properties.getProperty("secondary:attribute_2"));
}
@Test
public void testExtractMetadata_thirdLevel() {
final MetadataElement secondary = new MetadataElement("secondary");
final MetadataElement third = new MetadataElement("third");
third.addAttribute(new MetadataAttribute("attribute_1", ProductData.ASCII.createInstance("hoppla_1"), true));
third.addAttribute(new MetadataAttribute("attribute_2", ProductData.ASCII.createInstance("hoppla_2"), true));
secondary.addElement(third);
metadataRoot.addElement(secondary);
final Properties properties = AbstractFormatExporter.extractMetadata(metadataRoot);
assertEquals(2, properties.size());
assertEquals("hoppla_1", properties.getProperty("secondary:third:attribute_1"));
}
@Test
public void testExtractMetadata_mixedLevel() {
final MetadataElement secondary = new MetadataElement("secondary");
final MetadataElement third = new MetadataElement("third");
third.addAttribute(new MetadataAttribute("att_3_1", ProductData.ASCII.createInstance("yeah_3"), true));
third.addAttribute(new MetadataAttribute("att_3_2", ProductData.ASCII.createInstance("yeah_4"), true));
secondary.addElement(third);
secondary.addAttribute(new MetadataAttribute("att_2", ProductData.ASCII.createInstance("yeah_5"), true));
metadataRoot.addElement(secondary);
metadataRoot.addAttribute(new MetadataAttribute("root_1", ProductData.ASCII.createInstance("yeah_6"), true));
metadataRoot.addAttribute(new MetadataAttribute("root_2", ProductData.ASCII.createInstance("yeah_7"), true));
final Properties properties = AbstractFormatExporter.extractMetadata(metadataRoot);
assertEquals(5, properties.size());
assertEquals("yeah_3", properties.getProperty("secondary:third:att_3_1"));
assertEquals("yeah_4", properties.getProperty("secondary:third:att_3_2"));
assertEquals("yeah_5", properties.getProperty("secondary:att_2"));
assertEquals("yeah_6", properties.getProperty("root_1"));
assertEquals("yeah_7", properties.getProperty("root_2"));
}
@Test
public void testExtractMetadata_withDuplicateNamedElements() {
final MetadataElement secondary = new MetadataElement("secondary");
final MetadataElement third_1 = new MetadataElement("third");
third_1.addAttribute(new MetadataAttribute("att_3_1", ProductData.ASCII.createInstance("Wilhelm"), true));
final MetadataElement third_2 = new MetadataElement("third");
third_2.addAttribute(new MetadataAttribute("att_3_1", ProductData.ASCII.createInstance("Busch"), true));
secondary.addElement(third_1);
secondary.addElement(third_2);
metadataRoot.addElement(secondary);
final Properties properties = AbstractFormatExporter.extractMetadata(metadataRoot);
assertEquals(2, properties.size());
assertEquals("Wilhelm", properties.getProperty("secondary:third_0:att_3_1"));
assertEquals("Busch", properties.getProperty("secondary:third_1:att_3_1"));
}
@Test
public void testSetDataType_noTypeNameSet() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
try {
AbstractFormatExporter.setDataType(variableDescriptor, "");
fail("IllegalStateException expected");
} catch (IllegalStateException expected) {
}
try {
AbstractFormatExporter.setDataType(variableDescriptor, null);
fail("IllegalStateException expected");
} catch (IllegalStateException expected) {
}
}
@Test
public void testSetDataType_unsupportedType() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
try {
AbstractFormatExporter.setDataType(variableDescriptor, "ArrayOfWordDocuments");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
}
}
@Test
public void testSetDataType_Uint() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
AbstractFormatExporter.setDataType(variableDescriptor, "uint");
assertEquals(DataType.INT, variableDescriptor.getDataType());
assertTrue(variableDescriptor.isUnsigned());
}
@Test
public void testSetDataType_Int() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
AbstractFormatExporter.setDataType(variableDescriptor, "int");
assertEquals(DataType.INT, variableDescriptor.getDataType());
assertFalse(variableDescriptor.isUnsigned());
}
@Test
public void testSetDataType_Float() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
AbstractFormatExporter.setDataType(variableDescriptor, "float");
assertEquals(DataType.FLOAT, variableDescriptor.getDataType());
assertFalse(variableDescriptor.isUnsigned());
}
@Test
public void testSetDataType_UByte() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
AbstractFormatExporter.setDataType(variableDescriptor, "ubyte");
assertEquals(DataType.BYTE, variableDescriptor.getDataType());
assertTrue(variableDescriptor.isUnsigned());
}
@Test
public void testSetDataType_UShort() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
AbstractFormatExporter.setDataType(variableDescriptor, "ushort");
assertEquals(DataType.SHORT, variableDescriptor.getDataType());
assertTrue(variableDescriptor.isUnsigned());
}
@Test
public void testSetDataType_Short() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
AbstractFormatExporter.setDataType(variableDescriptor, "short");
assertEquals(DataType.SHORT, variableDescriptor.getDataType());
assertFalse(variableDescriptor.isUnsigned());
}
@Test
public void testSetDataType_ULong() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
AbstractFormatExporter.setDataType(variableDescriptor, "ulong");
assertEquals(DataType.LONG, variableDescriptor.getDataType());
assertTrue(variableDescriptor.isUnsigned());
}
@Test
public void testSetDataType_Double() {
final VariableDescriptor variableDescriptor = new VariableDescriptor();
AbstractFormatExporter.setDataType(variableDescriptor, "double");
assertEquals(DataType.DOUBLE, variableDescriptor.getDataType());
assertFalse(variableDescriptor.isUnsigned());
}
@Test
public void testGetNumDimensions() {
assertEquals(1, AbstractFormatExporter.getNumDimensions("onedimensional"));
assertEquals(2, AbstractFormatExporter.getNumDimensions("two dims"));
}
@Test
public void testGetNumDimensions_emptyArgument() {
try {
AbstractFormatExporter.getNumDimensions("");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
}
try {
AbstractFormatExporter.getNumDimensions(null);
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
}
}
@Test
public void testEnsureNetCDFName() {
assertEquals("bla_bla_bla", AbstractFormatExporter.ensureNetCDFName("bla_bla_bla"));
assertEquals("bla_bla_bla", AbstractFormatExporter.ensureNetCDFName("bla.bla.bla"));
}
@Test
public void testMustExport_emptyArray() {
final String[] subsetNames = new String[0];
assertTrue(AbstractFormatExporter.mustExport("whatever", subsetNames));
assertTrue(AbstractFormatExporter.mustExport("we_dont_care", subsetNames));
}
@Test
public void testMustExport_nameContainedInSubsetNames() {
final String[] subsetNames = new String[]{"to_subset", "this_one_too", "this_also"};
assertTrue(AbstractFormatExporter.mustExport("this_one_too", subsetNames));
assertTrue(AbstractFormatExporter.mustExport("THIS_also", subsetNames));
}
@Test
public void testMustExport_nameNotContainedInSubsetNames() {
final String[] subsetNames = new String[]{"to_subset", "this_one_too", "this_also"};
assertFalse(AbstractFormatExporter.mustExport("BT_Value", subsetNames));
assertFalse(AbstractFormatExporter.mustExport("I_WANT_THIS", subsetNames));
}
}