Author: desruisseaux
Date: Thu Feb 25 18:16:26 2016
New Revision: 1732336

URL: http://svn.apache.org/viewvc?rev=1732336&view=rev
Log:
When parsing a WKT 1 string, convert (Geographic2D + Vertical) into 
(Geographic3D) CRS.
Issue: SIS-317.

Modified:
    
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java
    
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/VerticalDatumTypes.java
    
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
    
sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/VerticalDatumTypesTest.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java
    
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/ServicesForMetadataTest.java
    
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/GeodeticObjectParserTest.java
    
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java
    
sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/test/Assert.java

Modified: 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/ReferencingServices.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -25,15 +25,20 @@ import org.opengis.geometry.Envelope;
 import org.opengis.metadata.Identifier;
 import org.opengis.parameter.ParameterDescriptor;
 import org.opengis.referencing.IdentifiedObject;
+import org.opengis.referencing.crs.CRSFactory;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
 import org.opengis.referencing.crs.SingleCRS;
 import org.opengis.referencing.crs.DerivedCRS;
+import org.opengis.referencing.crs.GeodeticCRS;
 import org.opengis.referencing.crs.VerticalCRS;
 import org.opengis.referencing.cs.AxisDirection;
+import org.opengis.referencing.cs.CSFactory;
 import org.opengis.referencing.cs.CartesianCS;
 import org.opengis.referencing.cs.CoordinateSystem;
 import org.opengis.referencing.cs.CoordinateSystemAxis;
+import org.opengis.referencing.cs.EllipsoidalCS;
 import org.opengis.referencing.datum.PrimeMeridian;
+import org.opengis.referencing.datum.VerticalDatum;
 import org.opengis.referencing.operation.MathTransform;
 import org.opengis.referencing.operation.MathTransformFactory;
 import org.opengis.referencing.operation.CoordinateOperationFactory;
@@ -50,6 +55,7 @@ import org.apache.sis.internal.system.De
 import org.apache.sis.internal.system.OptionalDependency;
 import org.apache.sis.internal.system.Modules;
 import org.apache.sis.io.wkt.FormattableObject;
+import org.apache.sis.util.ArraysExt;
 import org.apache.sis.util.iso.DefaultNameSpace;
 import org.apache.sis.util.Deprecable;
 
@@ -408,6 +414,81 @@ public class ReferencingServices extends
     }
 
     /**
+     * Creates a compound CRS, but we special processing for (two-dimensional 
Geographic + ellipsoidal heights) tupples.
+     * If any such tupple is found, a three-dimensional geographic CRS is 
created instead than the compound CRS.
+     *
+     * @param  crsFactory The factory to use for creating compound or 
three-dimensional geographic CRS.
+     * @param  csFactory  The factory to use for creating three-dimensional 
ellipsoidal CS, if needed.
+     * @param  properties Name and other properties to give to the new object.
+     * @param  components ordered array of {@code CoordinateReferenceSystem} 
objects.
+     * @return The coordinate reference system for the given properties.
+     * @throws FactoryException if the object creation failed.
+     *
+     * @since 0.7
+     */
+    public final CoordinateReferenceSystem createCompoundCRS(final CRSFactory 
crsFactory, final CSFactory csFactory,
+            final Map<String,?> properties, CoordinateReferenceSystem... 
components) throws FactoryException
+    {
+        for (int i=0; i<components.length; i++) {
+            final CoordinateReferenceSystem vertical = components[i];
+            if (vertical instanceof VerticalCRS) {
+                final VerticalDatum datum = ((VerticalCRS) 
vertical).getDatum();
+                if (datum != null && datum.getVerticalDatumType() == 
VerticalDatumTypes.ELLIPSOIDAL) {
+                    int axisPosition = 0;
+                    EllipsoidalCS cs = null;
+                    CoordinateReferenceSystem crs = null;
+                    if (i == 0 || (cs = getCsIfGeographic2D(crs = components[i 
- 1])) == null) {
+                        /*
+                         * GeographicCRS are normally before VerticalCRS. But 
Apache SIS is tolerant to the
+                         * opposite order (note however that such ordering is 
illegal according ISO 19162).
+                         */
+                        if (i+1 >= components.length || (cs = 
getCsIfGeographic2D(crs = components[i + 1])) == null) {
+                            continue;
+                        }
+                        axisPosition = 1;
+                    }
+                    /*
+                     * At this point we have the horizontal and vertical 
components. The horizontal component
+                     * begins at 'axisPosition', which is almost always zero. 
Create the three-dimensional CRS.
+                     */
+                    final CoordinateSystemAxis[] axes = new 
CoordinateSystemAxis[3];
+                    axes[axisPosition++   ] = cs.getAxis(0);
+                    axes[axisPosition++   ] = cs.getAxis(1);
+                    axes[axisPosition %= 3] = 
vertical.getCoordinateSystem().getAxis(0);
+                    cs = csFactory.createEllipsoidalCS(getProperties(cs), 
axes[0], axes[1], axes[2]);
+                    crs = crsFactory.createGeographicCRS(getProperties(crs), 
((GeodeticCRS) crs).getDatum(), cs);
+                    /*
+                     * Remove the VerticalCRS and store the three-dimensional 
GeographicCRS in place of the previous
+                     * two-dimensional GeographicCRS. Then let the loop 
continues in case there is other CRS to merge
+                     * (should never happen, but we are paranoiac).
+                     */
+                    components = ArraysExt.remove(components, i, 1);
+                    if (axisPosition != 0) i--;             // GeographicCRS 
before VerticalCRS (usual case).
+                    components[i] = crs;
+                }
+            }
+        }
+        switch (components.length) {
+            case 0:  return null;
+            case 1:  return components[0];
+            default: return crsFactory.createCompoundCRS(properties, 
components);
+        }
+    }
+
+    /**
+     * Returns the coordinate system if the given CRS is a two-dimensional 
geographic CRS, or {@code null} otherwise.
+     */
+    private static EllipsoidalCS getCsIfGeographic2D(final 
CoordinateReferenceSystem crs) {
+        if (crs instanceof GeodeticCRS) {
+            final CoordinateSystem cs = crs.getCoordinateSystem();
+            if (cs instanceof EllipsoidalCS && cs.getDimension() == 2) {
+                return (EllipsoidalCS) cs;
+            }
+        }
+        return null;
+    }
+
+    /**
      * Returns an axis direction from a pole along a meridian.
      * The given meridian is usually, but not necessarily, relative to the 
Greenwich meridian.
      *

Modified: 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/VerticalDatumTypes.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/VerticalDatumTypes.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/VerticalDatumTypes.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/internal/metadata/VerticalDatumTypes.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -39,7 +39,7 @@ import org.apache.sis.util.Characters;
  *
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @since   0.4
- * @version 0.6
+ * @version 0.7
  * @module
  */
 public final class VerticalDatumTypes implements CodeList.Filter {
@@ -108,12 +108,19 @@ public final class VerticalDatumTypes im
 
     /**
      * Returns the legacy code for the datum type, or 0 if unknown.
+     * This method is used for WKT 1 formatting.
      *
-     * @param  ordinal The {@linkplain CodeList#ordinal() ordinal} value of 
the {@link VerticalDatumType}.
+     * @param  type The vertical datum type, or {@code null} if unknown.
      * @return The legacy code for the given datum type, or 0 if unknown.
      */
-    public static int toLegacy(final int ordinal) {
-        return (ordinal >= 0 && ordinal < LEGACY_CODES.length) ? 
LEGACY_CODES[ordinal] : 0;
+    public static int toLegacy(final VerticalDatumType type) {
+        if (type != null) {
+            final int ordinal = type.ordinal();
+            if (ordinal >= 0 && ordinal < LEGACY_CODES.length) {
+                return LEGACY_CODES[ordinal];
+            }
+        }
+        return 0;
     }
 
     /**
@@ -219,6 +226,8 @@ public final class VerticalDatumTypes im
      * We do not test the characters following the prefix because the word may 
be incomplete
      * (e.g. {@code "geoid"} versus {@code "geoidal"}).
      *
+     * <p>This method is public as an implementation side-effect and should be 
ignored.</p>
+     *
      * @param code The code to test.
      * @return {@code true} if the code matches the criterion.
       */
@@ -230,6 +239,7 @@ public final class VerticalDatumTypes im
 
     /**
      * Returns {@code null} for disabling the creation of new code list 
elements.
+     * This method is public as an implementation side-effect and should be 
ignored.
      *
      * @return {@code null}.
      */

Modified: 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/main/java/org/apache/sis/io/wkt/GeodeticObjectParser.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -821,14 +821,14 @@ final class GeodeticObjectParser extends
                     direction = AxisDirection.UP;
                     if (datum instanceof VerticalDatum) {
                         final VerticalDatumType vt = ((VerticalDatum) 
datum).getVerticalDatumType();
-                        if (VerticalDatumType.GEOIDAL.equals(vt)) {
+                        if (vt == VerticalDatumType.GEOIDAL) {
                             nz = AxisNames.GRAVITY_RELATED_HEIGHT;
                             z  = "H";
-                        } else if (VerticalDatumType.DEPTH.equals(vt)) {
+                        } else if (vt == VerticalDatumType.DEPTH) {
                             direction = AxisDirection.DOWN;
                             nz = AxisNames.DEPTH;
                             z  = "D";
-                        } else if (VerticalDatumTypes.ELLIPSOIDAL.equals(vt)) {
+                        } else if (vt == VerticalDatumTypes.ELLIPSOIDAL) {
                             // Not allowed by ISO 19111 as a standalone axis, 
but SIS is
                             // tolerant to this case since it is sometime hard 
to avoid.
                             nz = AxisNames.ELLIPSOIDAL_HEIGHT;
@@ -2020,12 +2020,15 @@ final class GeodeticObjectParser extends
      *     COMPD_CS["<name>", <head cs>, <tail cs> {,<authority>}]
      * }
      *
+     * In the particular case where there is a geographic CRS and an 
ellipsoidal height,
+     * this method rather build a three-dimensional geographic CRS.
+     *
      * @param  mode {@link #FIRST}, {@link #OPTIONAL} or {@link #MANDATORY}.
      * @param  parent The parent element.
      * @return The {@code "CompoundCRS"} element as a {@link CompoundCRS} 
object.
      * @throws ParseException if the {@code "CompoundCRS"} element can not be 
parsed.
      */
-    private CompoundCRS parseCompoundCRS(final int mode, final Element parent) 
throws ParseException {
+    private CoordinateReferenceSystem parseCompoundCRS(final int mode, final 
Element parent) throws ParseException {
         final Element element = parent.pullElement(mode, 
WKTKeywords.CompoundCRS, WKTKeywords.Compd_CS);
         if (element == null) {
             return null;
@@ -2037,7 +2040,7 @@ final class GeodeticObjectParser extends
             components.add(crs);
         }
         try {
-            return crsFactory.createCompoundCRS(parseMetadataAndClose(element, 
name, null),
+            return referencing.createCompoundCRS(crsFactory, csFactory, 
parseMetadataAndClose(element, name, null),
                     components.toArray(new 
CoordinateReferenceSystem[components.size()]));
         } catch (FactoryException exception) {
             throw element.parseFailed(exception);

Modified: 
sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/VerticalDatumTypesTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/VerticalDatumTypesTest.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/VerticalDatumTypesTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-metadata/src/test/java/org/apache/sis/internal/metadata/VerticalDatumTypesTest.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -30,7 +30,7 @@ import static org.junit.Assert.*;
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.4
- * @version 0.6
+ * @version 0.7
  * @module
  */
 public final strictfp class VerticalDatumTypesTest extends TestCase {
@@ -49,9 +49,9 @@ public final strictfp class VerticalDatu
      */
     @Test
     public void testToLegacy() {
-        assertEquals(2002, 
VerticalDatumTypes.toLegacy(VerticalDatumTypes.ELLIPSOIDAL.ordinal()));
-        assertEquals(2005, VerticalDatumTypes.toLegacy(VerticalDatumType 
.GEOIDAL    .ordinal()));
-        assertEquals(2006, VerticalDatumTypes.toLegacy(VerticalDatumType 
.DEPTH      .ordinal()));
+        assertEquals(2002, 
VerticalDatumTypes.toLegacy(VerticalDatumTypes.ELLIPSOIDAL));
+        assertEquals(2005, VerticalDatumTypes.toLegacy(VerticalDatumType 
.GEOIDAL));
+        assertEquals(2006, VerticalDatumTypes.toLegacy(VerticalDatumType 
.DEPTH));
     }
 
     /**

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/datum/DefaultVerticalDatum.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -301,7 +301,7 @@ public class DefaultVerticalDatum extend
     protected String formatTo(final Formatter formatter) {
         super.formatTo(formatter);
         if (formatter.getConvention().majorVersion() == 1) {
-            formatter.append(VerticalDatumTypes.toLegacy(type().ordinal()));
+            formatter.append(VerticalDatumTypes.toLegacy(type()));
             return WKTKeywords.Vert_Datum;
         }
         return formatter.shortOrLong(WKTKeywords.VDatum, 
WKTKeywords.VerticalDatum);

Modified: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/ServicesForMetadataTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/ServicesForMetadataTest.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/ServicesForMetadataTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/internal/referencing/ServicesForMetadataTest.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -16,17 +16,26 @@
  */
 package org.apache.sis.internal.referencing;
 
+import java.util.Map;
+import java.util.Collections;
 import org.opengis.geometry.Envelope;
 import org.opengis.metadata.extent.GeographicBoundingBox;
 import org.opengis.metadata.extent.VerticalExtent;
+import org.opengis.referencing.cs.AxisDirection;
 import org.opengis.referencing.crs.CoordinateReferenceSystem;
+import org.opengis.referencing.crs.GeographicCRS;
+import org.opengis.referencing.crs.SingleCRS;
 import org.opengis.referencing.operation.TransformException;
+import org.opengis.util.FactoryException;
+import org.apache.sis.internal.metadata.ReferencingServices;
 import org.apache.sis.metadata.iso.extent.DefaultGeographicBoundingBox;
 import org.apache.sis.metadata.iso.extent.DefaultVerticalExtent;
 import org.apache.sis.metadata.iso.extent.DefaultSpatialTemporalExtent;
 import org.apache.sis.geometry.GeneralEnvelope;
+import org.apache.sis.referencing.CRS;
 import org.apache.sis.referencing.CommonCRS;
 import org.apache.sis.referencing.crs.HardCodedCRS;
+import org.apache.sis.referencing.factory.GeodeticObjectFactory;
 import org.apache.sis.test.DependsOnMethod;
 import org.apache.sis.test.DependsOn;
 import org.apache.sis.test.TestCase;
@@ -41,7 +50,7 @@ import static org.apache.sis.test.TestUt
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.5
- * @version 0.5
+ * @version 0.7
  * @module
  */
 @DependsOn({
@@ -154,4 +163,54 @@ public final strictfp class ServicesForM
         verifySpatialExtent((GeographicBoundingBox) 
getSingleton(extent.getSpatialExtent()));
         verifyVerticalExtent(CommonCRS.Vertical.MEAN_SEA_LEVEL, 
extent.getVerticalExtent());
     }
+
+    /**
+     * Tests {@link ServicesForMetadata#createCompoundCRS 
ReferencingUtilities.createCompoundCRS(…)}.
+     *
+     * @throws FactoryException if a CRS can not be created.
+     *
+     * @see <a href="https://issues.apache.org/jira/browse/SIS-303";>SIS-303</a>
+     *
+     * @since 0.7
+     */
+    @Test
+    public void testCreateCompoundCRS() throws FactoryException {
+        final ReferencingServices services = ServicesForMetadata.getInstance();
+        final GeodeticObjectFactory factory = new GeodeticObjectFactory();
+        final Map<String,String> properties = 
Collections.singletonMap(CoordinateReferenceSystem.NAME_KEY, "WGS 84 (4D)");
+        /*
+         * createCompoundCRS(…) should not combine GeographicCRS with 
non-ellipsoidal height.
+         */
+        CoordinateReferenceSystem compound = 
services.createCompoundCRS(factory, factory, properties,
+                HardCodedCRS.WGS84, HardCodedCRS.GRAVITY_RELATED_HEIGHT, 
HardCodedCRS.TIME);
+        assertArrayEqualsIgnoreMetadata(new SingleCRS[] {HardCodedCRS.WGS84, 
HardCodedCRS.GRAVITY_RELATED_HEIGHT, HardCodedCRS.TIME},
+                CRS.getSingleComponents(compound).toArray());
+        /*
+         * createCompoundCRS(…) should combine GeographicCRS with ellipsoidal 
height.
+         */
+        compound = services.createCompoundCRS(factory, factory, properties,
+                HardCodedCRS.WGS84, HardCodedCRS.ELLIPSOIDAL_HEIGHT);
+        assertArrayEqualsIgnoreMetadata(new SingleCRS[] 
{HardCodedCRS.WGS84_3D},
+                CRS.getSingleComponents(compound).toArray());
+        /*
+         * createCompoundCRS(…) should combine GeographicCRS with ellipsoidal 
height and keep time.
+         */
+        compound = services.createCompoundCRS(factory, factory, properties,
+                HardCodedCRS.WGS84, HardCodedCRS.ELLIPSOIDAL_HEIGHT, 
HardCodedCRS.TIME);
+        assertArrayEqualsIgnoreMetadata(new SingleCRS[] 
{HardCodedCRS.WGS84_3D, HardCodedCRS.TIME},
+                CRS.getSingleComponents(compound).toArray());
+        /*
+         * Non-standard feature: accept (VerticalCRS + GeodeticCRS) order.
+         * The test below use the reverse order for all axes compared to the 
previous test.
+         */
+        compound = services.createCompoundCRS(factory, factory, properties,
+                HardCodedCRS.TIME, HardCodedCRS.ELLIPSOIDAL_HEIGHT, 
HardCodedCRS.WGS84_φλ);
+        final Object[] components = 
CRS.getSingleComponents(compound).toArray();
+        assertEquals(2, components.length);
+        assertEqualsIgnoreMetadata(HardCodedCRS.TIME, components[0]);
+        assertInstanceOf("Shall be a three-dimensional geographic CRS.", 
GeographicCRS.class, components[1]);
+        assertAxisDirectionsEqual("Shall be a three-dimensional geographic 
CRS.",
+                ((CoordinateReferenceSystem) 
components[1]).getCoordinateSystem(),
+                AxisDirection.UP, AxisDirection.NORTH, AxisDirection.EAST);
+    }
 }

Modified: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/GeodeticObjectParserTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/GeodeticObjectParserTest.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/GeodeticObjectParserTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/io/wkt/GeodeticObjectParserTest.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -998,6 +998,40 @@ public final strictfp class GeodeticObje
     }
 
     /**
+     * Tests the parsing of a compound CRS from a WKT 1 string with 
ellipsoidal height and its conversion
+     * to a three-dimensional geographic CRS.
+     *
+     * @throws ParseException if the parsing failed.
+     *
+     * @see <a href="https://issues.apache.org/jira/browse/SIS-317";>SIS-317</a>
+     *
+     * @since 0.7
+     */
+    @Test
+    @DependsOnMethod("testCompoundCRS")
+    public void testCompoundWKT1() throws ParseException {
+        final GeographicCRS crs = parse(GeographicCRS.class,
+                "COMPD_CS[“WGS 84 (3D)”,\n" +
+                "  GEOGCS[“WGS 84”,\n" +
+                "    DATUM[“World Geodetic System 1984”,\n" +
+                "      SPHEROID[“WGS84”, 6378137.0, 298.257223563]],\n" +
+                "      PRIMEM[“Greenwich”, 0.0],\n" +
+                "    UNIT[“degree”, 0.017453292519943295],\n" +
+                "    AXIS[“Longitude”, EAST],\n" +
+                "    AXIS[“Latitude”, NORTH]],\n" +
+                "  VERT_CS[“Ellipsoidal height”,\n" +
+                "    VERT_DATUM[“Ellipsoid”, 2002],\n" +
+                "    UNIT[“metre”, 1],\n" +
+                "    AXIS[“Ellipsoidal height”, UP]]]");
+
+        final CoordinateSystem cs = crs.getCoordinateSystem();
+        assertEquals("dimension", 3, cs.getDimension());
+        assertLongitudeAxisEquals(cs.getAxis(0));
+        assertLatitudeAxisEquals (cs.getAxis(1));
+        assertUnboundedAxisEquals("Ellipsoidal height", "h", AxisDirection.UP, 
SI.METRE, cs.getAxis(2));
+    }
+
+    /**
      * Tests the production of a warning messages when the WKT contains 
unknown elements.
      *
      * @throws ParseException if the parsing failed.

Modified: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/crs/DefaultGeographicCRSTest.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -172,9 +172,9 @@ public final strictfp class DefaultGeogr
      * <p>This CRS used in this test is equivalent to {@code EPSG:4979} except 
for axis order,
      * since EPSG puts latitude before longitude.</p>
      *
-     * @since 0.7
-     *
      * @see #testWKT1_For3D()
+     *
+     * @since 0.7
      */
     @Test
     @DependsOnMethod("testWKT2")
@@ -300,9 +300,10 @@ public final strictfp class DefaultGeogr
      * geographic CRS followed by an ellipsoidal height. Such construction is 
illegal according ISO 19111, so this
      * split shall be done on-the-fly only for formatting purpose.
      *
-     * @since 0.7
-     *
      * @see #testWKT2_For3D()
+     * @see <a href="https://issues.apache.org/jira/browse/SIS-317";>SIS-317</a>
+     *
+     * @since 0.7
      */
     @Test
     @DependsOnMethod("testWKT1")

Modified: 
sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/test/Assert.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/test/Assert.java?rev=1732336&r1=1732335&r2=1732336&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/test/Assert.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-utility/src/test/java/org/apache/sis/test/Assert.java
 [UTF-8] Thu Feb 25 18:16:26 2016
@@ -33,6 +33,8 @@ import org.xml.sax.SAXException;
 import org.apache.sis.util.Utilities;
 import org.apache.sis.util.CharSequences;
 import org.apache.sis.util.ComparisonMode;
+import org.apache.sis.util.Exceptions;
+import org.apache.sis.util.Classes;
 
 // Branch-dependent imports
 import java.util.Objects;
@@ -100,6 +102,33 @@ public strictfp class Assert extends org
     }
 
     /**
+     * Asserts that the two given arrays contains objects that are equal 
ignoring metadata.
+     * See {@link ComparisonMode#IGNORE_METADATA} for more information.
+     *
+     * @param expected  The expected objects (array can be {@code null}).
+     * @param actual    The actual objects (array can be {@code null}).
+     *
+     * @since 0.7
+     */
+    public static void assertArrayEqualsIgnoreMetadata(final Object[] 
expected, final Object[] actual) {
+        if (expected != actual) {
+            if (expected == null) {
+                assertNull("Expected null array.", actual);
+            } else {
+                assertNotNull("Expected non-null array.", actual);
+                final int length = StrictMath.min(expected.length, 
actual.length);
+                for (int i=0; i<length; i++) try {
+                    assertEqualsIgnoreMetadata(expected[i], actual[i]);
+                } catch (AssertionError e) {
+                    throw new 
AssertionError(Exceptions.formatChainedMessages(null, "Comparison failure at 
index "
+                            + i + " (a " + 
Classes.getShortClassName(actual[i]) + ").", e), e);
+                }
+                assertEquals("Unexpected array length.", expected.length, 
actual.length);
+            }
+        }
+    }
+
+    /**
      * Asserts that two strings are equal, ignoring the differences in EOL 
characters.
      * The comparisons is performed one a line-by-line basis. For each line, 
trailing
      * spaces (but not leading spaces) are ignored.


Reply via email to