package org.esa.snap.opendap.utils; import opendap.dap.DAP2Exception; import opendap.dap.DArrayDimension; import opendap.dap.DDS; import opendap.dap.parsers.ParseException; import org.esa.snap.opendap.datamodel.DAPVariable; import org.esa.snap.opendap.datamodel.OpendapLeaf; import org.junit.Test; import thredds.catalog.InvDataset; import java.io.ByteArrayInputStream; import static org.junit.Assert.*; public class VariableExtractorTest { @Test public void testThatNoVariableCanBeExtractedFromEmptyDDS() { OpendapLeaf leaf = new OpendapLeaf("empty", new InvDataset(null, "") { }); final DAPVariable[] dapVariables = new VariableExtractor().extractVariables(leaf); assertEquals(0, dapVariables.length); } @Test public void testThatAVariableCanBeExtractedFromADDSWithOneVariable() throws DAP2Exception, ParseException { DDS dds = createDDSWithOneVariable(); final DAPVariable[] dapVariables = new VariableExtractor().extractVariables(dds); assertEquals(1, dapVariables.length); assertEquals("Chlorophyll", dapVariables[0].getName()); assertEquals("Grid", dapVariables[0].getType()); assertEquals("Float32", dapVariables[0].getDataType()); assertEquals(2, dapVariables[0].getNumDimensions()); final DArrayDimension[] dimensions = dapVariables[0].getDimensions(); assertEquals("Y", dimensions[0].getEncodedName()); assertEquals(849, dimensions[0].getSize()); assertEquals("X", dimensions[1].getEncodedName()); assertEquals(1121, dimensions[1].getSize()); } @Test public void testThatByteVariableCanBeRead() throws DAP2Exception, ParseException { DDS dds = createDDSWithByteVariable(); final DAPVariable[] dapVariables = new VariableExtractor().extractVariables(dds); assertEquals(1, dapVariables.length); assertEquals("metadata", dapVariables[0].getName()); assertEquals("atomic", dapVariables[0].getType()); assertEquals("Byte", dapVariables[0].getDataType()); assertEquals(0, dapVariables[0].getNumDimensions()); } @Test public void testThatFloatVariableCanBeRead() throws DAP2Exception, ParseException { DDS dds = createDDSWithFloatVariable(); final DAPVariable[] dapVariables = new VariableExtractor().extractVariables(dds); assertEquals(1, dapVariables.length); assertEquals("metadata", dapVariables[0].getName()); assertEquals("atomic", dapVariables[0].getType()); assertEquals("Float32", dapVariables[0].getDataType()); assertEquals(0, dapVariables[0].getNumDimensions()); } @Test public void testThatMultipleVariablesCanBeExtractedFromADDSWithMultipleVariables() throws DAP2Exception, ParseException { DDS dds = createDDSWithMultipleVariables(); final DAPVariable[] dapVariables = new VariableExtractor().extractVariables(dds); assertEquals(6, dapVariables.length); assertEquals("Chlorophyll", dapVariables[0].getName()); assertEquals("Total_suspended_matter", dapVariables[1].getName()); assertEquals("Yellow_substance", dapVariables[2].getName()); assertEquals("l2_flags", dapVariables[3].getName()); assertEquals("X", dapVariables[4].getName()); assertEquals("Y", dapVariables[5].getName()); } private DDS createDDSWithByteVariable() throws DAP2Exception, ParseException { DDS dds = new DDS(); String ddsString = "Dataset {\n" + " Byte metadata;\n" + "} coastcolour%2ftasmania24948_0001%2enc;"; dds.parse(new ByteArrayInputStream(ddsString.getBytes())); return dds; } private DDS createDDSWithFloatVariable() throws DAP2Exception, ParseException { DDS dds = new DDS(); String ddsString = "Dataset {\n" + " Float32 metadata;\n" + "} coastcolour%2ftasmania24948_0001%2enc;"; dds.parse(new ByteArrayInputStream(ddsString.getBytes())); return dds; } private DDS createDDSWithOneVariable() throws DAP2Exception, ParseException { DDS dds = new DDS(); String ddsString = "Dataset {\n" + " Grid {\n" + " Array:\n" + " Float32 Chlorophyll[Y = 849][X = 1121];\n" + " Maps:\n" + " Int32 Y[Y = 849];\n" + " Int32 X[X = 1121];\n" + " } Chlorophyll;\n" + "} MER_RR__2PNKOF20120113_101320_000001493110_00324_51631_6150.N1.nc;"; dds.parse(new ByteArrayInputStream(ddsString.getBytes())); return dds; } private DDS createDDSWithMultipleVariables() throws DAP2Exception, ParseException { DDS dds = new DDS(); String ddsString = "Dataset {\n" + " Grid {\n" + " Array:\n" + " Float32 Chlorophyll[Y = 849][X = 1121];\n" + " Maps:\n" + " Int32 Y[Y = 849];\n" + " Int32 X[X = 1121];\n" + " } Chlorophyll;\n" + " Grid {\n" + " Array:\n" + " Float32 Total_suspended_matter[Y = 849][X = 1121];\n" + " Maps:\n" + " Int32 Y[Y = 849];\n" + " Int32 X[X = 1121];\n" + " } Total_suspended_matter;\n" + " Grid {\n" + " Array:\n" + " Float32 Yellow_substance[Y = 849][X = 1121];\n" + " Maps:\n" + " Int32 Y[Y = 849];\n" + " Int32 X[X = 1121];\n" + " } Yellow_substance;\n" + " Grid {\n" + " Array:\n" + " Int32 l2_flags[Y = 849][X = 1121];\n" + " Maps:\n" + " Int32 Y[Y = 849];\n" + " Int32 X[X = 1121];\n" + " } l2_flags;\n" + " Int32 X[X = 1121];\n" + " Int32 Y[Y = 849];\n" + "} MER_RR__2PNKOF20120113_101320_000001493110_00324_51631_6150.N1.nc;"; dds.parse(new ByteArrayInputStream(ddsString.getBytes())); return dds; } }