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.
