This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch geoapi-4.0
in repository https://gitbox.apache.org/repos/asf/sis.git

commit 0186afd021c0964366bbcdf9db347e29322ea66e
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Fri May 22 10:44:57 2026 +0200

    `getStandardType()` returns `ParameterizedType` where applicable.
---
 .../sis/parameter/DefaultParameterDescriptor.java  |   7 +-
 .../sis/parameter/DefaultParameterValue.java       |   7 +-
 .../apache/sis/parameter/ParameterizedType.java    |  49 +++++++++
 .../referencing/datum/DefaultDatumEnsemble.java    |   8 +-
 .../referencing/internal/ParameterizedType.java    | 118 ++++++++++++++++++++
 .../DefaultParameterDescriptorGroupTest.java       |  20 ++--
 .../parameter/DefaultParameterDescriptorTest.java  | 119 +++++++++++----------
 .../sis/parameter/DefaultParameterValueTest.java   |  46 ++++----
 .../datum/DefaultDatumEnsembleTest.java            |  64 +++++++++++
 .../datum/DefaultGeodeticDatumTest.java            |   6 +-
 .../sis/referencing/datum/HardCodedDatum.java      |   2 +-
 11 files changed, 341 insertions(+), 105 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/DefaultParameterDescriptor.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/DefaultParameterDescriptor.java
index 5844582b2f..339897b7dd 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/DefaultParameterDescriptor.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/DefaultParameterDescriptor.java
@@ -23,7 +23,6 @@ import java.util.EnumSet;
 import java.util.Objects;
 import jakarta.xml.bind.annotation.XmlType;
 import jakarta.xml.bind.annotation.XmlRootElement;
-import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
 import javax.measure.Unit;
 import org.opengis.util.CodeList;
@@ -321,14 +320,12 @@ public class DefaultParameterDescriptor<T> extends 
AbstractParameterDescriptor i
      * Returns the GeoAPI interface that defines the contract of this 
implementation class.
      * This is the base type required by {@code equals(…)} methods for 
returning a potentially {@code true} value.
      *
-     * @todo We could return {@link ParameterizedType} here.
-     *
      * @return {@code ParameterDescriptor.class} or a user-defined 
sub-interface.
-     * @hidden
+     * @since 1.7
      */
     @Override
     public Type getStandardType() {
-        return ParameterDescriptor.class;
+        return new ParameterizedType(ParameterDescriptor.class, this);
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/DefaultParameterValue.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/DefaultParameterValue.java
index 5e05498f4a..7b5197913b 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/DefaultParameterValue.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/DefaultParameterValue.java
@@ -18,7 +18,6 @@ package org.apache.sis.parameter;
 
 import java.lang.reflect.Array;
 import java.lang.reflect.Type;
-import java.lang.reflect.ParameterizedType;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.logging.Logger;
@@ -918,14 +917,12 @@ convert:            if (componentType != null) {
      * Returns the GeoAPI interface that defines the contract of this 
implementation class.
      * This is the base type required by {@code equals(…)} methods for 
returning a potentially {@code true} value.
      *
-     * @todo We could return {@link ParameterizedType} here.
-     *
      * @return {@code ParameterValue.class} or a user-defined sub-interface.
-     * @hidden
+     * @since 1.7
      */
     @Override
     public Type getStandardType() {
-        return ParameterValue.class;
+        return new ParameterizedType(ParameterValue.class, descriptor);
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/ParameterizedType.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/ParameterizedType.java
new file mode 100644
index 0000000000..0d12664bb6
--- /dev/null
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/parameter/ParameterizedType.java
@@ -0,0 +1,49 @@
+/*
+ * 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 org.opengis.parameter.ParameterDescriptor;
+
+
+/**
+ * Value returned by {@code getStandardType()} with actual type argument 
fetched only if requested.
+ * In many cases, {@link #getActualTypeArgument()} will not be invoked at all.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ */
+final class ParameterizedType extends 
org.apache.sis.referencing.internal.ParameterizedType {
+    /**
+     * The descriptor for which to return the type.
+     */
+    private final ParameterDescriptor<?> descriptor;
+
+    /**
+     * Creates a new parameterized type.
+     */
+    ParameterizedType(final Class<?> rawType, final ParameterDescriptor<?> 
descriptor) {
+        super(rawType);
+        this.descriptor = descriptor;
+    }
+
+    /**
+     * Returns the type.
+     */
+    @Override
+    protected Class<?> getActualTypeArgument() {
+        return descriptor.getValueClass();
+    }
+ }
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultDatumEnsemble.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultDatumEnsemble.java
index 9a37dae7d8..ebfda81ba2 100644
--- 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultDatumEnsemble.java
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/datum/DefaultDatumEnsemble.java
@@ -43,6 +43,7 @@ import org.apache.sis.referencing.AbstractIdentifiedObject;
 import org.apache.sis.referencing.GeodeticException;
 import org.apache.sis.referencing.IdentifiedObjects;
 import org.apache.sis.referencing.internal.Resources;
+import org.apache.sis.referencing.internal.ParameterizedType;
 import org.apache.sis.referencing.internal.PositionalAccuracyConstant;
 import org.apache.sis.referencing.internal.shared.WKTKeywords;
 import org.apache.sis.referencing.internal.shared.WKTUtilities;
@@ -315,7 +316,12 @@ public class DefaultDatumEnsemble<D extends Datum> extends 
AbstractIdentifiedObj
      */
     @Override
     public Type getStandardType() {
-        return DatumEnsemble.class;
+        return new ParameterizedType(DatumEnsemble.class) {
+            @Override protected Class<?> getActualTypeArgument() {
+                Class<? extends Datum>[] types = 
Classes.getLeafInterfaces(DefaultDatumEnsemble.this.getClass(), Datum.class);
+                return (types.length != 0) ? types[0] : Datum.class;
+            }
+        };
     }
 
     /*
diff --git 
a/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/ParameterizedType.java
 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/ParameterizedType.java
new file mode 100644
index 0000000000..aa8d395369
--- /dev/null
+++ 
b/endorsed/src/org.apache.sis.referencing/main/org/apache/sis/referencing/internal/ParameterizedType.java
@@ -0,0 +1,118 @@
+/*
+ * 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.referencing.internal;
+
+import java.lang.reflect.Type;
+import java.util.Objects;
+import org.apache.sis.util.Classes;
+import org.apache.sis.util.LenientComparable;
+
+
+/**
+ * Declaration of which standard interfaces are implemented by a 
<abbr>SIS</abbr> class.
+ * Used for some {@link LenientComparable#getStandardType()} implementations.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ */
+public abstract class ParameterizedType implements 
java.lang.reflect.ParameterizedType {
+    /**
+     * Value returned by {@link #getRawType()}.
+     */
+    private final Class<?> rawType;
+
+    /**
+     * Creates a new parameterized type.
+     *
+     * @param  rawType  value returned by {@link #getRawType()}.
+     */
+    protected ParameterizedType(final Class<?> rawType) {
+        this.rawType  = rawType;
+    }
+
+    /**
+     * Returns the class that declares the parameterized types.
+     *
+     * @return the class that declares the parameterized types.
+     */
+    @Override
+    public final Type getRawType() {
+        return rawType;
+    }
+
+    /**
+     * Returns the single type argument.
+     *
+     * @return the single type argument.
+     */
+    protected abstract Class<?> getActualTypeArgument();
+
+    /**
+     * Returns the type argument.
+     *
+     * @return an array of length 1 containing the type argument.
+     */
+    @Override
+    public final Type[] getActualTypeArguments() {
+        return new Type[] {getActualTypeArgument()};
+    }
+
+    /**
+     * Returns {@code null} since this object is used for describing a 
top-level class.
+     *
+     * @return {@code null}.
+     */
+    @Override
+    public final Type getOwnerType() {
+        return null;
+    }
+
+    /**
+     * Returns a string representation of this type.
+     * Short class names are used.
+     *
+     * @return a short string representation.
+     */
+    @Override
+    public final String toString() {
+        return Classes.getShortName(rawType) + '<' + 
Classes.getShortName(getActualTypeArgument()) + '>';
+    }
+
+    /**
+     * Returns a hash code value for this parameterized type.
+     *
+     * @return a hash code value.
+     */
+    @Override
+    public final int hashCode() {
+        return Objects.hash(rawType, getActualTypeArgument());
+    }
+
+    /**
+     * Compares this parameterized type with the given object for equality.
+     *
+     * @param  obj  the other object.
+     * @return whether the two objects are equal.
+     */
+    @Override
+    public final boolean equals(final Object obj) {
+        if (obj instanceof ParameterizedType) {
+            final var other = (ParameterizedType) obj;
+            return rawType == other.rawType && getActualTypeArgument() == 
other.getActualTypeArgument();
+        }
+        return false;
+    }
+}
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
index d8babeb4d9..fbcb42204c 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterDescriptorGroupTest.java
@@ -44,6 +44,7 @@ import org.opengis.parameter.ParameterDirection;
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Johann Sorel (Geomatys)
  */
+@SuppressWarnings("exports")
 public final class DefaultParameterDescriptorGroupTest extends TestCase {
     /**
      * The default value used by the parameters in the {@link #M1_M1_O1_O2} 
descriptor.
@@ -59,7 +60,7 @@ public final class DefaultParameterDescriptorGroupTest 
extends TestCase {
     public static final DefaultParameterDescriptorGroup M1_M1_O1_O2;
     static {
         final Class<Integer> type = Integer.class;
-        final Map<String,Object> properties = new HashMap<>(4);
+        final var properties = new HashMap<String, Object>(4);
         M1_M1_O1_O2 = new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, 
"Test group"), 0, 1,
             new DefaultParameterDescriptor<>(name(properties, "Mandatory 1", 
"Ambiguity"), 1, 1, type, null, null, DEFAULT_VALUE),
             new DefaultParameterDescriptor<>(name(properties, "Mandatory 2", 
"Alias 2"),   1, 1, type, null, null, DEFAULT_VALUE),
@@ -71,7 +72,7 @@ public final class DefaultParameterDescriptorGroupTest 
extends TestCase {
     /**
      * Returns a map with {@code "name"}=<var>name</var> and {@code 
"alias"}=<var>alias</var> entries.
      */
-    private static Map<String,Object> name(final Map<String,Object> 
properties, final String name, final String alias) {
+    private static Map<String, Object> name(final Map<String, Object> 
properties, final String name, final String alias) {
         properties.put(NAME_KEY, name);
         properties.put(ALIAS_KEY, alias);
         return properties;
@@ -87,15 +88,12 @@ public final class DefaultParameterDescriptorGroupTest 
extends TestCase {
      * Ensures that the constructor detects duplicated names.
      */
     @Test
-    @SuppressWarnings("ResultOfObjectAllocationIgnored")
-    public void testConstruction() {
-        final Class<Integer> type = Integer.class;
-        final Map<String,Object> properties = new HashMap<>(4);
-        final DefaultParameterDescriptor<Integer> p1, p2;
-        p1 = new DefaultParameterDescriptor<>(name(properties,   "Name",  
null), 1, 1, type, null, null, null);
-        p2 = new DefaultParameterDescriptor<>(name(properties, "  NAME ", 
null), 1, 1, type, null, null, null);
-
-        var e = assertThrows(IllegalArgumentException.class,
+    public void testDuplicateNameDetection() {
+        Class<Integer> type = Integer.class;
+        var properties = new HashMap<String, Object>(4);
+        var p1 = new DefaultParameterDescriptor<>(name(properties,   "Name",  
null), 1, 1, type, null, null, null);
+        var p2 = new DefaultParameterDescriptor<>(name(properties, "  NAME ", 
null), 1, 1, type, null, null, null);
+        var e  = assertThrows(IllegalArgumentException.class,
                 () -> new DefaultParameterDescriptorGroup(Map.of(NAME_KEY, 
"Test group"), 0, 1, p1, p2));
         assertMessageContains(e, "Name", "NAME");
     }
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterDescriptorTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterDescriptorTest.java
index f5953c7fba..12d90d4ce4 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterDescriptorTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterDescriptorTest.java
@@ -183,15 +183,16 @@ public final class DefaultParameterDescriptorTest extends 
TestCase {
     @Test
     public void testOptionalInteger() {
         final var descriptor = createSimpleOptional("Simple param", 
Integer.class);
-        assertEquals("Simple param", descriptor.getName().getCode());
-        assertEquals("Integer",      descriptor.getValueType().toString());
-        assertEquals(Integer.class,  descriptor.getValueClass());
-        assertNull  (                descriptor.getValidValues());
-        assertNull  (                descriptor.getDefaultValue());
-        assertNull  (                descriptor.getMinimumValue());
-        assertNull  (                descriptor.getMaximumValue());
-        assertEquals(0,              descriptor.getMinimumOccurs());
-        assertEquals(1,              descriptor.getMaximumOccurs());
+        assertEquals("Simple param",                 
descriptor.getName().getCode());
+        assertEquals("Integer",                      
descriptor.getValueType().toString());
+        assertEquals(Integer.class,                  
descriptor.getValueClass());
+        assertEquals("ParameterDescriptor<Integer>", 
descriptor.getStandardType().getTypeName());
+        assertNull  (                                
descriptor.getValidValues());
+        assertNull  (                                
descriptor.getDefaultValue());
+        assertNull  (                                
descriptor.getMinimumValue());
+        assertNull  (                                
descriptor.getMaximumValue());
+        assertEquals(0,                              
descriptor.getMinimumOccurs());
+        assertEquals(1,                              
descriptor.getMaximumOccurs());
     }
 
     /**
@@ -205,15 +206,16 @@ public final class DefaultParameterDescriptorTest extends 
TestCase {
         assertMessageContains(e, "Range [20 … 4] is not valid.");
 
         final var descriptor = create("Test range", 4, 20, 12);
-        assertEquals("Test range",        descriptor.getName().getCode());
-        assertEquals("Integer",           
descriptor.getValueType().toString());
-        assertEquals(Integer.class,       descriptor.getValueClass());
-        assertNull  (                     descriptor.getValidValues());
-        assertEquals(Integer.valueOf(12), descriptor.getDefaultValue());
-        assertEquals(Integer.valueOf( 4), descriptor.getMinimumValue());
-        assertEquals(Integer.valueOf(20), descriptor.getMaximumValue());
-        assertEquals(1,                   descriptor.getMinimumOccurs());
-        assertEquals(1,                   descriptor.getMaximumOccurs());
+        assertEquals("Test range",                   
descriptor.getName().getCode());
+        assertEquals("Integer",                      
descriptor.getValueType().toString());
+        assertEquals(Integer.class,                  
descriptor.getValueClass());
+        assertEquals("ParameterDescriptor<Integer>", 
descriptor.getStandardType().getTypeName());
+        assertNull  (                                
descriptor.getValidValues());
+        assertEquals(Integer.valueOf(12),            
descriptor.getDefaultValue());
+        assertEquals(Integer.valueOf( 4),            
descriptor.getMinimumValue());
+        assertEquals(Integer.valueOf(20),            
descriptor.getMaximumValue());
+        assertEquals(1,                              
descriptor.getMinimumOccurs());
+        assertEquals(1,                              
descriptor.getMaximumOccurs());
     }
 
     /**
@@ -236,13 +238,14 @@ public final class DefaultParameterDescriptorTest extends 
TestCase {
     @SuppressWarnings("UnnecessaryBoxing")
     public void testDoubleType() {
         final var descriptor = create("Length measure", 4, 20, 12, 
Units.METRE);
-        assertEquals("Length measure",   descriptor.getName().getCode());
-        assertEquals("Real",             descriptor.getValueType().toString());
-        assertEquals(Double.class,       descriptor.getValueClass());
-        assertEquals(Double.valueOf(12), descriptor.getDefaultValue());
-        assertEquals(Double.valueOf( 4), descriptor.getMinimumValue());
-        assertEquals(Double.valueOf(20), descriptor.getMaximumValue());
-        assertEquals(Units.METRE,        descriptor.getUnit());
+        assertEquals("Length measure",              
descriptor.getName().getCode());
+        assertEquals("Real",                        
descriptor.getValueType().toString());
+        assertEquals("ParameterDescriptor<Double>", 
descriptor.getStandardType().getTypeName());
+        assertEquals(Double.class,                  
descriptor.getValueClass());
+        assertEquals(Double.valueOf(12),            
descriptor.getDefaultValue());
+        assertEquals(Double.valueOf( 4),            
descriptor.getMinimumValue());
+        assertEquals(Double.valueOf(20),            
descriptor.getMaximumValue());
+        assertEquals(Units.METRE,                   descriptor.getUnit());
         validate(descriptor);
     }
 
@@ -255,17 +258,18 @@ public final class DefaultParameterDescriptorTest extends 
TestCase {
         final var descriptor  = new 
DefaultParameterDescriptor<>(properties("String param"),
                 0, 1, String.class, valueDomain, null, "ABC");
 
-        assertEquals("String param",    descriptor.getName().getCode());
-        assertEquals("CharacterString", descriptor.getValueType().toString());
-        assertEquals(String.class,      descriptor.getValueClass());
-        assertNull  (                   descriptor.getValidValues());
-        assertSame  (valueDomain,       descriptor.getValueDomain());
-        assertEquals("ABC",             descriptor.getDefaultValue());
-        assertEquals("AAA",             descriptor.getMinimumValue());
-        assertEquals("BBB",             descriptor.getMaximumValue());
-        assertEquals(0,                 descriptor.getMinimumOccurs());
-        assertEquals(1,                 descriptor.getMaximumOccurs());
-        assertNull  (                   descriptor.getUnit());
+        assertEquals("String param",                
descriptor.getName().getCode());
+        assertEquals("CharacterString",             
descriptor.getValueType().toString());
+        assertEquals(String.class,                  
descriptor.getValueClass());
+        assertEquals("ParameterDescriptor<String>", 
descriptor.getStandardType().getTypeName());
+        assertNull  (                               
descriptor.getValidValues());
+        assertSame  (valueDomain,                   
descriptor.getValueDomain());
+        assertEquals("ABC",                         
descriptor.getDefaultValue());
+        assertEquals("AAA",                         
descriptor.getMinimumValue());
+        assertEquals("BBB",                         
descriptor.getMaximumValue());
+        assertEquals(0,                             
descriptor.getMinimumOccurs());
+        assertEquals(1,                             
descriptor.getMaximumOccurs());
+        assertNull  (                               descriptor.getUnit());
     }
 
     /**
@@ -276,17 +280,17 @@ public final class DefaultParameterDescriptorTest extends 
TestCase {
     public void testEnumeration() {
         final String[] enumeration = {"Apple", "Orange", "りんご"};
         final var descriptor = create("Enumeration param", String.class, 
enumeration, "Apple");
-
-        assertEquals     ("Enumeration param", descriptor.getName().getCode());
-        assertEquals     ("CharacterString",   
descriptor.getValueType().toString());
-        assertEquals     (String.class,        descriptor.getValueClass());
-        assertArrayEquals(enumeration,         
descriptor.getValidValues().toArray());
-        assertEquals     ("Apple",             descriptor.getDefaultValue());
-        assertNull       (                     descriptor.getMinimumValue());
-        assertNull       (                     descriptor.getMaximumValue());
-        assertEquals     (1,                   descriptor.getMinimumOccurs());
-        assertEquals     (1,                   descriptor.getMaximumOccurs());
-        assertNull       (                     descriptor.getUnit());
+        assertEquals("Enumeration param",           
descriptor.getName().getCode());
+        assertEquals("CharacterString",             
descriptor.getValueType().toString());
+        assertEquals(String.class,                  
descriptor.getValueClass());
+        assertEquals("ParameterDescriptor<String>", 
descriptor.getStandardType().getTypeName());
+        assertArrayEquals(enumeration,              
descriptor.getValidValues().toArray());
+        assertEquals("Apple",                       
descriptor.getDefaultValue());
+        assertNull  (                               
descriptor.getMinimumValue());
+        assertNull  (                               
descriptor.getMaximumValue());
+        assertEquals(1,                             
descriptor.getMinimumOccurs());
+        assertEquals(1,                             
descriptor.getMaximumOccurs());
+        assertNull  (                               descriptor.getUnit());
         /*
          * Invalid operation: element not in the list of valid elements.
          */
@@ -302,16 +306,17 @@ public final class DefaultParameterDescriptorTest extends 
TestCase {
     @SuppressWarnings("UnnecessaryBoxing")
     public void testArrayType() {
         final var descriptor = createForArray("Array param", 4, 9, 
Units.METRE);
-        assertEquals("Array param",  descriptor.getName().getCode());
-        assertEquals("Real",         descriptor.getValueType().toString());
-        assertEquals(double[].class, descriptor.getValueClass());
-        assertEquals(Units.METRE,    descriptor.getUnit());
-        assertNull  (                descriptor.getValidValues());
-        assertNull  (                descriptor.getDefaultValue());
-        assertNull  (                descriptor.getMinimumValue());
-        assertNull  (                descriptor.getMaximumValue());
-        assertEquals(1,              descriptor.getMinimumOccurs());
-        assertEquals(1,              descriptor.getMaximumOccurs());
+        assertEquals("Array param",                   
descriptor.getName().getCode());
+        assertEquals("Real",                          
descriptor.getValueType().toString());
+        assertEquals(double[].class,                  
descriptor.getValueClass());
+        assertEquals("ParameterDescriptor<double[]>", 
descriptor.getStandardType().getTypeName());
+        assertEquals(Units.METRE,                     descriptor.getUnit());
+        assertNull  (                                 
descriptor.getValidValues());
+        assertNull  (                                 
descriptor.getDefaultValue());
+        assertNull  (                                 
descriptor.getMinimumValue());
+        assertNull  (                                 
descriptor.getMaximumValue());
+        assertEquals(1,                               
descriptor.getMinimumOccurs());
+        assertEquals(1,                               
descriptor.getMaximumOccurs());
 
         final Range<?> valueDomain = descriptor.getValueDomain();
         assertNotNull(valueDomain);
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterValueTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterValueTest.java
index ab6487b625..8b59232135 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterValueTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/DefaultParameterValueTest.java
@@ -127,17 +127,18 @@ public final class DefaultParameterValueTest extends 
TestCase {
         final ParameterDescriptor<Integer> descriptor = 
parameter.getDescriptor();
         validate(parameter);
 
-        assertEquals("Integer param", descriptor.getName().getCode());
-        assertEquals(Integer.class,   descriptor.getValueClass());
-        assertNull  (                 descriptor.getUnit());
-        assertNull  (                 parameter .getUnit());
-        assertNull  (                 descriptor.getDefaultValue());
-        assertEquals((Integer) 14,    parameter .getValue());
-        assertEquals(14,              parameter .intValue());
-        assertEquals(14,              parameter .doubleValue());
-        assertNull  (                 descriptor.getMinimumValue());
-        assertNull  (                 descriptor.getMaximumValue());
-        assertNull  (                 descriptor.getValidValues());
+        assertEquals("Integer param",           
descriptor.getName().getCode());
+        assertEquals(Integer.class,             descriptor.getValueClass());
+        assertEquals("ParameterValue<Integer>", 
parameter.getStandardType().getTypeName());
+        assertNull  (                           descriptor.getUnit());
+        assertNull  (                           parameter .getUnit());
+        assertNull  (                           descriptor.getDefaultValue());
+        assertEquals((Integer) 14,              parameter .getValue());
+        assertEquals(14,                        parameter .intValue());
+        assertEquals(14,                        parameter .doubleValue());
+        assertNull  (                           descriptor.getMinimumValue());
+        assertNull  (                           descriptor.getMaximumValue());
+        assertNull  (                           descriptor.getValidValues());
         /*
          * Invalid operation: this parameter does not have unit of measurement.
          */
@@ -230,17 +231,18 @@ public final class DefaultParameterValueTest extends 
TestCase {
         final ParameterDescriptor<Double> descriptor = 
parameter.getDescriptor();
         validate(parameter);
 
-        assertEquals("Numerical param", descriptor.getName().getCode());
-        assertEquals(Units.METRE,       descriptor.getUnit());
-        assertEquals(Units.METRE,       parameter .getUnit());
-        assertNull  (                   descriptor.getDefaultValue());
-        assertEquals(Double.valueOf(3), parameter .getValue());
-        assertEquals(  3,               parameter .intValue());
-        assertEquals(  3,               parameter .doubleValue());
-        assertEquals(300,               parameter 
.doubleValue(Units.CENTIMETRE));
-        assertNull  (                   descriptor.getMinimumValue());
-        assertNull  (                   descriptor.getMaximumValue());
-        assertNull  (                   descriptor.getValidValues());
+        assertEquals("Numerical param",        descriptor.getName().getCode());
+        assertEquals("ParameterValue<Double>", 
parameter.getStandardType().getTypeName());
+        assertEquals(Units.METRE,              descriptor.getUnit());
+        assertEquals(Units.METRE,              parameter .getUnit());
+        assertNull  (                          descriptor.getDefaultValue());
+        assertEquals(Double.valueOf(3),        parameter .getValue());
+        assertEquals(  3,                      parameter .intValue());
+        assertEquals(  3,                      parameter .doubleValue());
+        assertEquals(300,                      parameter 
.doubleValue(Units.CENTIMETRE));
+        assertNull  (                          descriptor.getMinimumValue());
+        assertNull  (                          descriptor.getMaximumValue());
+        assertNull  (                          descriptor.getValidValues());
         /*
          * Invalid operation: this parameter is a real number, not a string.
          * While we could convert the number to a string, in the context of
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultDatumEnsembleTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultDatumEnsembleTest.java
new file mode 100644
index 0000000000..75a28b7bd8
--- /dev/null
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultDatumEnsembleTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.referencing.datum;
+
+import java.util.Map;
+import java.util.List;
+import org.opengis.referencing.datum.GeodeticDatum;
+import 
org.apache.sis.metadata.iso.quality.DefaultAbsoluteExternalPositionalAccuracy;
+import org.apache.sis.referencing.GeodeticException;
+
+// Test dependencies
+import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.*;
+import static org.apache.sis.test.Assertions.assertMessageContains;
+import org.apache.sis.test.TestCase;
+
+
+/**
+ * Tests the {@link DefaultDatumEnsemble} class.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ */
+@SuppressWarnings("exports")
+public class DefaultDatumEnsembleTest extends TestCase {
+    /**
+     * Creates a new test case.
+     */
+    public DefaultDatumEnsembleTest() {
+    }
+
+    /**
+     * Tests the creation of a datum ensemble with some arbitrary geodetic 
datum.
+     */
+    @Test
+    public void testGeodetic() {
+        final DefaultDatumEnsemble<GeodeticDatum> ensemble = 
DefaultDatumEnsemble.create(
+                Map.of(DefaultDatumEnsemble.NAME_KEY, "Any WGS"),
+                GeodeticDatum.class,
+                List.of(HardCodedDatum.WGS84, HardCodedDatum.WGS72),
+                new DefaultAbsoluteExternalPositionalAccuracy());
+
+        assertTrue(ensemble.getMembers().contains(HardCodedDatum.WGS84));
+        assertTrue(ensemble.getMembers().contains(HardCodedDatum.WGS72));
+        final GeodeticDatum geodetic = assertInstanceOf(GeodeticDatum.class, 
ensemble);
+        assertEquals("DatumEnsemble<GeodeticDatum>", 
ensemble.getStandardType().getTypeName());
+        assertEquals(0, geodetic.getPrimeMeridian().getGreenwichLongitude());
+        GeodeticException e = assertThrows(GeodeticException.class, () -> 
geodetic.getEllipsoid());
+        assertMessageContains(e, "WGS");
+    }
+}
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultGeodeticDatumTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultGeodeticDatumTest.java
index e96a3b4029..004cd98e3d 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultGeodeticDatumTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultGeodeticDatumTest.java
@@ -79,7 +79,7 @@ public final class DefaultGeodeticDatumTest extends TestCase {
      */
     @Test
     public void testCreateAndSerialize() {
-        final var properties = new HashMap<String,Object>();
+        final var properties = new HashMap<String, Object>();
         assertNull(properties.put(DefaultEllipsoid.NAME_KEY, "Asteroid"));
         final var ellipsoid = DefaultEllipsoid.createEllipsoid(properties, 
1200, 1000, Units.METRE);
 
@@ -142,7 +142,7 @@ public final class DefaultGeodeticDatumTest extends 
TestCase {
      */
     @Test
     public void testGetPositionVectorTransformation() {
-        final var properties = new HashMap<String,Object>();
+        final var properties = new HashMap<String, Object>();
         assertNull(properties.put(DefaultGeodeticDatum.NAME_KEY, "Invalid 
dummy datum"));
         /*
          * Associate two BursaWolfParameters, one valid only in a local area 
and the other one
@@ -207,7 +207,7 @@ public final class DefaultGeodeticDatumTest extends 
TestCase {
      */
     @Test
     public void testIndirectTransformation() {
-        final var properties = new HashMap<String,Object>();
+        final var properties = new HashMap<String, Object>();
         assertNull(properties.put(DefaultGeodeticDatum.NAME_KEY, "Invalid 
dummy datum"));
         assertNull(properties.put(DefaultGeodeticDatum.BURSA_WOLF_KEY, 
BursaWolfParametersTest.createWGS72_to_WGS84()));
         final var global = new DefaultGeodeticDatum(properties,
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/HardCodedDatum.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/HardCodedDatum.java
index 32dabfaef9..9465b6a8a5 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/HardCodedDatum.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/HardCodedDatum.java
@@ -90,7 +90,7 @@ public final class HardCodedDatum {
      */
     public static final DefaultGeodeticDatum WGS72 = new DefaultGeodeticDatum(
             properties("World Geodetic System 1972", "6322", getScope(WGS84)),
-            new DefaultEllipsoid(GeodeticDatumMock.WGS84.getEllipsoid()), 
GREENWICH);
+            new DefaultEllipsoid(GeodeticDatumMock.WGS72.getEllipsoid()), 
GREENWICH);
 
     /**
      * Nouvelle Triangulation Française datum (EPSG:6807). Prime meridian is 
Paris.


Reply via email to