/*
* Geotoolkit.org - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2009-2012, Open Source Geospatial Foundation (OSGeo)
* (C) 2009-2012, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library 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
* Lesser General Public License for more details.
*/
package org.geotoolkit.image.io.metadata;
import java.util.Arrays;
import java.util.Locale;
import java.io.Writer;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import javax.imageio.metadata.IIOMetadataFormat;
import org.opengis.metadata.Identifier;
import org.opengis.metadata.identification.Keywords;
import org.opengis.metadata.identification.Resolution;
import org.opengis.metadata.identification.DataIdentification;
import org.opengis.metadata.extent.Extent;
import org.opengis.metadata.extent.VerticalExtent;
import org.opengis.metadata.extent.GeographicBoundingBox;
import org.opengis.metadata.acquisition.AcquisitionInformation;
import org.opengis.metadata.acquisition.EnvironmentalRecord;
import org.opengis.metadata.content.ImageDescription;
import org.opengis.metadata.content.RangeElementDescription;
import org.opengis.metadata.spatial.Georectified;
import org.opengis.coverage.grid.GridEnvelope;
import org.opengis.coverage.grid.RectifiedGrid;
import org.opengis.parameter.ParameterValue;
import org.opengis.parameter.ParameterValueGroup;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.cs.CoordinateSystem;
import org.opengis.referencing.cs.CoordinateSystemAxis;
import org.opengis.referencing.datum.Datum;
import org.opengis.referencing.datum.Ellipsoid;
import org.opengis.referencing.datum.PrimeMeridian;
import org.opengis.referencing.operation.Conversion;
import org.apache.sis.referencing.CommonCRS;
import org.junit.*;
import static org.junit.Assert.*;
import static javax.imageio.metadata.IIOMetadataFormat.*;
import static org.geotoolkit.image.io.metadata.SpatialMetadataFormat.ISO_FORMAT_NAME;
import static org.geotoolkit.image.io.metadata.SpatialMetadataFormat.GEOTK_FORMAT_NAME;
/**
* Tests {@link SpatialMetadataFormat}.
*
* @author Martin Desruisseaux (Geomatys)
* @version 3.07
*
* @since 3.04
*/
public final strictfp class SpatialMetadataFormatTest extends org.geotoolkit.test.TestBase {
/**
* Tests the elements in the stream metadata format instance.
*
* @since 3.06
*/
@Test
public void testStreamMetadataFormat() {
final IIOMetadataFormat f = SpatialMetadataFormat.getStreamInstance(GEOTK_FORMAT_NAME);
assertEquals(DataIdentification.class, f.getObjectClass ("DiscoveryMetadata"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("DiscoveryMetadata"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DiscoveryMetadata", "citation"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("DiscoveryMetadata", "citation"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DiscoveryMetadata", "abstract"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("DiscoveryMetadata", "abstract"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DiscoveryMetadata", "purpose"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("DiscoveryMetadata", "purpose"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DiscoveryMetadata", "credits"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("DiscoveryMetadata", "credits"));
assertEquals(0, f.getAttributeListMinLength("DiscoveryMetadata", "credits"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("DiscoveryMetadata", "credits"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DiscoveryMetadata", "status"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("DiscoveryMetadata", "status"));
assertIsEnum("planned", f.getAttributeEnumerations ("DiscoveryMetadata", "status"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DiscoveryMetadata", "topicCategories"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("DiscoveryMetadata", "topicCategories"));
assertIsEnum("environment", f.getAttributeEnumerations ("DiscoveryMetadata", "topicCategories"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DiscoveryMetadata", "environmentDescription"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("DiscoveryMetadata", "environmentDescription"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DiscoveryMetadata", "supplementalInformation"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("DiscoveryMetadata", "supplementalInformation"));
assertEquals(CHILD_POLICY_REPEAT, f.getChildPolicy ("DescriptiveKeywords"));
assertEquals(Keywords.class, f.getObjectClass ("DescriptiveKeywordsEntry"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DescriptiveKeywordsEntry", "keywords"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("DescriptiveKeywordsEntry", "keywords"));
assertEquals(1, f.getAttributeListMinLength("DescriptiveKeywordsEntry", "keywords"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("DescriptiveKeywordsEntry", "keywords"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DescriptiveKeywordsEntry", "thesaurusName"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("DescriptiveKeywordsEntry", "thesaurusName"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("DescriptiveKeywordsEntry", "type"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("DescriptiveKeywordsEntry", "type"));
assertIsEnum("place", f.getAttributeEnumerations ("DescriptiveKeywordsEntry", "type"));
assertEquals(Resolution.class, f.getObjectClass ("SpatialResolution"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("SpatialResolution"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("SpatialResolution", "distance"));
assertEquals(VALUE_RANGE, f.getAttributeValueType ("SpatialResolution", "distance"));
assertEquals("0.0", f.getAttributeMinValue ("SpatialResolution", "distance"));
assertNull ( f.getAttributeMaxValue ("SpatialResolution", "distance"));
assertEquals(Extent.class, f.getObjectClass ("Extent"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("Extent"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Extent", "description"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Extent", "description"));
assertEquals(GeographicBoundingBox.class, f.getObjectClass ("GeographicElement"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("GeographicElement"));
assertEquals(DATATYPE_BOOLEAN, f.getAttributeDataType ("GeographicElement", "inclusion"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("GeographicElement", "inclusion"));
assertIsEnum("TRUE", f.getAttributeEnumerations ("GeographicElement", "inclusion"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("GeographicElement", "westBoundLongitude"));
assertEquals(VALUE_RANGE_MIN_MAX_INCLUSIVE, f.getAttributeValueType ("GeographicElement", "westBoundLongitude"));
assertEquals("-180.0", f.getAttributeMinValue ("GeographicElement", "westBoundLongitude"));
assertEquals("180.0", f.getAttributeMaxValue ("GeographicElement", "westBoundLongitude"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("GeographicElement", "eastBoundLongitude"));
assertEquals(VALUE_RANGE_MIN_MAX_INCLUSIVE, f.getAttributeValueType ("GeographicElement", "eastBoundLongitude"));
assertEquals("-180.0", f.getAttributeMinValue ("GeographicElement", "eastBoundLongitude"));
assertEquals("180.0", f.getAttributeMaxValue ("GeographicElement", "eastBoundLongitude"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("GeographicElement", "southBoundLatitude"));
assertEquals(VALUE_RANGE_MIN_MAX_INCLUSIVE, f.getAttributeValueType ("GeographicElement", "southBoundLatitude"));
assertEquals("-90.0", f.getAttributeMinValue ("GeographicElement", "southBoundLatitude"));
assertEquals("90.0", f.getAttributeMaxValue ("GeographicElement", "southBoundLatitude"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("GeographicElement", "northBoundLatitude"));
assertEquals(VALUE_RANGE_MIN_MAX_INCLUSIVE, f.getAttributeValueType ("GeographicElement", "northBoundLatitude"));
assertEquals("-90.0", f.getAttributeMinValue ("GeographicElement", "northBoundLatitude"));
assertEquals("90.0", f.getAttributeMaxValue ("GeographicElement", "northBoundLatitude"));
assertEquals(VerticalExtent.class, f.getObjectClass ("VerticalElement"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("VerticalElement"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("VerticalElement", "minimumValue"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("VerticalElement", "minimumValue"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("VerticalElement", "maximumValue"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("VerticalElement", "maximumValue"));
assertEquals(AcquisitionInformation.class, f.getObjectClass ("AcquisitionMetadata"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("AcquisitionMetadata"));
assertEquals(EnvironmentalRecord.class, f.getObjectClass ("EnvironmentalConditions"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("EnvironmentalConditions"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("EnvironmentalConditions", "averageAirTemperature"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("EnvironmentalConditions", "averageAirTemperature"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("EnvironmentalConditions", "maxRelativeHumidity"));
assertEquals(VALUE_RANGE_MIN_MAX_INCLUSIVE, f.getAttributeValueType ("EnvironmentalConditions", "maxRelativeHumidity"));
assertEquals("0.0", f.getAttributeMinValue ("EnvironmentalConditions", "maxRelativeHumidity"));
assertEquals("100.0", f.getAttributeMaxValue ("EnvironmentalConditions", "maxRelativeHumidity"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("EnvironmentalConditions", "maxAltitude"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("EnvironmentalConditions", "maxAltitude"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("EnvironmentalConditions", "meteorologicalConditions"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("EnvironmentalConditions", "meteorologicalConditions"));
}
/**
* Tests the elements in the image metadata format instance.
*/
@Test
public void testImageMetadataFormat() {
final IIOMetadataFormat f = SpatialMetadataFormat.getImageInstance(GEOTK_FORMAT_NAME);
assertEquals(ImageDescription.class, f.getObjectClass ("ImageDescription"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("ImageDescription"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("ImageDescription", "contentType"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("ImageDescription", "contentType"));
assertIsEnum("physicalMeasurement", f.getAttributeEnumerations ("ImageDescription", "contentType"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("ImageDescription", "illuminationElevationAngle"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("ImageDescription", "illuminationAzimuthAngle"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("ImageDescription", "imagingCondition"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("ImageDescription", "imagingCondition"));
assertIsEnum("cloud", f.getAttributeEnumerations ("ImageDescription", "imagingCondition"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("ImageDescription", "cloudCoverPercentage"));
assertEquals(VALUE_RANGE_MIN_MAX_INCLUSIVE, f.getAttributeValueType ("ImageDescription", "cloudCoverPercentage"));
assertEquals("0.0", f.getAttributeMinValue ("ImageDescription", "cloudCoverPercentage"));
assertEquals("100.0", f.getAttributeMaxValue ("ImageDescription", "cloudCoverPercentage"));
assertEquals(DATATYPE_BOOLEAN, f.getAttributeDataType ("ImageDescription", "radiometricCalibrationDataAvailable"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("ImageDescription", "radiometricCalibrationDataAvailable"));
assertIsEnum("TRUE", f.getAttributeEnumerations ("ImageDescription", "radiometricCalibrationDataAvailable"));
assertEquals(DATATYPE_BOOLEAN, f.getAttributeDataType ("ImageDescription", "cameraCalibrationInformationAvailable"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("ImageDescription", "cameraCalibrationInformationAvailable"));
assertIsEnum("TRUE", f.getAttributeEnumerations ("ImageDescription", "cameraCalibrationInformationAvailable"));
assertEquals(DATATYPE_BOOLEAN, f.getAttributeDataType ("ImageDescription", "filmDistortionInformationAvailable"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("ImageDescription", "filmDistortionInformationAvailable"));
assertIsEnum("TRUE", f.getAttributeEnumerations ("ImageDescription", "filmDistortionInformationAvailable"));
assertEquals(DATATYPE_BOOLEAN, f.getAttributeDataType ("ImageDescription", "lensDistortionInformationAvailable"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("ImageDescription", "lensDistortionInformationAvailable"));
assertIsEnum("TRUE", f.getAttributeEnumerations ("ImageDescription", "lensDistortionInformationAvailable"));
assertEquals(Identifier.class, f.getObjectClass ("ImageQualityCode"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("ImageQualityCode", "code"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("ImageQualityCode", "code"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("ImageQualityCode", "authority"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("ImageQualityCode", "authority"));
assertEquals(Identifier.class, f.getObjectClass ("ProcessingLevelCode"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("ProcessingLevelCode", "code"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("ProcessingLevelCode", "code"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("ProcessingLevelCode", "authority"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("ProcessingLevelCode", "authority"));
assertEquals(CHILD_POLICY_REPEAT, f.getChildPolicy ("Dimensions"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("Dimension"));
assertEquals(SampleDimension.class, f.getObjectClass ("Dimension"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Dimension", "descriptor"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Dimension", "descriptor"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Dimension", "sequenceIdentifier"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Dimension", "sequenceIdentifier"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Dimension", "minValue"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Dimension", "minValue"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Dimension", "maxValue"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Dimension", "maxValue"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Dimension", "fillSampleValues"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("Dimension", "fillSampleValues"));
assertEquals(0, f.getAttributeListMinLength("Dimension", "fillSampleValues"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("Dimension", "fillSampleValues"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Dimension", "units"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Dimension", "units"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Dimension", "peakResponse"));
assertEquals(VALUE_RANGE_MIN_INCLUSIVE, f.getAttributeValueType ("Dimension", "peakResponse"));
assertEquals(DATATYPE_INTEGER, f.getAttributeDataType ("Dimension", "bitsPerValue"));
assertEquals(VALUE_RANGE_MIN_INCLUSIVE, f.getAttributeValueType ("Dimension", "bitsPerValue"));
assertEquals("1", f.getAttributeMinValue ("Dimension", "bitsPerValue"));
assertNull ( f.getAttributeMaxValue ("Dimension", "bitsPerValue"));
assertEquals(DATATYPE_INTEGER, f.getAttributeDataType ("Dimension", "toneGradation"));
assertEquals(VALUE_RANGE_MIN_INCLUSIVE, f.getAttributeValueType ("Dimension", "toneGradation"));
assertEquals("0", f.getAttributeMinValue ("Dimension", "toneGradation"));
assertNull ( f.getAttributeMaxValue ("Dimension", "toneGradation"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Dimension", "minValue"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Dimension", "minValue"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Dimension", "scaleFactor"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Dimension", "scaleFactor"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Dimension", "offset"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Dimension", "offset"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Dimension", "bandBoundaryDefinition"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("Dimension", "bandBoundaryDefinition"));
assertIsEnum("fiftyPercent", f.getAttributeEnumerations ("Dimension", "bandBoundaryDefinition"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Dimension", "nominalSpatialResolution"));
assertEquals(VALUE_RANGE, f.getAttributeValueType ("Dimension", "nominalSpatialResolution"));
assertEquals("0.0", f.getAttributeMinValue ("Dimension", "nominalSpatialResolution"));
assertNull ( f.getAttributeMaxValue ("Dimension", "nominalSpatialResolution"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Dimension", "transferFunctionType"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("Dimension", "transferFunctionType"));
assertIsEnum("logarithmic", f.getAttributeEnumerations ("Dimension", "transferFunctionType"));
assertEquals(CHILD_POLICY_REPEAT, f.getChildPolicy ("RangeElementDescriptions"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("RangeElementDescription"));
assertEquals(RangeElementDescription.class, f.getObjectClass ("RangeElementDescription"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("RangeElementDescription", "name"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("RangeElementDescription", "name"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("RangeElementDescription", "definition"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("RangeElementDescription", "definition"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("RangeElementDescription", "rangeElements"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("RangeElementDescription", "rangeElements"));
assertEquals(1, f.getAttributeListMinLength("RangeElementDescription", "rangeElements"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("RangeElementDescription", "rangeElements"));
assertEquals(Georectified.class, f.getObjectClass ("SpatialRepresentation"));
assertEquals(DATATYPE_INTEGER, f.getAttributeDataType ("SpatialRepresentation", "numberOfDimensions"));
assertEquals(VALUE_RANGE_MIN_INCLUSIVE, f.getAttributeValueType ("SpatialRepresentation", "numberOfDimensions"));
assertEquals("0", f.getAttributeMinValue ("SpatialRepresentation", "numberOfDimensions"));
assertNull ( f.getAttributeMaxValue ("SpatialRepresentation", "numberOfDimensions"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("SpatialRepresentation", "cellGeometry"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("SpatialRepresentation", "cellGeometry"));
assertIsEnum("area", f.getAttributeEnumerations ("SpatialRepresentation", "cellGeometry"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("SpatialRepresentation", "pointInPixel"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("SpatialRepresentation", "pointInPixel"));
assertIsEnum("upperLeft", f.getAttributeEnumerations ("SpatialRepresentation", "pointInPixel"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("SpatialRepresentation", "centerPoint"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("SpatialRepresentation", "centerPoint"));
assertEquals(0, f.getAttributeListMinLength("SpatialRepresentation", "centerPoint"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("SpatialRepresentation", "centerPoint"));
assertEquals(RectifiedGrid.class, f.getObjectClass ("RectifiedGridDomain"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("RectifiedGridDomain", "origin"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("RectifiedGridDomain", "origin"));
assertEquals(1, f.getAttributeListMinLength("RectifiedGridDomain", "origin"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("RectifiedGridDomain", "origin"));
assertEquals(GridEnvelope.class, f.getObjectClass ("Limits"));
assertEquals(DATATYPE_INTEGER, f.getAttributeDataType ("Limits", "low"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("Limits", "low"));
assertEquals(1, f.getAttributeListMinLength("Limits", "low"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("Limits", "low"));
assertEquals(DATATYPE_INTEGER, f.getAttributeDataType ("Limits", "high"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("Limits", "high"));
assertEquals(1, f.getAttributeListMinLength("Limits", "high"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("Limits", "high"));
assertEquals(CHILD_POLICY_REPEAT, f.getChildPolicy ("OffsetVectors"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("OffsetVector"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("OffsetVector", "values"));
assertEquals(VALUE_LIST, f.getAttributeValueType ("OffsetVector", "values"));
assertEquals(1, f.getAttributeListMinLength("OffsetVector", "values"));
assertEquals(Integer.MAX_VALUE, f.getAttributeListMaxLength("OffsetVector", "values"));
assertEquals(CoordinateReferenceSystem.class, f.getObjectClass ("CoordinateReferenceSystem"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("CoordinateReferenceSystem"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("CoordinateReferenceSystem", "name"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("CoordinateReferenceSystem", "name"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("CoordinateReferenceSystem", "type"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("CoordinateReferenceSystem", "type"));
assertEquals(CoordinateSystem.class, f.getObjectClass ("CoordinateSystem"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("CoordinateSystem"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("CoordinateSystem", "name"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("CoordinateSystem", "name"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("CoordinateSystem", "type"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("CoordinateSystem", "type"));
assertEquals(CHILD_POLICY_REPEAT, f.getChildPolicy ("Axes"));
assertEquals(CoordinateSystemAxis.class, f.getObjectClass ("CoordinateSystemAxis"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("CoordinateSystemAxis"));
assertEquals(Datum.class, f.getObjectClass ("Datum"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("Datum"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Datum", "name"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Datum", "name"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Datum", "type"));
assertEquals(VALUE_ENUMERATION, f.getAttributeValueType ("Datum", "type"));
assertEquals(Ellipsoid.class, f.getObjectClass ("Ellipsoid"));
assertEquals(CommonCRS.WGS84.ellipsoid(), f.getObjectDefaultValue ("Ellipsoid"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("Ellipsoid"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Ellipsoid", "name"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Ellipsoid", "name"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Ellipsoid", "semiMajorAxis"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Ellipsoid", "semiMajorAxis"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Ellipsoid", "semiMinorAxis"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Ellipsoid", "semiMinorAxis"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("Ellipsoid", "inverseFlattening"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Ellipsoid", "inverseFlattening"));
assertEquals(PrimeMeridian.class, f.getObjectClass ("PrimeMeridian"));
assertEquals(CommonCRS.WGS84.primeMeridian(), f.getObjectDefaultValue ("PrimeMeridian"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("PrimeMeridian"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("PrimeMeridian", "name"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("PrimeMeridian", "name"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("PrimeMeridian", "greenwichLongitude"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("PrimeMeridian", "greenwichLongitude"));
assertEquals(Conversion.class, f.getObjectClass ("Conversion"));
assertEquals(CHILD_POLICY_SOME, f.getChildPolicy ("Conversion"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("Conversion", "method"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("Conversion", "method"));
assertEquals(ParameterValueGroup.class, f.getObjectClass ("Parameters"));
assertEquals(CHILD_POLICY_REPEAT, f.getChildPolicy ("Parameters"));
assertEquals(ParameterValue.class, f.getObjectClass ("ParameterValue"));
assertEquals(CHILD_POLICY_EMPTY, f.getChildPolicy ("ParameterValue"));
assertEquals(DATATYPE_STRING, f.getAttributeDataType ("ParameterValue", "name"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("ParameterValue", "name"));
assertEquals(DATATYPE_DOUBLE, f.getAttributeDataType ("ParameterValue", "value"));
assertEquals(VALUE_ARBITRARY, f.getAttributeValueType ("ParameterValue", "value"));
}
/**
* Asserts that the given enumeration contains the given value.
*/
private static void assertIsEnum(final String value, final String[] enumeration) {
for (int i=0; i<enumeration.length; i++) {
if (value.equals(enumeration[i])) {
return;
}
}
fail("Value \"" + value + "\" is not found in the following enumeration: " + Arrays.toString(enumeration));
}
/**
* Tests the descriptions in the image metadata format instance.
*/
@Test
public void testImageDescriptions() {
final IIOMetadataFormat format = SpatialMetadataFormat.getImageInstance(GEOTK_FORMAT_NAME);
assertEquals("Identifier for the level of processing that has been applied to the resource.",
format.getElementDescription("ProcessingLevelCode", Locale.ENGLISH));
assertEquals("Area of the dataset obscured by clouds, expressed as a percentage of the spatial extent.",
format.getAttributeDescription("ImageDescription", "cloudCoverPercentage", Locale.ENGLISH));
}
/**
* Tests the {@link SpatialMetadataFormat#getElementParent(String)} method on stream metadata.
*
* @since 3.06
*/
@Test
public void testStreamParents() {
final SpatialMetadataFormat format = SpatialMetadataFormat.getStreamInstance(GEOTK_FORMAT_NAME);
assertNull(format.getElementParent(GEOTK_FORMAT_NAME));
assertEquals(GEOTK_FORMAT_NAME, format.getElementParent("DiscoveryMetadata"));
assertEquals(GEOTK_FORMAT_NAME, format.getElementParent("AcquisitionMetadata"));
assertEquals(GEOTK_FORMAT_NAME, format.getElementParent("QualityMetadata"));
assertNull ("'citation' is an attribute, not an element.", format.getElementParent("citation"));
assertEquals("DiscoveryMetadata", format.getElementParent("DescriptiveKeywords"));
assertEquals("DescriptiveKeywords", format.getElementParent("DescriptiveKeywordsEntry"));
assertEquals("DiscoveryMetadata", format.getElementParent("SpatialResolution"));
assertEquals("DiscoveryMetadata", format.getElementParent("Extent"));
assertEquals("Extent", format.getElementParent("GeographicElement"));
assertEquals("Extent", format.getElementParent("VerticalElement"));
assertEquals("AcquisitionMetadata", format.getElementParent("EnvironmentalConditions"));
assertEquals("AcquisitionMetadata", format.getElementParent("Platform"));
assertEquals("Platform", format.getElementParent("Instruments"));
assertEquals("Instruments", format.getElementParent("Instrument"));
assertEquals("Instrument", format.getElementParent("Identifier"));
}
/**
* Tests the {@link SpatialMetadataFormat#getElementParent(String)} method on image metadata.
*
* @since 3.06
*/
@Test
public void testImageParents() {
final SpatialMetadataFormat format = SpatialMetadataFormat.getImageInstance(GEOTK_FORMAT_NAME);
assertNull(format.getElementParent(GEOTK_FORMAT_NAME));
assertEquals(GEOTK_FORMAT_NAME, format.getElementParent("ImageDescription"));
assertEquals(GEOTK_FORMAT_NAME, format.getElementParent("SpatialRepresentation"));
assertEquals(GEOTK_FORMAT_NAME, format.getElementParent("RectifiedGridDomain"));
assertNull ("'contentType' is an attribute, not an element.", format.getElementParent("contentType"));
assertEquals("ImageDescription", format.getElementParent("ImageQualityCode"));
assertEquals("ImageDescription", format.getElementParent("Dimensions"));
assertEquals("Dimensions", format.getElementParent("Dimension"));
assertEquals("RectifiedGridDomain", format.getElementParent("Limits"));
assertEquals("RectifiedGridDomain", format.getElementParent("OffsetVectors"));
assertEquals("OffsetVectors", format.getElementParent("OffsetVector"));
}
/**
* Tests the {@link SpatialMetadataFormat#getElementPath(String)} method on stream metadata.
*
* @since 3.06
*/
@Test
public void testStreamPaths() {
final SpatialMetadataFormat format = SpatialMetadataFormat.getStreamInstance(GEOTK_FORMAT_NAME);
assertNull(format.getElementPath(GEOTK_FORMAT_NAME));
assertNull ("'citation' is an attribute, not an element.", format.getElementPath("citation"));
assertEquals("DiscoveryMetadata", format.getElementPath("DiscoveryMetadata"));
assertEquals("DiscoveryMetadata/DescriptiveKeywords", format.getElementPath("DescriptiveKeywords"));
assertEquals("DiscoveryMetadata/DescriptiveKeywords/DescriptiveKeywordsEntry",format.getElementPath("DescriptiveKeywordsEntry"));
assertEquals("DiscoveryMetadata/SpatialResolution", format.getElementPath("SpatialResolution"));
assertEquals("DiscoveryMetadata/Extent", format.getElementPath("Extent"));
assertEquals("DiscoveryMetadata/Extent/GeographicElement", format.getElementPath("GeographicElement"));
assertEquals("DiscoveryMetadata/Extent/VerticalElement", format.getElementPath("VerticalElement"));
assertEquals("AcquisitionMetadata", format.getElementPath("AcquisitionMetadata"));
assertEquals("AcquisitionMetadata/EnvironmentalConditions", format.getElementPath("EnvironmentalConditions"));
assertEquals("AcquisitionMetadata/Platform", format.getElementPath("Platform"));
assertEquals("AcquisitionMetadata/Platform/Instruments", format.getElementPath("Instruments"));
assertEquals("AcquisitionMetadata/Platform/Instruments/Instrument", format.getElementPath("Instrument"));
assertEquals("AcquisitionMetadata/Platform/Instruments/Instrument/Identifier",format.getElementPath("Identifier"));
assertEquals("QualityMetadata", format.getElementPath("QualityMetadata"));
}
/**
* Tests the {@link SpatialMetadataFormat#getElementPath(String)} method on image metadata.
*
* @since 3.06
*/
@Test
public void testImagePaths() {
final SpatialMetadataFormat format = SpatialMetadataFormat.getImageInstance(GEOTK_FORMAT_NAME);
assertNull(format.getElementPath(GEOTK_FORMAT_NAME));
assertNull ("'contentType' is an attribute, not an element.", format.getElementPath("contentType"));
assertEquals("ImageDescription", format.getElementPath("ImageDescription"));
assertEquals("ImageDescription/ImageQualityCode", format.getElementPath("ImageQualityCode"));
assertEquals("ImageDescription/Dimensions", format.getElementPath("Dimensions"));
assertEquals("ImageDescription/Dimensions/Dimension", format.getElementPath("Dimension"));
assertEquals("SpatialRepresentation", format.getElementPath("SpatialRepresentation"));
assertEquals("RectifiedGridDomain", format.getElementPath("RectifiedGridDomain"));
assertEquals("RectifiedGridDomain/Limits", format.getElementPath("Limits"));
assertEquals("RectifiedGridDomain/OffsetVectors", format.getElementPath("OffsetVectors"));
assertEquals("RectifiedGridDomain/OffsetVectors/OffsetVector", format.getElementPath("OffsetVector"));
}
/**
* Tests the {@link SpatialMetadataFormat#toString()} method.
* This is also used for producing the tree to copy in the javadoc.
*
* @throws IOException If an I/O error occurred while writing the tree to disk.
* This is normally not enabled.
*/
@Test
public void testToString() throws IOException {
final String stream = SpatialMetadataFormat.getStreamInstance(GEOTK_FORMAT_NAME).toString();
final String image = SpatialMetadataFormat.getImageInstance (GEOTK_FORMAT_NAME).toString();
assertTrue(!stream.isEmpty()); // Dummy check. The real interesting part is the write to a file.
assertTrue(!image .isEmpty());
if (false) {
try (Writer out = new OutputStreamWriter(new FileOutputStream("SpatialMetadataFormat.txt"), "UTF-8")) {
out.write(stream);
out.write(System.lineSeparator());
out.write(image);
}
}
}
@Test
public void testISO() {
SpatialMetadataFormat.getStreamInstance(ISO_FORMAT_NAME);
}
}