Author: desruisseaux Date: Thu Jun 9 15:44:57 2016 New Revision: 1747559 URL: http://svn.apache.org/viewvc?rev=1747559&view=rev Log: Allow the EPSG fallback to create also datum objects, and add tests. Added: sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/CRSCommandTest.java (with props) sis/branches/JDK8/application/sis-openoffice/src/test/java/org/ sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/ sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/ sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingTest.java (with props) sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/TransformerTest.java (with props) sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/test/ sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/test/suite/ sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/test/suite/OpenOfficeTestSuite.java (with props) sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/test/suite/package-info.txt - copied unchanged from r1747372, sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/test/suite/package-info.txt Modified: sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/CRSCommand.java sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/IdentifierCommand.java sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/MetadataCommandTest.java sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/test/suite/ConsoleTestSuite.java sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Referencing.java sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Transformer.java sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/XReferencing.java sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/EPSGFactoryFallback.java sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/CommonCRSTest.java sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java Modified: sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/CRSCommand.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/CRSCommand.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/CRSCommand.java [UTF-8] (original) +++ sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/CRSCommand.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -37,7 +37,7 @@ import org.apache.sis.io.wkt.Convention; */ final class CRSCommand extends MetadataCommand { /** - * Creates the {@code "metadata"}, {@code "crs"} or {@code "identifier"} sub-command. + * Creates the {@code "crs"} sub-command. */ CRSCommand(final int commandIndex, final String... args) throws InvalidOptionException { super(commandIndex, args); Modified: sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/IdentifierCommand.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/IdentifierCommand.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/IdentifierCommand.java [UTF-8] (original) +++ sis/branches/JDK8/application/sis-console/src/main/java/org/apache/sis/console/IdentifierCommand.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -91,7 +91,7 @@ final class IdentifierCommand extends Me } /** - * Creates the {@code "metadata"}, {@code "crs"} or {@code "identifier"} sub-command. + * Creates the {@code "identifier"} sub-command. */ IdentifierCommand(final int commandIndex, final String... args) throws InvalidOptionException { super(commandIndex, args); Added: sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/CRSCommandTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/CRSCommandTest.java?rev=1747559&view=auto ============================================================================== --- sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/CRSCommandTest.java (added) +++ sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/CRSCommandTest.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sis.console; + +import org.apache.sis.test.DependsOnMethod; +import org.apache.sis.test.DependsOn; +import org.apache.sis.test.TestCase; +import org.junit.Test; + +import static org.apache.sis.test.Assert.*; + + +/** + * Tests the {@link CRSCommand} sub-command. + * + * @author Martin Desruisseaux (Geomatys) + * @since 0.8 + * @version 0.8 + * @module + */ +@DependsOn(CommandRunnerTest.class) +public final strictfp class CRSCommandTest extends TestCase { + /** + * The Well Known Text for EPSG:4326. + */ + private static final String WGS84 = + "GeodeticCRS[\"WGS 84\",\n" + + " Datum[\"World Geodetic System 1984\",\n" + + " Ellipsoid[\"WGS 84\", 6378137.0, 298.257223563]],\n" + + " CS[ellipsoidal, 2],\n" + + " Axis[\"Latitude (B)\", north],\n" + + " Axis[\"Longitude (L)\", east],\n" + + " Unit[\"degree\", 0.017453292519943295],\n" + + " Scope[\"Horizontal component of 3D system. Used by the GPS satellite navigation system and for NATO military geodetic surveying.\"],\n" + + " Area[\"World.\"],\n" + + " BBox[-90.00, -180.00, 90.00, 180.00],\n" + + " Id[\"EPSG\", 4326, \"8.9\", URI[\"urn:ogc:def:crs:EPSG:8.9:4326\"]]]\n"; + + /** + * Tests fetching the CRS from a simple code ({@code "EPSG:4326"}). + * + * @throws Exception if an error occurred while creating the command. + */ + @Test + public void testCode() throws Exception { + final CRSCommand test = new CRSCommand(0, CommandRunner.TEST, "EPSG:4326"); + test.run(); + assertMultilinesEquals(WGS84, test.outputBuffer.toString()); + } + + /** + * Tests fetching the CRS from a URN ({@code "urn:ogc:def:crs:epsg::4326"}). + * + * @throws Exception if an error occurred while creating the command. + */ + @Test + @DependsOnMethod("testCode") + public void testURN() throws Exception { + final CRSCommand test = new CRSCommand(0, CommandRunner.TEST, "urn:ogc:def:crs:epsg::4326"); + test.run(); + assertMultilinesEquals(WGS84, test.outputBuffer.toString()); + } + + /** + * Tests fetching the CRS from a HTTP code ({@code "http://www.opengis.net/gml/srs/epsg.xml#4326"}). + * + * @throws Exception if an error occurred while creating the command. + */ + @Test + @DependsOnMethod("testURN") + public void testHTTP() throws Exception { + final CRSCommand test = new CRSCommand(0, CommandRunner.TEST, "http://www.opengis.net/gml/srs/epsg.xml#4326"); + test.run(); + assertMultilinesEquals(WGS84, test.outputBuffer.toString()); + } +} Propchange: sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/CRSCommandTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/CRSCommandTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain;charset=UTF-8 Modified: sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/MetadataCommandTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/MetadataCommandTest.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/MetadataCommandTest.java [UTF-8] (original) +++ sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/console/MetadataCommandTest.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -39,7 +39,7 @@ public final strictfp class MetadataComm /** * Tests the sub-command on a NetCDF file. * - * @throws Exception Should never happen. + * @throws Exception if an error occurred while creating the command. */ @Test public void testNetCDF() throws Exception { @@ -65,7 +65,7 @@ public final strictfp class MetadataComm /** * Tests with the same file than {@link #testNetCDF()}, but producing a XML output. * - * @throws Exception Should never happen. + * @throws Exception if an error occurred while creating the command. */ @Test @DependsOnMethod("testNetCDF") Modified: sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/test/suite/ConsoleTestSuite.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/test/suite/ConsoleTestSuite.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/test/suite/ConsoleTestSuite.java [UTF-8] (original) +++ sis/branches/JDK8/application/sis-console/src/test/java/org/apache/sis/test/suite/ConsoleTestSuite.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -26,7 +26,7 @@ import org.junit.BeforeClass; * * @author Martin Desruisseaux (Geomatys) * @since 0.3 - * @version 0.4 + * @version 0.8 * @module */ @Suite.SuiteClasses({ @@ -34,7 +34,8 @@ import org.junit.BeforeClass; org.apache.sis.console.HelpCommandTest.class, org.apache.sis.console.AboutCommandTest.class, org.apache.sis.console.MimeTypeCommandTest.class, - org.apache.sis.console.MetadataCommandTest.class + org.apache.sis.console.MetadataCommandTest.class, + org.apache.sis.console.CRSCommandTest.class }) public final strictfp class ConsoleTestSuite extends TestSuite { /** Modified: sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Referencing.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Referencing.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Referencing.java [UTF-8] (original) +++ sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Referencing.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -35,6 +35,8 @@ import com.sun.star.lang.IllegalArgument import org.apache.sis.metadata.iso.extent.Extents; import org.apache.sis.referencing.CRS; import org.apache.sis.referencing.IdentifiedObjects; +import org.apache.sis.referencing.AbstractIdentifiedObject; +import org.apache.sis.io.wkt.Transliterator; import org.apache.sis.util.Classes; import org.apache.sis.util.collection.Cache; import org.apache.sis.util.resources.Errors; @@ -215,8 +217,9 @@ public class Referencing extends CalcAdd } /** - * Returns the axis name and units for the specified dimension - * in a coordinate reference system or coordinate system. + * Returns the axis name and units for the specified dimension in a coordinate reference system or coordinate system. + * This method returns a short axis name as used in Well Known Text (WKT) format, for example "Latitude" + * instead of "Geodetic latitude". * * @param xOptions provided by OpenOffice. * @param codeOrPath the code allocated by an authority, or the path to a file. @@ -238,18 +241,24 @@ public class Referencing extends CalcAdd } catch (Exception exception) { return getLocalizedMessage(exception); } + CoordinateSystem cs = null; final CoordinateSystemAxis axis; if (object instanceof CoordinateSystemAxis) { axis = (CoordinateSystemAxis) object; } else { - final CoordinateSystem cs; if (object instanceof CoordinateReferenceSystem) { cs = ((CoordinateReferenceSystem) object).getCoordinateSystem(); } else if (object instanceof CoordinateSystem) { cs = (CoordinateSystem) object; } else { + final Class actual; + if (object instanceof AbstractIdentifiedObject) { + actual = ((AbstractIdentifiedObject) object).getInterface(); + } else { + actual = Classes.getClass(object); + } return Errors.getResources(getJavaLocale()).getString(Errors.Keys.UnexpectedTypeForReference_3, - codeOrPath, CoordinateReferenceSystem.class, Classes.getClass(object)); + codeOrPath, CoordinateReferenceSystem.class, actual); } if (dimension >= 1 && dimension <= cs.getDimension()) { axis = cs.getAxis(dimension - 1); @@ -258,7 +267,7 @@ public class Referencing extends CalcAdd } } final String unit = PatchedUnitFormat.toString(axis.getUnit()); - name = axis.getName().getCode(); + name = Transliterator.DEFAULT.toShortAxisName(cs, axis.getDirection(), axis.getName().getCode()); if (unit != null && !unit.isEmpty()) { name = name + " (" + unit + ')'; } @@ -307,7 +316,8 @@ public class Referencing extends CalcAdd } return new double[][] { new double[] {area.getNorthBoundLatitude(), area.getWestBoundLongitude()}, - new double[] {area.getSouthBoundLatitude(), area.getEastBoundLongitude()}}; + new double[] {area.getSouthBoundLatitude(), area.getEastBoundLongitude()} + }; } /** @@ -362,7 +372,9 @@ public class Referencing extends CalcAdd public double[][] transformCoordinates(final XPropertySet xOptions, final String sourceCRS, final String targetCRS, final double[][] points) { - try { + if (points == null || points.length == 0) { + return new double[][] {}; + } else try { return new Transformer(this, getCRS(sourceCRS), targetCRS, points).transform(points); } catch (Exception exception) { reportException("transformCoordinates", exception, THROW_EXCEPTION); Modified: sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Transformer.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Transformer.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Transformer.java [UTF-8] (original) +++ sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/Transformer.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -17,6 +17,7 @@ package org.apache.sis.openoffice; import org.opengis.util.FactoryException; +import org.opengis.metadata.extent.GeographicBoundingBox; import org.opengis.referencing.crs.GeographicCRS; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.operation.CoordinateOperation; @@ -78,22 +79,24 @@ final class Transformer { southBoundLatitude = Double.POSITIVE_INFINITY; eastBoundLongitude = Double.NEGATIVE_INFINITY; northBoundLatitude = Double.NEGATIVE_INFINITY; - for (final double[] coord : points) { - if (coord.length == dimension) { - try { - toDomainOfValidity.transform(coord, 0, domainCoord, 0, 1); - } catch (TransformException e) { - if (warning == null) { - warning = e; + if (points != null) { + for (final double[] coord : points) { + if (coord != null && coord.length == dimension) { + try { + toDomainOfValidity.transform(coord, 0, domainCoord, 0, 1); + } catch (TransformException e) { + if (warning == null) { + warning = e; + } + continue; } - continue; + final double x = domainCoord[0]; + final double y = domainCoord[1]; + if (x < westBoundLongitude) westBoundLongitude = x; + if (x > eastBoundLongitude) eastBoundLongitude = x; + if (y < southBoundLatitude) southBoundLatitude = y; + if (y > northBoundLatitude) northBoundLatitude = y; } - final double x = domainCoord[0]; - final double y = domainCoord[1]; - if (x < westBoundLongitude) westBoundLongitude = x; - if (x > eastBoundLongitude) eastBoundLongitude = x; - if (y < southBoundLatitude) southBoundLatitude = y; - if (y > northBoundLatitude) northBoundLatitude = y; } } } @@ -112,9 +115,7 @@ final class Transformer { operation = handler.peek(); if (operation == null) { operation = CRS.findOperation(sourceCRS, caller.getCRS(targetCRS), - hasAreaOfInterest ? new DefaultGeographicBoundingBox( - westBoundLongitude, eastBoundLongitude, - southBoundLatitude, northBoundLatitude) : null); + hasAreaOfInterest ? getAreaOfInterest() : null); } } finally { handler.putAndUnlock(operation); @@ -125,11 +126,20 @@ final class Transformer { /** * Returns {@code true} if the area of interest is non-empty. */ - private boolean hasAreaOfInterest() { + final boolean hasAreaOfInterest() { return (westBoundLongitude < eastBoundLongitude) && (southBoundLatitude < northBoundLatitude); } /** + * Returns the area of interest. It is caller's responsibility to verify that + * {@link #hasAreaOfInterest()} returned {@code true} before to invoke this method. + */ + final GeographicBoundingBox getAreaOfInterest() { + return new DefaultGeographicBoundingBox(westBoundLongitude, eastBoundLongitude, + southBoundLatitude, northBoundLatitude); + } + + /** * Returns the accuracy in metres. */ final double getAccuracy() { Modified: sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/XReferencing.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/XReferencing.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/XReferencing.java [UTF-8] (original) +++ sis/branches/JDK8/application/sis-openoffice/src/main/java/org/apache/sis/openoffice/XReferencing.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -48,8 +48,9 @@ public interface XReferencing extends XI String getName(XPropertySet xOptions, String codeOrPath); /** - * Returns the axis name and units for the specified dimension - * in a coordinate reference system or coordinate system. + * Returns the axis name and units for the specified dimension in a coordinate reference system or coordinate system. + * This method returns a short axis name as used in Well Known Text (WKT) format, for example "Latitude" + * instead of "Geodetic latitude". * * @param xOptions provided by OpenOffice. * @param codeOrPath the code allocated by an authority, or the path to a file. Added: sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingTest.java?rev=1747559&view=auto ============================================================================== --- sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingTest.java (added) +++ sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingTest.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -0,0 +1,172 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sis.openoffice; + +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.IllegalArgumentException; +import org.apache.sis.internal.referencing.Formulas; +import org.apache.sis.internal.referencing.PositionalAccuracyConstant; +import org.apache.sis.test.DependsOn; +import org.apache.sis.test.TestCase; +import org.junit.BeforeClass; +import org.junit.AfterClass; +import org.junit.Test; + +import static org.junit.Assert.*; +import static org.junit.Assume.assumeFalse; + + +/** + * Tests {@link Referencing}. + * + * @author Martin Desruisseaux (IRD, Geomatys) + * @since 0.8 + * @version 0.8 + * @module + */ +@DependsOn(TransformerTest.class) +public final strictfp class ReferencingTest extends TestCase { + /** + * A dummy {@code XPropertySet} instance for testing purpose. + * The current implementation sets the value to {@code null} since {@link Referencing} ignores the properties. + * But that value could be changed if the properties are not ignored anymore in a future SIS version. + */ + private static final XPropertySet properties = null; + + /** + * The instance to use for testing purpose. + */ + private static Referencing instance; + + /** + * Creates a {@link Referencing} instance to use for all tests. + */ + @BeforeClass + public static void createReferencingInstance() { + instance = new Referencing(); + instance.setLocale(new com.sun.star.lang.Locale("en", "US", null)); + } + + /** + * Disposes the {@link Referencing} instance after all tests completed. + */ + @AfterClass + public static void disposeReferencingInstance() { + instance = null; + } + + /** + * Tests {@link Referencing#getName(XPropertySet, String)}. + */ + @Test + public void testGetName() { + assertEquals("Using a simple code.", "WGS 84", instance.getName(properties, "EPSG:4326")); + assertEquals("Using a URN.", "WGS 84", instance.getName(properties, "urn:ogc:def:crs:epsg::4326")); + assertEquals("Using a HTTP code.", "WGS 84", instance.getName(properties, "http://www.opengis.net/gml/srs/epsg.xml#4326")); + assertEquals("Cached value.", "WGS 84", instance.getName(properties, "EPSG:4326")); + assertEquals("URN for a datum.", "World Geodetic System 1984", + instance.getName(properties, "urn:ogc:def:datum:epsg::6326")); + } + + /** + * Tests {@link Referencing#getAxis(XPropertySet, String, int)}. + */ + @Test + public void testGetAxis() { + assertEquals("Latitude (°)", instance.getAxis(properties, "EPSG:4326", 1)); + assertEquals("Longitude (°)", instance.getAxis(properties, "EPSG:4326", 2)); + assertEquals("Index 3 is out of bounds.", instance.getAxis(properties, "EPSG:4326", 3)); + assertEquals("Expected “urn:ogc:def:datum:epsg::6326” to reference an instance of ‘CoordinateReferenceSystem’, " + + "but found an instance of ‘GeodeticDatum’.", instance.getAxis(properties, "urn:ogc:def:datum:epsg::6326", 1)); + } + + /** + * Tests {@link Referencing#getGeographicArea(XPropertySet, String)}. + */ + @Test + public void testGetGeographicArea() { + final double[][] bbox = instance.getGeographicArea(properties, "EPSG:32620"); // UTM zone 20 + assertEquals(2, bbox.length); + assumeFalse(Double.isNaN(bbox[0][0])); // NaN if EPSG dataset is not installed. + assertArrayEquals("Upper left corner", new double[] {84, -66}, bbox[0], STRICT); + assertArrayEquals("Lower right corner", new double[] { 0, -60}, bbox[1], STRICT); + } + + /** + * Tests {@link Referencing#getAccuracy(XPropertySet, String, String, double[][])}. + * This test asks for a transformation from NAD83 to WGS84. + */ + @Test + public void testGetAccuracy() { + final double accuracy = instance.getAccuracy(properties, "EPSG:4269", "EPSG:4326", new double[][] { + {37.783, -122.417}, // San-Francisco + {40.713, -74.006}, // New-York + {34.050, -118.250}, // Los Angeles + {29.763, -95.383}, // Houston + {41.837, -87.685}, // Chicago + {25.775, -80.209}, // Miami + }); + assertTrue("Accuracy = " + accuracy, + accuracy > Formulas.LINEAR_TOLERANCE && + accuracy <= PositionalAccuracyConstant.UNKNOWN_ACCURACY); + } + + /** + * Tests {@link Referencing#transformCoordinates(XPropertySet, String, String, double[][])}. + */ + @Test + public void testTransformCoordinates() { + final double[][] points = { + new double[] {30, 20, 4}, + new double[] {34, 17, -3}, + new double[] {27, -12, 12}, + new double[] {32, 23, -1} + }; + final double[][] result = { + new double[] {30, 20}, + new double[] {34, 17}, + new double[] {27, -12}, + new double[] {32, 23} + }; + TransformerTest.assertPointsEqual(result, + instance.transformCoordinates(properties, "EPSG:4979", "EPSG:4326", points), STRICT); + } + + /** + * Tests {@link Referencing#parseAngle(XPropertySet, String, Object)}. + * + * @throws IllegalArgumentException if the pattern used by the test is not a string or void. + */ + @Test + public void testParseAngle() throws IllegalArgumentException { + assertEquals(43.50, instance.parseAngle(properties, "43°30'", "D°MM.m'"), STRICT); + assertEquals(43.50, instance.parseAngle(properties, "4330", "DMM"), STRICT); + assertEquals(-3.25, instance.parseAngle(properties, "-3°15'", "D°MM.m'"), STRICT); + } + + /** + * Tests {@link Referencing#formatAngle(XPropertySet, String, Object)}. + * + * @throws IllegalArgumentException if the pattern used by the test is not a string or void. + */ + @Test + public void testFormatAngle() throws IllegalArgumentException { + assertEquals("43°30.0'", instance.formatAngle(properties, 43.50, "D°MM.m'")); + assertEquals("4330", instance.formatAngle(properties, 43.50, "DMM")); + assertEquals("-3°15.0'", instance.formatAngle(properties, -3.25, "D°MM.m'")); + } +} Propchange: sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/ReferencingTest.java ------------------------------------------------------------------------------ svn:mime-type = text/plain;charset=UTF-8 Added: sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/TransformerTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/TransformerTest.java?rev=1747559&view=auto ============================================================================== --- sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/TransformerTest.java (added) +++ sis/branches/JDK8/application/sis-openoffice/src/test/java/org/apache/sis/openoffice/TransformerTest.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -0,0 +1,129 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.sis.openoffice; + +import org.opengis.util.FactoryException; +import org.opengis.metadata.extent.GeographicBoundingBox; +import org.apache.sis.referencing.CommonCRS; +import org.apache.sis.storage.DataStoreException; +import org.apache.sis.test.DependsOnMethod; +import org.apache.sis.test.TestCase; +import org.junit.BeforeClass; +import org.junit.AfterClass; +import org.junit.Test; + +import static org.junit.Assert.*; +import static org.junit.Assume.assumeTrue; + + +/** + * Tests {@link Transformer}. + * + * @author Martin Desruisseaux (Geomatys) + * @since 0.8 + * @version 0.8 + * @module + */ +public final strictfp class TransformerTest extends TestCase { + /** + * The instance to use for testing purpose. + */ + private static Referencing caller; + + /** + * Creates a {@link Referencing} instance to use for all tests. + */ + @BeforeClass + public static void createReferencingInstance() { + caller = new Referencing(); + caller.setLocale(new com.sun.star.lang.Locale("en", "US", null)); + } + + /** + * Disposes the {@link Referencing} instance after all tests completed. + */ + @AfterClass + public static void disposeReferencingInstance() { + caller = null; + } + + /** + * Asserts that the transformation result is equals to the expected result. + */ + static void assertPointsEqual(final double[][] expected, final double[][] actual, final double tolerance) { + assertNotSame("transform", expected, actual); + assertEquals("transform.length", expected.length, actual.length); + for (int i=0; i getAuthorityCodes(Class type) { + final boolean pm = type.isAssignableFrom(PrimeMeridian.class); + final boolean ellipsoid = type.isAssignableFrom(Ellipsoid .class); + final boolean datum = type.isAssignableFrom(GeodeticDatum.class); final boolean geographic = type.isAssignableFrom(GeographicCRS.class); final boolean geocentric = type.isAssignableFrom(GeocentricCRS.class); final boolean projected = type.isAssignableFrom(ProjectedCRS .class); final Set codes = new LinkedHashSet<>(); + if (pm) codes.add(StandardDefinitions.GREENWICH); for (final CommonCRS crs : CommonCRS.values()) { + if (ellipsoid) add(codes, crs.ellipsoid); + if (datum) add(codes, crs.datum); + if (geocentric) add(codes, crs.geocentric); if (geographic) { add(codes, crs.geographic); add(codes, crs.geo3D); } - if (geocentric) { - add(codes, crs.geocentric); - } if (projected && (crs.northUTM != 0 || crs.southUTM != 0)) { for (int zone = crs.firstZone; zone <= crs.lastZone; zone++) { if (crs.northUTM != 0) codes.add(Integer.toString(crs.northUTM + zone)); @@ -126,10 +141,13 @@ final class EPSGFactoryFallback extends } } } - if (type.isAssignableFrom(VerticalCRS.class)) { + final boolean vertical = type.isAssignableFrom(VerticalCRS .class); + final boolean vdatum = type.isAssignableFrom(VerticalDatum.class); + if (vertical || vdatum) { for (final CommonCRS.Vertical candidate : CommonCRS.Vertical.values()) { if (candidate.isEPSG) { - codes.add(Integer.toString(candidate.crs)); + if (vertical) codes.add(Integer.toString(candidate.crs)); + if (vdatum) codes.add(Integer.toString(candidate.datum)); } } } @@ -147,11 +165,55 @@ final class EPSGFactoryFallback extends } /** + * Returns a prime meridian for the given EPSG code. + */ + @Override + public PrimeMeridian createPrimeMeridian(final String code) throws NoSuchAuthorityCodeException { + return (PrimeMeridian) predefined(code, PRIME_MERIDIAN); + } + + /** + * Returns an ellipsoid for the given EPSG code. + */ + @Override + public Ellipsoid createEllipsoid(final String code) throws NoSuchAuthorityCodeException { + return (Ellipsoid) predefined(code, ELLIPSOID); + } + + /** + * Returns a datum for the given EPSG code. + */ + @Override + public Datum createDatum(final String code) throws NoSuchAuthorityCodeException { + return (Datum) predefined(code, DATUM); + } + + /** * Returns a coordinate reference system for the given EPSG code. This method is invoked * as a fallback when {@link CRS#forCode(String)} can not create a CRS for a given code. */ @Override + public CoordinateReferenceSystem createCoordinateReferenceSystem(final String code) throws NoSuchAuthorityCodeException { + return (CoordinateReferenceSystem) predefined(code, CRS); + } + + /** + * Returns a coordinate reference system, datum or ellipsoid for the given EPSG code. + */ + @Override public IdentifiedObject createObject(final String code) throws NoSuchAuthorityCodeException { + return predefined(code, -1); + } + + /** + * Implementation of the {@code createFoo(String)} methods. + * + * @param code the EPSG code. + * @param kind any combination of {@link #CRS}, {@link #DATUM}, {@link #ELLIPSOID} or {@link #PRIME_MERIDIAN} bits. + * @return the requested object. + * @throws NoSuchAuthorityCodeException if no matching object has been found. + */ + private IdentifiedObject predefined(final String code, final int kind) throws NoSuchAuthorityCodeException { NumberFormatException cause = null; try { /* @@ -164,32 +226,55 @@ final class EPSGFactoryFallback extends final int n = Integer.parseInt(CharSequences.trimWhitespaces(code, code.lastIndexOf(DefaultNameSpace.DEFAULT_SEPARATOR) + 1, code.length()).toString()); + if ((kind & PRIME_MERIDIAN) != 0 && n == 8901) { + return CommonCRS.WGS84.primeMeridian(); + } for (final CommonCRS crs : CommonCRS.values()) { - if (n == crs.geographic) return crs.geographic(); - if (n == crs.geocentric) return crs.geocentric(); - if (n == crs.geo3D) return crs.geographic3D(); - final double latitude; - int zone; - if (crs.northUTM != 0 && (zone = n - crs.northUTM) >= crs.firstZone && zone <= crs.lastZone) { - latitude = +1; - } else if (crs.southUTM != 0 && (zone = n - crs.southUTM) >= crs.firstZone && zone <= crs.lastZone) { - latitude = -1; - } else { - continue; + /* + * In a complete EPSG dataset we could have an ambiguity below because the same code can be used + * for datum, ellipsoid and CRS objects. However in the particular case of this EPSG-subset, we + * ensured that there is no such collision - see CommonCRSTest.ensureNoCodeCollision(). + */ + if ((kind & ELLIPSOID) != 0 && n == crs.ellipsoid) return crs.ellipsoid(); + if ((kind & DATUM) != 0 && n == crs.datum) return crs.datum(); + if ((kind & CRS) != 0) { + if (n == crs.geographic) return crs.geographic(); + if (n == crs.geocentric) return crs.geocentric(); + if (n == crs.geo3D) return crs.geographic3D(); + final double latitude; + int zone; + if (crs.northUTM != 0 && (zone = n - crs.northUTM) >= crs.firstZone && zone <= crs.lastZone) { + latitude = +1; + } else if (crs.southUTM != 0 && (zone = n - crs.southUTM) >= crs.firstZone && zone <= crs.lastZone) { + latitude = -1; + } else { + continue; + } + return crs.UTM(latitude, TransverseMercator.centralMeridian(zone)); } - return crs.UTM(latitude, TransverseMercator.centralMeridian(zone)); } - for (final CommonCRS.Vertical candidate : CommonCRS.Vertical.values()) { - if (candidate.isEPSG && candidate.crs == n) { - return candidate.crs(); + if ((kind & (DATUM | CRS)) != 0) { + for (final CommonCRS.Vertical candidate : CommonCRS.Vertical.values()) { + if (candidate.isEPSG) { + if ((kind & DATUM) != 0 && candidate.datum == n) return candidate.datum(); + if ((kind & CRS) != 0 && candidate.crs == n) return candidate.crs(); + } } } } catch (NumberFormatException e) { cause = e; } - final String authority = Constants.EPSG + " subset"; + final Class type; + switch (kind) { + case CRS: type = CoordinateReferenceSystem.class; break; + case DATUM: type = Datum.class; break; + case ELLIPSOID: type = Ellipsoid.class; break; + case PRIME_MERIDIAN: type = PrimeMeridian.class; break; + default: type = IdentifiedObject.class; break; + } + final String authority = Constants.EPSG + "-subset"; final NoSuchAuthorityCodeException e = new NoSuchAuthorityCodeException(Errors.format( - Errors.Keys.NoSuchAuthorityCode_3, authority, CoordinateReferenceSystem.class, code), authority, code); + Errors.Keys.NoSuchAuthorityCode_3, authority, type, code), authority, code); e.initCause(cause); throw e; } Modified: sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/CommonCRSTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/CommonCRSTest.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/CommonCRSTest.java [UTF-8] (original) +++ sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/CommonCRSTest.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -17,6 +17,8 @@ package org.apache.sis.referencing; import java.util.Date; +import java.util.Map; +import java.util.HashMap; import org.opengis.parameter.ParameterValueGroup; import org.opengis.referencing.crs.TemporalCRS; import org.opengis.referencing.crs.VerticalCRS; @@ -49,7 +51,7 @@ import static org.apache.sis.test.TestUt * * @author Martin Desruisseaux (IRD, Geomatys) * @since 0.4 - * @version 0.7 + * @version 0.8 * @module */ @DependsOn({ @@ -64,6 +66,58 @@ public final strictfp class CommonCRSTes private static final double DAY_LENGTH = 24 * 60 * 60 * 1000; /** + * Verifies that the same EPSG code is not used for two objects. Collisions are not allowed between + * {@code geographic}, {@code geocentric}, {@code geo3D} and all UTM projections. Strictly speaking + * all the above-cited codes may collide with {@code datum} and {@code ellipsoid}, but we nevertheless + * avoid those collisions in order to simplify {@link EPSGFactoryFallback#createObject(String)} implementation. + */ + @Test + public void ensureNoCodeCollision() { + final Map> codes = new HashMap<>(); + final CommonCRS[] values = CommonCRS.values(); + for (final CommonCRS crs : values) { + assertNoCodeCollision(codes, crs, crs.geographic); + assertNoCodeCollision(codes, crs, crs.geocentric); + assertNoCodeCollision(codes, crs, crs.geo3D); + for (int zone = crs.firstZone; zone <= crs.lastZone; zone++) { + if (crs.northUTM != 0) assertNoCodeCollision(codes, crs, crs.northUTM + zone); + if (crs.southUTM != 0) assertNoCodeCollision(codes, crs, crs.southUTM + zone); + } + } + final CommonCRS.Vertical[] vertical = CommonCRS.Vertical.values(); + for (final CommonCRS.Vertical crs : vertical) { + if (crs.isEPSG) { + assertNoCodeCollision(codes, crs, crs.crs); + } + } + /* + * Following restrictions are not strictly required, but their enforcement + * simplifies the EPSGFactoryFallback.createObject(String) implementation. + */ + assertNull(codes.put(Integer.valueOf(StandardDefinitions.GREENWICH), CommonCRS.WGS84)); + for (final CommonCRS crs : values) assertNull (crs.name(), codes.get(Integer.valueOf(crs.ellipsoid))); + for (final CommonCRS crs : values) assertNotSame(crs.name(), crs, codes.put(Integer.valueOf(crs.ellipsoid), crs)); + for (final CommonCRS crs : values) assertNull (crs.name(), codes.get(Integer.valueOf(crs.datum))); + for (final CommonCRS.Vertical crs : vertical) { + if (crs.isEPSG) { + assertNull(crs.name(), codes.get(Integer.valueOf(crs.datum))); + } + } + } + + /** + * Helper method for {@link #ensureNoCodeCollision()} only. + */ + private static void assertNoCodeCollision(final Map> codes, final Enum crs, final int n) { + if (n != 0) { + final Enum existing = codes.put(n, crs); + if (existing != null) { + fail(existing + " and " + crs + " both use the same EPSG:" + n + " code."); + } + } + } + + /** * Tests the {@link CommonCRS#geographic()} method. */ @Test Modified: sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java URL: http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java?rev=1747559&r1=1747558&r2=1747559&view=diff ============================================================================== --- sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java [UTF-8] (original) +++ sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/referencing/EPSGFactoryFallbackTest.java [UTF-8] Thu Jun 9 15:44:57 2016 @@ -26,6 +26,9 @@ import org.opengis.referencing.crs.Geogr import org.opengis.referencing.crs.GeocentricCRS; import org.opengis.referencing.crs.CoordinateReferenceSystem; import org.opengis.referencing.crs.CRSAuthorityFactory; +import org.opengis.referencing.datum.Datum; +import org.opengis.referencing.datum.Ellipsoid; +import org.opengis.referencing.datum.PrimeMeridian; import org.apache.sis.util.ComparisonMode; import org.apache.sis.util.Utilities; @@ -44,7 +47,7 @@ import static org.apache.sis.test.Assert * * @author Martin Desruisseaux (Geomatys) * @since 0.7 - * @version 0.7 + * @version 0.8 * @module */ @DependsOn({ @@ -59,6 +62,12 @@ public final strictfp class EPSGFactoryF */ @Test public void testGetAuthorityCodes() throws FactoryException { + assertSetEquals(Arrays.asList(StandardDefinitions.GREENWICH), + EPSGFactoryFallback.INSTANCE.getAuthorityCodes(PrimeMeridian.class)); + assertSetEquals(Arrays.asList("7030", "7043", "7019", "7008", "7022", "7048"), + EPSGFactoryFallback.INSTANCE.getAuthorityCodes(Ellipsoid.class)); + assertSetEquals(Arrays.asList("6326", "6322", "6269", "6267", "6258", "6230", "6047", "5100", "5103"), + EPSGFactoryFallback.INSTANCE.getAuthorityCodes(Datum.class)); assertSetEquals(Arrays.asList("4978", "4984", "4936"), EPSGFactoryFallback.INSTANCE.getAuthorityCodes(GeocentricCRS.class)); assertSetEquals(Arrays.asList("4326", "4322", "4047", "4269", "4267", "4258", "4230", "4979", "4985", "4937"), @@ -68,6 +77,46 @@ public final strictfp class EPSGFactoryF } /** + * Tests {@link EPSGFactoryFallback#createPrimeMeridian(String)}. + * + * @throws FactoryException if a prime meridian can not be constructed. + */ + @Test + public void testCreatePrimeMeridian() throws FactoryException { + verifyCreatePrimeMeridian(CommonCRS.WGS84.primeMeridian(), StandardDefinitions.GREENWICH); + } + + /** + * Tests {@link EPSGFactoryFallback#createEllipsoid(String)}. + * + * @throws FactoryException if an ellipsoid can not be constructed. + */ + @Test + public void testCreateEllipsoid() throws FactoryException { + verifyCreateEllipsoid(CommonCRS.WGS84 .ellipsoid(), "7030"); + verifyCreateEllipsoid(CommonCRS.WGS72 .ellipsoid(), "7043"); + verifyCreateEllipsoid(CommonCRS.NAD83 .ellipsoid(), "7019"); + verifyCreateEllipsoid(CommonCRS.NAD27 .ellipsoid(), "7008"); + verifyCreateEllipsoid(CommonCRS.ED50 .ellipsoid(), "7022"); + verifyCreateEllipsoid(CommonCRS.SPHERE.ellipsoid(), "7048"); + } + + /** + * Tests {@link EPSGFactoryFallback#createEllipsoid(String)}. + * + * @throws FactoryException if an ellipsoid can not be constructed. + */ + @Test + public void testCreateDatum() throws FactoryException { + verifyCreateDatum(CommonCRS.WGS84 .datum(), "6326"); + verifyCreateDatum(CommonCRS.WGS72 .datum(), "6322"); + verifyCreateDatum(CommonCRS.NAD83 .datum(), "6269"); + verifyCreateDatum(CommonCRS.NAD27 .datum(), "6267"); + verifyCreateDatum(CommonCRS.ED50 .datum(), "6230"); + verifyCreateDatum(CommonCRS.SPHERE.datum(), "6047"); + } + + /** * Tests {@link EPSGFactoryFallback#createCoordinateReferenceSystem(String)}. * * @throws FactoryException if a CRS can not be constructed. @@ -77,30 +126,55 @@ public final strictfp class EPSGFactoryF */ @Test public void testCreateCRS() throws FactoryException { - verifyCreate(CommonCRS.WGS84 .geographic(), "4326"); - verifyCreate(CommonCRS.WGS72 .geographic(), "4322"); - verifyCreate(CommonCRS.SPHERE.geographic(), "4047"); - verifyCreate(CommonCRS.NAD83 .geographic(), "4269"); - verifyCreate(CommonCRS.NAD27 .geographic(), "4267"); - verifyCreate(CommonCRS.ETRS89.geographic(), "4258"); - verifyCreate(CommonCRS.ED50 .geographic(), "4230"); - verifyCreate(CommonCRS.WGS84 .geocentric(), "4978"); - verifyCreate(CommonCRS.WGS72 .geocentric(), "4984"); - verifyCreate(CommonCRS.ETRS89.geocentric(), "4936"); - verifyCreate(CommonCRS.WGS84 .geographic(), "EPSG:4326"); - verifyCreate(CommonCRS.WGS72 .geographic(), "EPSG::4322"); - verifyCreate(CommonCRS.WGS84 .geographic3D(), "4979"); - verifyCreate(CommonCRS.WGS72 .geographic3D(), "4985"); - verifyCreate(CommonCRS.ETRS89.geographic3D(), "4937"); - verifyCreate(CommonCRS.Vertical.MEAN_SEA_LEVEL.crs(), "5714"); - verifyCreate(CommonCRS.Vertical.DEPTH.crs(), "5715"); + verifyCreateCRS(CommonCRS.WGS84 .geographic(), "4326"); + verifyCreateCRS(CommonCRS.WGS72 .geographic(), "4322"); + verifyCreateCRS(CommonCRS.SPHERE.geographic(), "4047"); + verifyCreateCRS(CommonCRS.NAD83 .geographic(), "4269"); + verifyCreateCRS(CommonCRS.NAD27 .geographic(), "4267"); + verifyCreateCRS(CommonCRS.ETRS89.geographic(), "4258"); + verifyCreateCRS(CommonCRS.ED50 .geographic(), "4230"); + verifyCreateCRS(CommonCRS.WGS84 .geocentric(), "4978"); + verifyCreateCRS(CommonCRS.WGS72 .geocentric(), "4984"); + verifyCreateCRS(CommonCRS.ETRS89.geocentric(), "4936"); + verifyCreateCRS(CommonCRS.WGS84 .geographic(), "EPSG:4326"); + verifyCreateCRS(CommonCRS.WGS72 .geographic(), "EPSG::4322"); + verifyCreateCRS(CommonCRS.WGS84 .geographic3D(), "4979"); + verifyCreateCRS(CommonCRS.WGS72 .geographic3D(), "4985"); + verifyCreateCRS(CommonCRS.ETRS89.geographic3D(), "4937"); + verifyCreateCRS(CommonCRS.Vertical.MEAN_SEA_LEVEL.crs(), "5714"); + verifyCreateCRS(CommonCRS.Vertical.DEPTH.crs(), "5715"); + } + + /** + * Asserts that the result of {@link EPSGFactoryFallback#createObject(String)} is the given prime meridian. + */ + private static void verifyCreatePrimeMeridian(final PrimeMeridian expected, final String code) throws FactoryException { + assertSame(code, expected, EPSGFactoryFallback.INSTANCE.createPrimeMeridian(code)); + assertSame(code, expected, EPSGFactoryFallback.INSTANCE.createObject(code)); + } + + /** + * Asserts that the result of {@link EPSGFactoryFallback#createObject(String)} is the given ellipsoid. + */ + private static void verifyCreateEllipsoid(final Ellipsoid expected, final String code) throws FactoryException { + assertSame(code, expected, EPSGFactoryFallback.INSTANCE.createEllipsoid(code)); + assertSame(code, expected, EPSGFactoryFallback.INSTANCE.createObject(code)); + } + + /** + * Asserts that the result of {@link EPSGFactoryFallback#createObject(String)} is the given datum. + */ + private static void verifyCreateDatum(final Datum expected, final String code) throws FactoryException { + assertSame(code, expected, EPSGFactoryFallback.INSTANCE.createDatum(code)); + assertSame(code, expected, EPSGFactoryFallback.INSTANCE.createObject(code)); } /** - * Asserts that the result of {@link CommonCRS#forCode(String, String, FactoryException)} is the given CRS. + * Asserts that the result of {@link EPSGFactoryFallback#createObject(String)} is the given CRS. */ - private static void verifyCreate(final SingleCRS expected, final String code) throws FactoryException { + private static void verifyCreateCRS(final SingleCRS expected, final String code) throws FactoryException { assertSame(code, expected, EPSGFactoryFallback.INSTANCE.createCoordinateReferenceSystem(code)); + assertSame(code, expected, EPSGFactoryFallback.INSTANCE.createObject(code)); } /**