Author: desruisseaux
Date: Fri Mar  6 15:16:29 2015
New Revision: 1664652

URL: http://svn.apache.org/r1664652
Log:
Added JUnit tests for MapProjectionParameters.

Added:
    
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
   (with props)
Modified:
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionDescriptor.java
    
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java
    
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java?rev=1664652&r1=1664651&r2=1664652&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/DefaultParameterDescriptorGroup.java
 [UTF-8] Fri Mar  6 15:16:29 2015
@@ -154,7 +154,24 @@ public class DefaultParameterDescriptorG
     {
         super(properties, minimumOccurs, maximumOccurs);
         ArgumentChecks.ensureNonNull("parameters", parameters);
-        parameters = parameters.clone();
+        verifyNames(properties, parameters = parameters.clone());
+        descriptors = asList(parameters);
+    }
+
+    /**
+     * Creates a mandatory parameter group without cloning the given array. 
This constructor shall
+     * be used only when we know that the given array is already a copy of the 
user-provided array.
+     */
+    DefaultParameterDescriptorGroup(final Map<String,?> properties, final 
GeneralParameterDescriptor[] parameters) {
+        super(properties, 1, 1);
+        verifyNames(properties, parameters.clone());
+        descriptors = asList(parameters);
+    }
+
+    /**
+     * Ensures that the given name array does not contain duplicate values.
+     */
+    private static void verifyNames(final Map<String,?> properties, final 
GeneralParameterDescriptor[] parameters) {
         for (int i=0; i<parameters.length; i++) {
             ArgumentChecks.ensureNonNullElement("parameters", i, parameters);
             final String name = parameters[i].getName().getCode();
@@ -166,7 +183,6 @@ public class DefaultParameterDescriptorG
                 }
             }
         }
-        descriptors = asList(parameters);
     }
 
     /**

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionDescriptor.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionDescriptor.java?rev=1664652&r1=1664651&r2=1664652&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionDescriptor.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/MapProjectionDescriptor.java
 [UTF-8] Fri Mar  6 15:16:29 2015
@@ -42,7 +42,7 @@ import org.apache.sis.util.Workaround;
  *       {@code "standard_parallel_1"} and {@code "standard_parallel_2"}</li>
  * </ul>
  *
- * The main purpose of this class is to supported transparently the NetCDF 
ways to express some parameter values.
+ * The main purpose of this class is to support transparently the NetCDF ways 
to express some parameter values.
  *
  * @author  Martin Desruisseaux (Geomatys)
  * @since   0.6
@@ -93,7 +93,7 @@ final class MapProjectionDescriptor exte
      * @param parameters The "real" parameters.
      */
     MapProjectionDescriptor(final Map<String,?> properties, final 
ParameterDescriptor<?>[] parameters) {
-        super(properties, 1, 1, addAxisLength(parameters));
+        super(properties, addAxisLengths(parameters));
         boolean hasP1 = false;
         boolean hasP2 = false;
         for (final ParameterDescriptor<?> param : parameters) {
@@ -119,7 +119,7 @@ final class MapProjectionDescriptor exte
      * ("Relax constraint on placement of this()/super() call in 
constructors").
      */
     @Workaround(library="JDK", version="1.7")
-    private static ParameterDescriptor<?>[] addAxisLength(final 
ParameterDescriptor<?>[] parameters) {
+    private static ParameterDescriptor<?>[] addAxisLengths(final 
ParameterDescriptor<?>[] parameters) {
         final ParameterDescriptor<?>[] ext = new 
ParameterDescriptor<?>[parameters.length + 2];
         ext[0] = MapProjection.SEMI_MAJOR;
         ext[1] = MapProjection.SEMI_MINOR;

Modified: 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java?rev=1664652&r1=1664651&r2=1664652&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/parameter/ParameterBuilder.java
 [UTF-8] Fri Mar  6 15:16:29 2015
@@ -369,6 +369,11 @@ public class ParameterBuilder extends Bu
      *     <td>Array of 1 or 2 elements mapped to {@code 
"standard_parallel_1"} and {@code "standard_parallel_2"}.</td></tr>
      * </table>
      *
+     * <div class="note"><b>Note:</b>
+     * When the {@code "earth_radius"} parameter is read, its value is the
+     * {@linkplain 
org.apache.sis.referencing.datum.DefaultEllipsoid#getAuthalicRadius() authalic 
radius}
+     * computed from the semi-major and semi-minor axis lengths.</div>
+     *
      * Map projection parameter groups always have a {@linkplain 
DefaultParameterDescriptorGroup#getMinimumOccurs()
      * minimum} and {@linkplain 
DefaultParameterDescriptorGroup#getMaximumOccurs() maximum occurrence} of 1,
      * regardless the value given to {@link #setRequired(boolean)}.

Added: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java?rev=1664652&view=auto
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
 (added)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
 [UTF-8] Fri Mar  6 15:16:29 2015
@@ -0,0 +1,153 @@
+/*
+ * 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.parameter;
+
+import java.util.Map;
+import java.util.Collections;
+import org.opengis.parameter.ParameterDescriptor;
+import org.opengis.parameter.ParameterValue;
+import org.opengis.parameter.ParameterValueGroup;
+import org.apache.sis.test.DependsOn;
+import org.apache.sis.test.TestCase;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+
+/**
+ * Tests the {@link MapProjectionParameters} class.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ * @since   0.6
+ * @version 0.6
+ * @module
+ */
+@DependsOn(ParametersTest.class)
+public final strictfp class MapProjectionParametersTest extends TestCase {
+    /**
+     * Creates a map projection descriptor with semi-major/minor axis lengths
+     * and the given amount of standard parallels.
+     *
+     * @param numStandardParallels 1 or 2 for including the standard parallels.
+     */
+    @SuppressWarnings("fallthrough")
+    private static MapProjectionDescriptor createDescriptor(final int 
numStandardParallels) {
+        final ParameterDescriptor<?>[] parameters = new 
ParameterDescriptor<?>[numStandardParallels + 1];
+        switch (numStandardParallels) {
+            default: throw new IllegalArgumentException();
+            case 2: parameters[2] = parameter("standard_parallel_2");   // 
Fall through
+            case 1: parameters[1] = parameter("standard_parallel_1");   // 
Fall through
+            case 0: parameters[0] = parameter("central_meridian");
+                    break;
+        }
+        return new MapProjectionDescriptor(name("Lambert Conic Conformal 
(2SP)"), parameters);
+    }
+
+    /** Creates a parameter of the given name. */
+    private static DefaultParameterDescriptor<?> parameter(final String name) {
+        return new DefaultParameterDescriptor<>(name(name), 1, 1, 
Double.class, null, null, null);
+    }
+
+    /** Returns properties map for an object of the given name. */
+    private static Map<String,String> name(final String name) {
+        return Collections.singletonMap(MapProjectionDescriptor.NAME_KEY, 
name);
+    }
+
+    /**
+     * Tests the {@code "earth_radius"} dynamic parameter.
+     */
+    @Test
+    public void testEarthRadius() {
+        final MapProjectionDescriptor descriptor = createDescriptor(0);
+        final ParameterValueGroup parameters = descriptor.createValue();
+
+        parameters.parameter("semi_major").setValue(6378137.000); // WGS84
+        parameters.parameter("semi_minor").setValue(6356752.314);
+        assertEquals(6371007, 
parameters.parameter("earth_radius").doubleValue(), 0.5); // Authalic radius.
+        assertEquals(6378137, parameters.parameter("semi_major")  
.doubleValue(), 0.5);
+        assertEquals(6356752, parameters.parameter("semi_minor")  
.doubleValue(), 0.5);
+
+        parameters.parameter("earth_radius").setValue(6371000);
+        assertEquals(6371000, 
parameters.parameter("earth_radius").doubleValue(), 0.0);
+        assertEquals(6371000, parameters.parameter("semi_major")  
.doubleValue(), 0.0);
+        assertEquals(6371000, parameters.parameter("semi_minor")  
.doubleValue(), 0.0);
+    }
+
+    /**
+     * Tests the {@code "inverse_flattening"} dynamic parameter.
+     */
+    @Test
+    public void testInverseFlattening() {
+        final MapProjectionDescriptor descriptor = createDescriptor(0);
+        final ParameterValueGroup parameters = descriptor.createValue();
+
+        parameters.parameter("semi_major").setValue(6378206.4); // Clarke 1866
+        parameters.parameter("semi_minor").setValue(6356583.8);
+        assertEquals(294.97870, 
parameters.parameter("inverse_flattening").doubleValue(), 0.00001);
+        assertEquals(6378206.4, parameters.parameter("semi_major")        
.doubleValue(), 0.5);
+        assertEquals(6356583.8, parameters.parameter("semi_minor")        
.doubleValue(), 0.5);
+
+        parameters.parameter("semi_major").setValue(6378137.000); // WGS84
+        parameters.parameter("inverse_flattening").setValue(298.257223563);
+        assertEquals(298.257, 
parameters.parameter("inverse_flattening").doubleValue(), 0.001);
+        assertEquals(6378137, parameters.parameter("semi_major")        
.doubleValue(), 0.5);
+        assertEquals(6356752, parameters.parameter("semi_minor")        
.doubleValue(), 0.5);
+    }
+
+    /**
+     * Tests the inverse flattening dynamic parameter set after the semi-major 
axis length.
+     * This method tests actually the capability to compute the semi-minor 
axis length.
+     */
+    @Test
+    public void testSemiMinor() {
+        final MapProjectionDescriptor descriptor = createDescriptor(0);
+        final ParameterValueGroup parameters = descriptor.createValue();
+
+        parameters.parameter("semi_major").setValue(6378137.000); // WGS84
+        parameters.parameter("inverse_flattening").setValue(298.257223563);
+        assertEquals(298.257, 
parameters.parameter("inverse_flattening").doubleValue(), 0.001);
+        assertEquals(6378137, parameters.parameter("semi_major")        
.doubleValue(), 0.5);
+        assertEquals(6356752, parameters.parameter("semi_minor")        
.doubleValue(), 0.5);
+    }
+
+    /**
+     * Tests the standard parallel dynamic parameter.
+     */
+    @Test
+    public void testStandardParallel() {
+        final MapProjectionDescriptor descriptor = createDescriptor(2);
+        final ParameterValueGroup parameters = descriptor.createValue();
+        final ParameterValue<?> p  = parameters.parameter("standard_parallel"  
);
+        final ParameterValue<?> p1 = 
parameters.parameter("standard_parallel_1");
+        final ParameterValue<?> p2 = 
parameters.parameter("standard_parallel_2");
+        assertSame(p,  parameters.parameter("standard_parallel"  ));
+        assertSame(p1, parameters.parameter("standard_parallel_1"));
+        assertSame(p2, parameters.parameter("standard_parallel_2"));
+
+        /* Empty */      assertArrayEquals(new double[] {     }, 
p.doubleValueList(), 0.0);
+        p1.setValue(40); assertArrayEquals(new double[] {40   }, 
p.doubleValueList(), 0.0);
+        p2.setValue(60); assertArrayEquals(new double[] {40,60}, 
p.doubleValueList(), 0.0);
+
+        p.setValue(new double[] {30,40});
+        assertEquals(30, p1.doubleValue(), 0.0);
+        assertEquals(40, p2.doubleValue(), 0.0);
+
+        p.setValue(new double[] {45});
+        assertEquals(45,         p1.doubleValue(), 0.0);
+        assertEquals(Double.NaN, p2.doubleValue(), 0.0);
+    }
+}

Propchange: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/parameter/MapProjectionParametersTest.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain;charset=UTF-8

Modified: 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
URL: 
http://svn.apache.org/viewvc/sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java?rev=1664652&r1=1664651&r2=1664652&view=diff
==============================================================================
--- 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
 [UTF-8] (original)
+++ 
sis/branches/JDK8/core/sis-referencing/src/test/java/org/apache/sis/test/suite/ReferencingTestSuite.java
 [UTF-8] Fri Mar  6 15:16:29 2015
@@ -78,6 +78,7 @@ import org.junit.BeforeClass;
     org.apache.sis.parameter.MatrixParametersTest.class,
     org.apache.sis.parameter.MatrixParametersAlphaNumTest.class,
     org.apache.sis.parameter.TensorValuesTest.class,
+    org.apache.sis.parameter.MapProjectionParametersTest.class,
 
     org.apache.sis.referencing.operation.DefaultFormulaTest.class,
     org.apache.sis.referencing.operation.DefaultOperationMethodTest.class,


Reply via email to