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

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

commit 2334c7cee4429d188e7065cd664c4913c3f30d67
Author: Martin Desruisseaux <[email protected]>
AuthorDate: Sat Oct 11 11:40:22 2025 +0200

    Retrofit metadata `Assertions` class into the existing classes.
---
 endorsed/build.gradle.kts                          |   1 +
 .../test/org/apache/sis/metadata/Assertions.java   | 218 ---------------------
 .../apache/sis/metadata/PropertyAccessorTest.java  |   2 +-
 .../sis/metadata/PropertyInformationTest.java      |   2 +-
 .../test/org/apache/sis/metadata/TreeNodeTest.java |   2 +-
 .../sis/metadata/iso/DefaultIdentifierTest.java    |   4 +-
 .../sis/metadata/iso/DefaultMetadataTest.java      |   2 +-
 .../sis/metadata/iso/citation/CitationsTest.java   |  14 +-
 .../metadata/iso/citation/DefaultCitationTest.java |   2 +-
 .../iso/citation/DefaultResponsibilityTest.java    |   2 +-
 .../constraint/DefaultLegalConstraintsTest.java    |   1 -
 .../sis/metadata/iso/content/DefaultBandTest.java  |   2 +-
 .../sis/metadata/iso/extent/DefaultExtentTest.java |   1 -
 .../identification/DefaultBrowseGraphicTest.java   |   1 -
 .../DefaultDataIdentificationTest.java             |   2 +-
 .../DefaultRepresentativeFractionTest.java         |   2 +-
 .../iso/identification/DefaultResolutionTest.java  |   2 +-
 .../DefaultServiceIdentificationTest.java          |   2 +-
 .../metadata/iso/lineage/DefaultLineageTest.java   |   1 -
 .../sis/metadata/iso/quality/ScopeCodeTest.java    |   2 +-
 .../apache/sis/util/iso/NameMarshallingTest.java   |   2 +-
 .../sis/xml/CharSequenceSubstitutionTest.java      |   2 +-
 .../apache/sis/xml/NilReasonMarshallingTest.java   |   4 +-
 .../org/apache/sis/xml/UUIDMarshallingTest.java    |   4 +-
 .../org/apache/sis/xml/XLinkMarshallingTest.java   |   1 -
 .../sis/xml/bind/cat/CodeListMarshallingTest.java  |   1 -
 .../sis/xml/bind/cat/EnumMarshallingTest.java      |   1 -
 .../apache/sis/xml/bind/gml/TimePeriodTest.java    |   1 -
 .../sis/xml/bind/lan/FreeTextMarshallingTest.java  |   1 -
 .../apache/sis/xml/bind/lan/LanguageCodeTest.java  |   1 -
 .../metadata/replace/QualityParameterTest.java     |   1 -
 .../metadata/replace/ServiceParameterTest.java     |   1 -
 .../apache/sis/xml/test/DocumentComparator.java    |   7 +-
 .../test/org/apache/sis/xml/test/TestCase.java     | 101 +++++++++-
 .../sis/xml/bind/fra/DataIdentificationTest.java   |   3 +-
 .../sis/parameter/ParameterMarshallingTest.java    |   1 -
 .../sis/referencing/ImmutableIdentifierTest.java   |   3 +-
 .../referencing/crs/DefaultEngineeringCRSTest.java |   1 -
 .../datum/DefaultGeodeticDatumTest.java            |   1 -
 .../datum/DefaultPrimeMeridianTest.java            |   1 -
 .../datum/DefaultVerticalDatumTest.java            |   1 -
 .../referencing/legacy/DefaultImageCRSTest.java    |   1 -
 .../operation/DefaultOperationMethodTest.java      |   2 +-
 .../operation/SingleOperationMarshallingTest.java  |   1 -
 .../referencing/SecondDefiningParameterTest.java   |   1 -
 .../org/apache/sis/storage/gpx/UpdaterTest.java    |   2 +-
 .../org/apache/sis/storage/gpx/WriterTest.java     |   2 +-
 .../aggregate/ConcatenatedFeatureSetTest.java      |   4 +-
 .../sis/storage/base/MetadataBuilderTest.java      |   4 +-
 .../test/org/apache/sis/test/Assertions.java       |  83 ++++++--
 50 files changed, 212 insertions(+), 292 deletions(-)

diff --git a/endorsed/build.gradle.kts b/endorsed/build.gradle.kts
index 26becb2149..5264751da8 100644
--- a/endorsed/build.gradle.kts
+++ b/endorsed/build.gradle.kts
@@ -150,6 +150,7 @@ fun addExportForTests(args : MutableList<String>) {
 
     addExport(args, "org.apache.sis.metadata",          
"org.apache.sis.xml.test",
                     "org.apache.sis.referencing," +
+                    "org.apache.sis.storage.xml," +
                     "org.apache.sis.profile.france")
 
     addExport(args, "org.apache.sis.storage",           
"org.apache.sis.storage.test",
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/Assertions.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/Assertions.java
deleted file mode 100644
index 10bf7efe65..0000000000
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/Assertions.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * 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.metadata;
-
-import java.util.Locale;
-import java.io.IOException;
-import javax.xml.parsers.ParserConfigurationException;
-import org.xml.sax.SAXException;
-import org.opengis.util.InternationalString;
-import org.opengis.metadata.citation.Citation;
-import org.opengis.metadata.lineage.Source;
-import org.opengis.metadata.maintenance.ScopeCode;
-import org.opengis.metadata.content.FeatureCatalogueDescription;
-import org.apache.sis.xml.Namespaces;
-import org.apache.sis.xml.internal.shared.LegacyNamespaces;
-
-// Test dependencies
-import static org.junit.jupiter.api.Assertions.*;
-import org.apache.sis.xml.test.DocumentComparator;
-import static org.apache.sis.test.Assertions.assertSingleton;
-
-// Specific to the geoapi-3.1 and geoapi-4.0 branches:
-import org.opengis.metadata.citation.Responsibility;
-import org.opengis.metadata.maintenance.Scope;
-import org.opengis.metadata.content.FeatureTypeInfo;
-
-
-/**
- * Assertion methods used by the {@code org.apache.sis.metadata} module.
- *
- * @author  Martin Desruisseaux (Geomatys)
- */
-public final class Assertions {
-    /**
-     * Do not allow instantiation of this class.
-     */
-    private Assertions() {
-    }
-
-    /**
-     * Asserts that the English title of the given citation is equal to the 
expected string.
-     *
-     * @param expected  the expected English title.
-     * @param citation  the citation to test.
-     * @param message   the message to report in case of test failure.
-     *
-     * @see #assertAnyTitleEquals(String, String, Citation)
-     */
-    public static void assertTitleEquals(final String expected, final Citation 
citation, final String message) {
-        assertNotNull(citation, message);
-        final InternationalString title = citation.getTitle();
-        assertNotNull(title, message);
-        assertEquals(expected, title.toString(Locale.US), message);
-    }
-
-    /**
-     * Asserts that the given citation has only one responsible party,
-     * and its English name is equal to the expected string.
-     *
-     * @param expected  the expected English responsibly party name.
-     * @param citation  the citation to test.
-     * @param message   the message to report in case of test failure.
-     */
-    public static void assertPartyNameEquals(final String expected, final 
Citation citation, final String message) {
-        assertNotNull(citation, message);
-        final Responsibility r = 
assertSingleton(citation.getCitedResponsibleParties());
-        final InternationalString name = 
assertSingleton(r.getParties()).getName();
-        assertNotNull(name, message);
-        assertEquals(expected, name.toString(Locale.US), message);
-    }
-
-    /**
-     * Verifies that the given {@code ContentInfo} describes the given feature.
-     * This method expects that the given catalog contains exactly one feature 
info.
-     *
-     * @param  name     expected feature type name (possibly null).
-     * @param  count    expected feature instance count (possibly null).
-     * @param  catalog  the content info to validate.
-     */
-    public static void assertContentInfoEquals(final String name, final 
Integer count, final FeatureCatalogueDescription catalog) {
-        final FeatureTypeInfo info = 
assertSingleton(catalog.getFeatureTypeInfo());
-        assertEquals(name, String.valueOf(info.getFeatureTypeName()), 
"metadata.contentInfo.featureType");
-        assertEquals(count, info.getFeatureInstanceCount(), 
"metadata.contentInfo.featureInstanceCount");
-    }
-
-    /**
-     * Verifies that the source contains the given feature type. This method 
expects that the given source contains
-     * exactly one scope description and that the hierarchical level is {@link 
ScopeCode#FEATURE_TYPE}.
-     *
-     * @param  name      expected source identifier.
-     * @param  features  expected names of feature type.
-     * @param  source    the source to validate.
-     */
-    public static void assertFeatureSourceEquals(final String name, final 
String[] features, final Source source) {
-        assertEquals(name, 
String.valueOf(source.getSourceCitation().getTitle()), 
"metadata.lineage.source.sourceCitation.title");
-        final Scope scope = source.getScope();
-        assertNotNull(scope, "metadata.lineage.source.scope");
-        assertEquals(ScopeCode.FEATURE_TYPE, scope.getLevel(), 
"metadata.lineage.source.scope.level");
-        final var actual = 
assertSingleton(scope.getLevelDescription()).getFeatures().toArray(CharSequence[]::new);
-        for (int i=0; i<actual.length; i++) {
-            actual[i] = actual[i].toString();
-        }
-        assertArrayEquals(features, actual, 
"metadata.lineage.source.scope.levelDescription.feature");
-    }
-
-    /**
-     * Parses two XML trees as DOM documents, and compares the nodes.
-     * The inputs given to this method can be any of the following types:
-     *
-     * <ul>
-     *   <li>{@link org.w3c.dom.Node}: used directly without further 
processing.</li>
-     *   <li>{@link java.io.InputStream}: the stream is parsed as an XML 
document, then closed.</li>
-     *   <li>{@link java.nio.file.Path}, {@link java.io.File}, {@link 
java.net.URL} or {@link java.net.URI}:
-     *       the stream is opened, parsed as an XML document, then closed.</li>
-     *   <li>{@link String}: The string content is parsed directly as a XML 
document.</li>
-     * </ul>
-     *
-     * The comparison will ignore comments and the optional attributes given 
in arguments.
-     *
-     * <h4>Ignored attributes substitution</h4>
-     * For convenience, this method replaces some well known prefixes in the 
{@code ignoredAttributes}
-     * array by their full namespace URLs. For example, this method 
replaces{@code "xsi:schemaLocation"}
-     * by {@code "http://www.w3.org/2001/XMLSchema-instance:schemaLocation"}.
-     * If such substitution is not desired, consider using {@link 
DocumentComparator} directly instead.
-     *
-     * <p>The current substitution map is as below (may be expanded in any 
future SIS version):</p>
-     *
-     * <table class="sis">
-     *   <caption>Predefined prefix mapping</caption>
-     *   <tr><th>Prefix</th> <th>URL</th></tr>
-     *   <tr><td>xmlns</td>  <td>{@code 
"http://www.w3.org/2000/xmlns"}</td></tr>
-     *   <tr><td>xlink</td>  <td>{@value Namespaces#XLINK}</td></tr>
-     *   <tr><td>xsi</td>    <td>{@value Namespaces#XSI}</td></tr>
-     *   <tr><td>gml</td>    <td>{@value Namespaces#GML}</td></tr>
-     *   <tr><td>gco</td>    <td>{@value Namespaces#GCO}</td></tr>
-     *   <tr><td>gmd</td>    <td>{@value LegacyNamespaces#GMD}</td></tr>
-     *   <tr><td>gmx</td>    <td>{@value LegacyNamespaces#GMX}</td></tr>
-     *   <tr><td>gmi</td>    <td>{@value LegacyNamespaces#GMI}</td></tr>
-     * </table>
-     *
-     * <p>For example, in order to ignore the namespace, type and schema 
location declaration,
-     * the following strings can be given to the {@code ignoredAttributes} 
argument:</p>
-     *
-     * {@snippet :
-     *   "xmlns:*", "xsi:schemaLocation", "xsi:type"
-     *   }
-     *
-     * @param  expected           the expected XML document.
-     * @param  actual             the XML document to compare.
-     * @param  ignoredAttributes  the fully-qualified names of attributes to 
ignore
-     *                            (typically {@code "xmlns:*"} and {@code 
"xsi:schemaLocation"}).
-     *
-     * @see DocumentComparator
-     */
-    public static void assertXmlEquals(final Object expected, final Object 
actual, final String... ignoredAttributes) {
-        assertXmlEquals(expected, actual, 0, null, ignoredAttributes);
-    }
-
-    /**
-     * Parses two XML trees as DOM documents, and compares the nodes with the 
given tolerance
-     * threshold for numerical values. The inputs given to this method can be 
any of the types
-     * documented {@linkplain #assertXmlEquals(Object, Object, String[]) 
above}. This method
-     * will ignore comments and the optional attributes given in arguments as 
documented in the
-     * above method.
-     *
-     * @param  expected           the expected XML document.
-     * @param  actual             the XML document to compare.
-     * @param  tolerance          the tolerance threshold for comparison of 
numerical values.
-     * @param  ignoredNodes       the fully-qualified names of the nodes to 
ignore, or {@code null} if none.
-     * @param  ignoredAttributes  the fully-qualified names of attributes to 
ignore
-     *                            (typically {@code "xmlns:*"} and {@code 
"xsi:schemaLocation"}).
-     *
-     * @see DocumentComparator
-     */
-    public static void assertXmlEquals(final Object expected, final Object 
actual,
-            final double tolerance, final String[] ignoredNodes, final 
String[] ignoredAttributes)
-    {
-        final DocumentComparator comparator;
-        try {
-            comparator = new DocumentComparator(expected, actual);
-        } catch (IOException | ParserConfigurationException | SAXException e) {
-            /*
-             * We don't throw directly those exceptions since failing to parse 
the XML file can
-             * be considered as part of test failures and the JUnit exception 
for such failures
-             * is AssertionError. Having no checked exception in "assert" 
methods allow us to
-             * declare the checked exceptions only for the library code being 
tested.
-             */
-            throw new AssertionError(e);
-        }
-        comparator.tolerance = tolerance;
-        comparator.ignoreComments = true;
-        if (ignoredNodes != null) {
-            for (final String node : ignoredNodes) {
-                
comparator.ignoredNodes.add(DocumentComparator.substitutePrefix(node));
-            }
-        }
-        if (ignoredAttributes != null) {
-            for (final String attribute : ignoredAttributes) {
-                
comparator.ignoredAttributes.add(DocumentComparator.substitutePrefix(attribute));
-            }
-        }
-        comparator.compare();
-    }
-}
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java
index 36b9818d3f..79706b62a6 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyAccessorTest.java
@@ -61,7 +61,7 @@ import org.apache.sis.test.TestCase;
 import org.apache.sis.test.mock.GeographicCRSMock;
 import org.apache.sis.metadata.iso.citation.HardCodedCitations;
 import static org.apache.sis.test.Assertions.assertSingleton;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.content.AttributeGroup;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyInformationTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyInformationTest.java
index baedf93ef8..f15e38773b 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyInformationTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/PropertyInformationTest.java
@@ -35,7 +35,7 @@ import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.TestCase;
 import org.apache.sis.metadata.iso.citation.HardCodedCitations;
 import static org.apache.sis.test.Assertions.assertSerializedEquals;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 import static org.apache.sis.test.Assertions.assertSingleton;
 
 // Specific to the geoapi-4.0 branch:
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/TreeNodeTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/TreeNodeTest.java
index c4e21e2255..e5325ecaad 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/TreeNodeTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/TreeNodeTest.java
@@ -39,7 +39,7 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.TestCase;
 import static org.apache.sis.test.Assertions.assertMessageContains;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.citation.Party;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/DefaultIdentifierTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/DefaultIdentifierTest.java
index ced023112f..c7def05bec 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/DefaultIdentifierTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/DefaultIdentifierTest.java
@@ -24,8 +24,7 @@ import org.apache.sis.xml.Namespaces;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 
 
 /**
@@ -34,6 +33,7 @@ import static 
org.apache.sis.metadata.Assertions.assertXmlEquals;
  * @author  Martin Desruisseaux
  * @author  Cullen Rombach (Image Matters)
  */
+@SuppressWarnings("exports")
 public final class DefaultIdentifierTest extends TestCase {
     /**
      * The expected XML representation for this test.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/DefaultMetadataTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/DefaultMetadataTest.java
index a0f5bc0529..73cc17f5fd 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/DefaultMetadataTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/DefaultMetadataTest.java
@@ -39,7 +39,7 @@ import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
 import static org.apache.sis.test.Assertions.assertSingleton;
 import static org.apache.sis.test.Assertions.assertSingletonCitation;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.MetadataScope;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/CitationsTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/CitationsTest.java
index aff365f78e..9979383b20 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/CitationsTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/CitationsTest.java
@@ -36,8 +36,8 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import static org.apache.sis.test.Assertions.assertSerializedEquals;
 import static org.apache.sis.test.Assertions.assertSingleton;
-import static org.apache.sis.test.Assertions.assertSingletonResponsibleParty;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertPartyNameEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 import org.apache.sis.test.TestCase;
 
 
@@ -221,11 +221,11 @@ public final class CitationsTest extends TestCase {
      */
     @Test
     public void testGetCitedResponsibleParty() {
-        assertEquals("Open Geospatial Consortium",                       
assertSingletonResponsibleParty(OGC));
-        assertEquals("International Organization for Standardization",   
assertSingletonResponsibleParty(ISO_19115.get(0)));
-        assertEquals("International Organization for Standardization",   
assertSingletonResponsibleParty(ISO_19115.get(1)));
-        assertEquals("International Association of Oil & Gas producers", 
assertSingletonResponsibleParty(EPSG));
-        assertEquals("International Association of Oil & Gas producers", 
assertSingletonResponsibleParty(IOGP));
+        assertPartyNameEquals("Open Geospatial Consortium",                    
   OGC, "OGC");
+        assertPartyNameEquals("International Organization for 
Standardization",   ISO_19115.get(0), "ISO_19115");
+        assertPartyNameEquals("International Organization for 
Standardization",   ISO_19115.get(1), "ISO_19115");
+        assertPartyNameEquals("International Association of Oil & Gas 
producers", EPSG, "EPSG");
+        assertPartyNameEquals("International Association of Oil & Gas 
producers", IOGP, "IOGP");
     }
 
     /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
index bba443f069..6967504187 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/DefaultCitationTest.java
@@ -50,7 +50,7 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.metadata.xml.TestUsingFile;
 import static org.apache.sis.test.Assertions.assertSingleton;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.citation.CitationDate;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/DefaultResponsibilityTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/DefaultResponsibilityTest.java
index eecaa90ba9..e9c091f459 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/DefaultResponsibilityTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/citation/DefaultResponsibilityTest.java
@@ -24,7 +24,6 @@ import org.apache.sis.xml.internal.shared.LegacyNamespaces;
 // Test dependencies
 import org.junit.jupiter.api.Test;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
@@ -33,6 +32,7 @@ import static 
org.apache.sis.metadata.Assertions.assertXmlEquals;
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Cullen Rombach (Image Matters)
  */
+@SuppressWarnings("exports")
 public final class DefaultResponsibilityTest extends TestCase {
     /**
      * Creates a new test case.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraintsTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraintsTest.java
index f65261dcd9..ea05b7d9af 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraintsTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/constraint/DefaultLegalConstraintsTest.java
@@ -27,7 +27,6 @@ import static 
org.apache.sis.metadata.internal.shared.ImplementationHelper.ISO_N
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.test.Assertions.assertSingleton;
 
 
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/content/DefaultBandTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/content/DefaultBandTest.java
index fd1540afab..acfd833178 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/content/DefaultBandTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/content/DefaultBandTest.java
@@ -24,7 +24,6 @@ import static 
org.apache.sis.metadata.internal.shared.ImplementationHelper.ISO_N
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-4.0 branch:
 import org.opengis.metadata.content.PolarisationOrientation;
@@ -35,6 +34,7 @@ import org.opengis.metadata.content.PolarisationOrientation;
  *
  * @author  Martin Desruisseaux (Geomatys)
  */
+@SuppressWarnings("exports")
 public final class DefaultBandTest extends TestCase {
     /**
      * The XML fragment used for testing.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
index 94107db458..75f666eb38 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/extent/DefaultExtentTest.java
@@ -31,7 +31,6 @@ import org.apache.sis.xml.NilObject;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.metadata.xml.TestUsingFile;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.test.Assertions.assertEqualsIgnoreMetadata;
 
 
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultBrowseGraphicTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultBrowseGraphicTest.java
index 585452e57c..66cd980707 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultBrowseGraphicTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultBrowseGraphicTest.java
@@ -35,7 +35,6 @@ import org.apache.sis.xml.XML;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultDataIdentificationTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultDataIdentificationTest.java
index 5278d26984..bf8c9e8ce6 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultDataIdentificationTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultDataIdentificationTest.java
@@ -38,7 +38,7 @@ import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.TestCase;
 import org.apache.sis.test.TestUtilities;
 import static org.apache.sis.test.Assertions.assertMultilinesEquals;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 
 
 /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFractionTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFractionTest.java
index 56b7f655dd..7f3174a314 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFractionTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultRepresentativeFractionTest.java
@@ -26,7 +26,6 @@ import org.apache.sis.util.Version;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
@@ -35,6 +34,7 @@ import static 
org.apache.sis.metadata.Assertions.assertXmlEquals;
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Cullen Rombach (Image Matters)
  */
+@SuppressWarnings("exports")
 public final class DefaultRepresentativeFractionTest extends TestCase {
     /**
      * {@code false} if testing ISO 19115-3 document, or {@code true} if 
testing ISO 19139:2007 document.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultResolutionTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultResolutionTest.java
index b316afe9fa..2808f35a40 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultResolutionTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultResolutionTest.java
@@ -27,7 +27,6 @@ import static org.apache.sis.xml.bind.gml.MeasureTest.UOM_URL;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
@@ -36,6 +35,7 @@ import static 
org.apache.sis.metadata.Assertions.assertXmlEquals;
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Cullen Rombach (Image Matters)
  */
+@SuppressWarnings("exports")
 public final class DefaultResolutionTest extends TestCase.WithLogs {
     /**
      * Creates a new test case.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
index 229c28c168..68bb57d992 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/identification/DefaultServiceIdentificationTest.java
@@ -29,7 +29,7 @@ import org.apache.sis.xml.NilReason;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.metadata.xml.TestUsingFile;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 import static org.apache.sis.test.Assertions.assertSingleton;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/lineage/DefaultLineageTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/lineage/DefaultLineageTest.java
index 452b6d3a0f..97ddef7435 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/lineage/DefaultLineageTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/lineage/DefaultLineageTest.java
@@ -28,7 +28,6 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import static org.apache.sis.test.Assertions.assertSingleton;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/ScopeCodeTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/ScopeCodeTest.java
index 0ce6406361..7126c254f7 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/ScopeCodeTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/ScopeCodeTest.java
@@ -23,7 +23,6 @@ import org.opengis.metadata.maintenance.ScopeCode;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.maintenance.Scope;
@@ -37,6 +36,7 @@ import org.opengis.metadata.maintenance.Scope;
  *
  * @see <a href="https://issues.apache.org/jira/browse/SIS-508";>SIS-508 on 
issue tracker</a>
  */
+@SuppressWarnings("exports")
 public final class ScopeCodeTest extends TestCase {
     /**
      * The XML fragment used for testing.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/util/iso/NameMarshallingTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/util/iso/NameMarshallingTest.java
index 9d9dad85db..58a9ff06e4 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/util/iso/NameMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/util/iso/NameMarshallingTest.java
@@ -37,7 +37,6 @@ import org.junit.jupiter.api.TestInstance;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.mock.IdentifiedObjectMock;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
@@ -46,6 +45,7 @@ import static 
org.apache.sis.metadata.Assertions.assertXmlEquals;
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Cullen Rombach (Image Matters)
  */
+@SuppressWarnings("exports")
 @TestInstance(TestInstance.Lifecycle.PER_CLASS)
 public final class NameMarshallingTest extends TestCase {
     /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/CharSequenceSubstitutionTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/CharSequenceSubstitutionTest.java
index 58e4dbf966..031f5b96ce 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/CharSequenceSubstitutionTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/CharSequenceSubstitutionTest.java
@@ -31,7 +31,6 @@ import static 
org.apache.sis.metadata.internal.shared.ImplementationHelper.ISO_N
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.Identifier;
@@ -43,6 +42,7 @@ import org.opengis.metadata.Identifier;
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Cullen Rombach (Image Matters)
  */
+@SuppressWarnings("exports")
 public final class CharSequenceSubstitutionTest extends TestCase {
     /**
      * Creates a new test case.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/NilReasonMarshallingTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/NilReasonMarshallingTest.java
index 563fd55e04..7b952b17c9 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/NilReasonMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/NilReasonMarshallingTest.java
@@ -25,8 +25,7 @@ import org.opengis.metadata.citation.Citation;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 
 
 /**
@@ -34,6 +33,7 @@ import static 
org.apache.sis.metadata.Assertions.assertXmlEquals;
  *
  * @author  Martin Desruisseaux (Geomatys)
  */
+@SuppressWarnings("exports")
 public final class NilReasonMarshallingTest extends TestCase {
     /**
      * Creates a new test case.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/UUIDMarshallingTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/UUIDMarshallingTest.java
index 02f71e38e8..aacc6b8413 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/UUIDMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/UUIDMarshallingTest.java
@@ -25,8 +25,7 @@ import org.opengis.metadata.citation.Citation;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 
 
 /**
@@ -34,6 +33,7 @@ import static 
org.apache.sis.metadata.Assertions.assertXmlEquals;
  *
  * @author  Martin Desruisseaux (Geomatys)
  */
+@SuppressWarnings("exports")
 public final class UUIDMarshallingTest extends TestCase {
     /**
      * A random UUID for the tests in this class.
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/XLinkMarshallingTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/XLinkMarshallingTest.java
index 118a710c0a..7506544718 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/XLinkMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/XLinkMarshallingTest.java
@@ -29,7 +29,6 @@ import org.apache.sis.util.ComparisonMode;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.test.Assertions.assertSingleton;
 
 
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/cat/CodeListMarshallingTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/cat/CodeListMarshallingTest.java
index 77f45a4774..d02197bdeb 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/cat/CodeListMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/cat/CodeListMarshallingTest.java
@@ -35,7 +35,6 @@ import org.apache.sis.xml.internal.shared.LegacyNamespaces;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.citation.Responsibility;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/cat/EnumMarshallingTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/cat/EnumMarshallingTest.java
index 456988d2e4..bfaf7a9932 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/cat/EnumMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/cat/EnumMarshallingTest.java
@@ -28,7 +28,6 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
 import static org.apache.sis.test.Assertions.assertSetEquals;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-4.0 branch:
 import java.util.EnumSet;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/gml/TimePeriodTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/gml/TimePeriodTest.java
index 6039a06282..1f96de60cf 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/gml/TimePeriodTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/gml/TimePeriodTest.java
@@ -37,7 +37,6 @@ import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestInstance;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/lan/FreeTextMarshallingTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/lan/FreeTextMarshallingTest.java
index 88c4aabd40..218d6230e2 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/lan/FreeTextMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/lan/FreeTextMarshallingTest.java
@@ -27,7 +27,6 @@ import org.apache.sis.xml.internal.shared.LegacyNamespaces;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/lan/LanguageCodeTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/lan/LanguageCodeTest.java
index 7dab7b7ba6..2c55c17a55 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/lan/LanguageCodeTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/lan/LanguageCodeTest.java
@@ -35,7 +35,6 @@ import org.junit.jupiter.api.TestInstance;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.mock.MetadataMock;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import static org.apache.sis.test.Assertions.assertSingleton;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/metadata/replace/QualityParameterTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/metadata/replace/QualityParameterTest.java
index 6ea99d0656..4568f09813 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/metadata/replace/QualityParameterTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/metadata/replace/QualityParameterTest.java
@@ -26,7 +26,6 @@ import org.apache.sis.xml.Namespaces;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.Identifier;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/metadata/replace/ServiceParameterTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/metadata/replace/ServiceParameterTest.java
index 4d67ae3516..5b98ab6667 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/metadata/replace/ServiceParameterTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/bind/metadata/replace/ServiceParameterTest.java
@@ -25,7 +25,6 @@ import org.apache.sis.util.iso.Names;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.metadata.Identifier;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/DocumentComparator.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/DocumentComparator.java
index 33f828e359..c05a9c466e 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/DocumentComparator.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/DocumentComparator.java
@@ -74,13 +74,12 @@ import static org.junit.jupiter.api.Assertions.*;
  * @author  Martin Desruisseaux (Geomatys)
  * @author  Guilhem Legal (Geomatys)
  *
- * @see TestCase
- * @see org.apache.sis.test.MetadataAssert#assertXmlEquals(Object, Object, 
String[])
+ * @see TestCase#assertXmlEquals(Object, Object, String[])
  */
 public class DocumentComparator {
     /**
      * Commonly used prefixes for namespaces. Used as shorthands for calls to
-     * {@link org.apache.sis.test.MetadataAssert#assertXmlEquals(Object, 
Object, String[])}.
+     * {@link TestCase#assertXmlEquals(Object, Object, String[])}.
      *
      * @see #substitutePrefix(String)
      */
@@ -152,7 +151,7 @@ public class DocumentComparator {
      *   "http://www.w3.org/2001/XMLSchema-instance:schemaLocation";,
      *   "http://www.w3.org/2001/XMLSchema-instance:type";</pre>
      *
-     * Note that for convenience, the {@link 
org.apache.sis.test.MetadataAssert#assertXmlEquals(Object, Object, String[])}
+     * Note that for convenience, the {@link TestCase#assertXmlEquals(Object, 
Object, String[])}
      * method automatically replaces some widely used prefixes by their full 
URL.
      */
     public final Set<String> ignoredAttributes;
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/TestCase.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/TestCase.java
index 567e18913f..25da015416 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/TestCase.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/xml/test/TestCase.java
@@ -25,6 +25,8 @@ import java.io.InputStream;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.IOException;
+import javax.xml.parsers.ParserConfigurationException;
+import org.xml.sax.SAXException;
 import jakarta.xml.bind.Marshaller;
 import jakarta.xml.bind.Unmarshaller;
 import jakarta.xml.bind.JAXBException;
@@ -44,7 +46,6 @@ import org.junit.jupiter.api.parallel.Execution;
 import org.junit.jupiter.api.parallel.ExecutionMode;
 import org.junit.jupiter.api.parallel.ResourceAccessMode;
 import org.junit.jupiter.api.parallel.ResourceLock;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import org.apache.sis.test.LoggingWatcher;
 
 
@@ -203,6 +204,104 @@ public abstract class TestCase extends 
org.apache.sis.test.TestCase {
         }
     }
 
+    /**
+     * Parses two <abbr>XML</abbr> trees as <abbr>DOM</abbr> documents and 
compares the nodes.
+     * The inputs given to this method can be any of the following types:
+     *
+     * <ul>
+     *   <li>{@link org.w3c.dom.Node}: used directly without further 
processing.</li>
+     *   <li>{@link java.io.InputStream}: the stream is parsed as an XML 
document, then closed.</li>
+     *   <li>{@link java.nio.file.Path}, {@link java.io.File}, {@link 
java.net.URL} or {@link java.net.URI}:
+     *       the stream is opened, parsed as an XML document, then closed.</li>
+     *   <li>{@link String}: The string content is parsed directly as a XML 
document.</li>
+     * </ul>
+     *
+     * The comparison will ignore comments and the optional attributes given 
in arguments.
+     *
+     * <h4>Ignored attributes substitution</h4>
+     * For convenience, this method replaces some well known prefixes in the 
{@code ignoredAttributes}
+     * array by their full namespace URLs. For example, this method 
replaces{@code "xsi:schemaLocation"}
+     * by {@code "http://www.w3.org/2001/XMLSchema-instance:schemaLocation"}.
+     * If such substitution is not desired, consider using {@link 
DocumentComparator} directly instead.
+     *
+     * <p>The current substitution map is as below (may be expanded in any 
future SIS version):</p>
+     *
+     * <table class="sis">
+     *   <caption>Predefined prefix mapping</caption>
+     *   <tr><th>Prefix</th> <th>URL</th></tr>
+     *   <tr><td>xmlns</td>  <td>{@code 
"http://www.w3.org/2000/xmlns"}</td></tr>
+     *   <tr><td>xlink</td>  <td>{@value Namespaces#XLINK}</td></tr>
+     *   <tr><td>xsi</td>    <td>{@value Namespaces#XSI}</td></tr>
+     *   <tr><td>gml</td>    <td>{@value Namespaces#GML}</td></tr>
+     *   <tr><td>gco</td>    <td>{@value Namespaces#GCO}</td></tr>
+     *   <tr><td>gmd</td>    <td>{@value LegacyNamespaces#GMD}</td></tr>
+     *   <tr><td>gmx</td>    <td>{@value LegacyNamespaces#GMX}</td></tr>
+     *   <tr><td>gmi</td>    <td>{@value LegacyNamespaces#GMI}</td></tr>
+     * </table>
+     *
+     * <p>For example, in order to ignore the namespace, type and schema 
location declaration,
+     * the following strings can be given to the {@code ignoredAttributes} 
argument:</p>
+     *
+     * {@snippet :
+     *   "xmlns:*", "xsi:schemaLocation", "xsi:type"
+     *   }
+     *
+     * @param  expected           the expected XML document.
+     * @param  actual             the XML document to compare.
+     * @param  ignoredAttributes  the fully-qualified names of attributes to 
ignore
+     *                            (typically {@code "xmlns:*"} and {@code 
"xsi:schemaLocation"}).
+     *
+     * @see DocumentComparator
+     */
+    public static void assertXmlEquals(final Object expected, final Object 
actual, final String... ignoredAttributes) {
+        assertXmlEquals(expected, actual, 0, null, ignoredAttributes);
+    }
+
+    /**
+     * Parses two <abbr>XML</abbr> trees as <abbr>DOM</abbr> documents, and 
compares the nodes with the
+     * given tolerance threshold for numerical values. The inputs given to 
this method can be any of the
+     * types documented {@linkplain #assertXmlEquals(Object, Object, String[]) 
above}. This method will
+     * ignore comments and the optional attributes given in arguments as 
documented in the above method.
+     *
+     * @param  expected           the expected XML document.
+     * @param  actual             the XML document to compare.
+     * @param  tolerance          the tolerance threshold for comparison of 
numerical values.
+     * @param  ignoredNodes       the fully-qualified names of the nodes to 
ignore, or {@code null} if none.
+     * @param  ignoredAttributes  the fully-qualified names of attributes to 
ignore
+     *                            (typically {@code "xmlns:*"} and {@code 
"xsi:schemaLocation"}).
+     *
+     * @see DocumentComparator
+     */
+    public static void assertXmlEquals(final Object expected, final Object 
actual,
+            final double tolerance, final String[] ignoredNodes, final 
String[] ignoredAttributes)
+    {
+        final DocumentComparator comparator;
+        try {
+            comparator = new DocumentComparator(expected, actual);
+        } catch (IOException | ParserConfigurationException | SAXException e) {
+            /*
+             * We don't throw directly those exceptions since failing to parse 
the XML file can
+             * be considered as part of test failures and the JUnit exception 
for such failures
+             * is AssertionError. Having no checked exception in "assert" 
methods allow us to
+             * declare the checked exceptions only for the library code being 
tested.
+             */
+            throw new AssertionError(e);
+        }
+        comparator.tolerance = tolerance;
+        comparator.ignoreComments = true;
+        if (ignoredNodes != null) {
+            for (final String node : ignoredNodes) {
+                
comparator.ignoredNodes.add(DocumentComparator.substitutePrefix(node));
+            }
+        }
+        if (ignoredAttributes != null) {
+            for (final String attribute : ignoredAttributes) {
+                
comparator.ignoredAttributes.add(DocumentComparator.substitutePrefix(attribute));
+            }
+        }
+        comparator.compare();
+    }
+
     /**
      * Marshals the given object and ensures that the result is equal to the 
given string.
      * This convenience method uses a default set of attributes to ignore.
diff --git 
a/endorsed/src/org.apache.sis.profile.france/test/org/apache/sis/xml/bind/fra/DataIdentificationTest.java
 
b/endorsed/src/org.apache.sis.profile.france/test/org/apache/sis/xml/bind/fra/DataIdentificationTest.java
index 8adb2be696..f69635221e 100644
--- 
a/endorsed/src/org.apache.sis.profile.france/test/org/apache/sis/xml/bind/fra/DataIdentificationTest.java
+++ 
b/endorsed/src/org.apache.sis.profile.france/test/org/apache/sis/xml/bind/fra/DataIdentificationTest.java
@@ -21,8 +21,7 @@ import jakarta.xml.bind.JAXBException;
 // Test dependencies
 import org.junit.jupiter.api.Test;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 import static org.apache.sis.test.Assertions.assertSingleton;
 
 
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/ParameterMarshallingTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/ParameterMarshallingTest.java
index 2a67072385..38d0361fd9 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/ParameterMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/parameter/ParameterMarshallingTest.java
@@ -41,7 +41,6 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.opengis.test.Validators;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.referencing.Assertions.assertAliasTipEquals;
 import static 
org.apache.sis.referencing.Assertions.assertEpsgNameAndIdentifierEqual;
 
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/ImmutableIdentifierTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/ImmutableIdentifierTest.java
index 0b0365681c..032c4bc63e 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/ImmutableIdentifierTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/ImmutableIdentifierTest.java
@@ -36,8 +36,7 @@ import static org.junit.jupiter.api.Assertions.*;
 import org.opengis.test.Validators;
 import org.apache.sis.xml.test.TestCase;
 import static org.apache.sis.test.Assertions.assertMessageContains;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 import static org.apache.sis.referencing.Assertions.assertWktEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/crs/DefaultEngineeringCRSTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/crs/DefaultEngineeringCRSTest.java
index 9b78f8428e..ed6627d0e3 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/crs/DefaultEngineeringCRSTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/crs/DefaultEngineeringCRSTest.java
@@ -31,7 +31,6 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
 import org.apache.sis.referencing.cs.HardCodedCS;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.referencing.Assertions.assertWktEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
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 cc420d4e67..e96a3b4029 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
@@ -44,7 +44,6 @@ import org.apache.sis.xml.test.TestCase;
 import static org.apache.sis.test.Assertions.assertSingleton;
 import static org.apache.sis.test.Assertions.assertSingletonScope;
 import static org.apache.sis.test.Assertions.assertSerializedEquals;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.referencing.Assertions.assertWktEquals;
 import static org.apache.sis.referencing.Assertions.assertRemarksEquals;
 
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultPrimeMeridianTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultPrimeMeridianTest.java
index 6268fb7638..7bd590c500 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultPrimeMeridianTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultPrimeMeridianTest.java
@@ -35,7 +35,6 @@ import static 
org.apache.sis.referencing.GeodeticObjectVerifier.*;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.referencing.Assertions.assertWktEquals;
 import static org.apache.sis.referencing.Assertions.assertRemarksEquals;
 
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultVerticalDatumTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultVerticalDatumTest.java
index de6648d87c..1cf777e918 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultVerticalDatumTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/datum/DefaultVerticalDatumTest.java
@@ -34,7 +34,6 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
 import static org.apache.sis.test.Assertions.assertSingletonScope;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.referencing.Assertions.assertWktEquals;
 import static org.apache.sis.referencing.Assertions.assertRemarksEquals;
 
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/legacy/DefaultImageCRSTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/legacy/DefaultImageCRSTest.java
index 9b25e5ec04..6f68d1667e 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/legacy/DefaultImageCRSTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/legacy/DefaultImageCRSTest.java
@@ -32,7 +32,6 @@ import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
 import org.apache.sis.referencing.cs.HardCodedCS;
 import org.apache.sis.referencing.cs.HardCodedAxes;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.referencing.Assertions.assertWktEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/DefaultOperationMethodTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/DefaultOperationMethodTest.java
index 94c6e9d1ac..790aee1284 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/DefaultOperationMethodTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/DefaultOperationMethodTest.java
@@ -33,7 +33,7 @@ import 
org.apache.sis.parameter.DefaultParameterDescriptorGroup;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
 import static 
org.apache.sis.referencing.Assertions.assertEpsgNameAndIdentifierEqual;
 import static org.apache.sis.referencing.Assertions.assertWktEquals;
 
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/SingleOperationMarshallingTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/SingleOperationMarshallingTest.java
index 2242b61215..2d3815d2c8 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/SingleOperationMarshallingTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/referencing/operation/SingleOperationMarshallingTest.java
@@ -49,7 +49,6 @@ import static org.apache.sis.test.Assertions.assertSingleton;
 import static org.apache.sis.test.Assertions.assertSingletonAuthorityCode;
 import static org.apache.sis.test.Assertions.assertSingletonScope;
 import static org.apache.sis.test.Assertions.assertSingletonDomainOfValidity;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 import static org.apache.sis.referencing.Assertions.assertMatrixEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
diff --git 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/xml/bind/referencing/SecondDefiningParameterTest.java
 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/xml/bind/referencing/SecondDefiningParameterTest.java
index 153a01f3ae..a68e4cd78d 100644
--- 
a/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/xml/bind/referencing/SecondDefiningParameterTest.java
+++ 
b/endorsed/src/org.apache.sis.referencing/test/org/apache/sis/xml/bind/referencing/SecondDefiningParameterTest.java
@@ -25,7 +25,6 @@ import org.apache.sis.referencing.datum.DefaultEllipsoid;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.xml.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 
 /**
diff --git 
a/endorsed/src/org.apache.sis.storage.xml/test/org/apache/sis/storage/gpx/UpdaterTest.java
 
b/endorsed/src/org.apache.sis.storage.xml/test/org/apache/sis/storage/gpx/UpdaterTest.java
index 02ee8f6968..427187e7db 100644
--- 
a/endorsed/src/org.apache.sis.storage.xml/test/org/apache/sis/storage/gpx/UpdaterTest.java
+++ 
b/endorsed/src/org.apache.sis.storage.xml/test/org/apache/sis/storage/gpx/UpdaterTest.java
@@ -36,7 +36,7 @@ import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
+import static org.apache.sis.xml.test.TestCase.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.feature.Feature;
diff --git 
a/endorsed/src/org.apache.sis.storage.xml/test/org/apache/sis/storage/gpx/WriterTest.java
 
b/endorsed/src/org.apache.sis.storage.xml/test/org/apache/sis/storage/gpx/WriterTest.java
index fd82afd4a7..1b213ad6e3 100644
--- 
a/endorsed/src/org.apache.sis.storage.xml/test/org/apache/sis/storage/gpx/WriterTest.java
+++ 
b/endorsed/src/org.apache.sis.storage.xml/test/org/apache/sis/storage/gpx/WriterTest.java
@@ -34,7 +34,7 @@ import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.TestUtilities;
 import org.apache.sis.test.TestCase;
-import static org.apache.sis.metadata.Assertions.assertXmlEquals;
+import static org.apache.sis.xml.test.TestCase.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.feature.Feature;
diff --git 
a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/aggregate/ConcatenatedFeatureSetTest.java
 
b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/aggregate/ConcatenatedFeatureSetTest.java
index 18ba8edffc..cd509bf382 100644
--- 
a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/aggregate/ConcatenatedFeatureSetTest.java
+++ 
b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/aggregate/ConcatenatedFeatureSetTest.java
@@ -31,8 +31,8 @@ import static org.junit.jupiter.api.Assertions.*;
 import org.apache.sis.test.TestCase;
 import static org.apache.sis.test.Assertions.assertSingleton;
 import static org.apache.sis.test.Assertions.assertSingletonFeature;
-import static org.apache.sis.metadata.Assertions.assertContentInfoEquals;
-import static org.apache.sis.metadata.Assertions.assertFeatureSourceEquals;
+import static org.apache.sis.test.Assertions.assertContentInfoEquals;
+import static org.apache.sis.test.Assertions.assertFeatureSourceEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
 import org.opengis.feature.Feature;
diff --git 
a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/base/MetadataBuilderTest.java
 
b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/base/MetadataBuilderTest.java
index 7d8777bbc3..f80fc6a943 100644
--- 
a/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/base/MetadataBuilderTest.java
+++ 
b/endorsed/src/org.apache.sis.storage/test/org/apache/sis/storage/base/MetadataBuilderTest.java
@@ -29,9 +29,9 @@ import org.apache.sis.feature.DefaultFeatureType;
 // Test dependencies
 import org.junit.jupiter.api.Test;
 import static org.junit.jupiter.api.Assertions.*;
-import static org.apache.sis.metadata.Assertions.assertTitleEquals;
-import static org.apache.sis.metadata.Assertions.assertPartyNameEquals;
 import static org.apache.sis.test.Assertions.assertSingleton;
+import static org.apache.sis.test.Assertions.assertTitleEquals;
+import static org.apache.sis.test.Assertions.assertPartyNameEquals;
 import org.apache.sis.test.TestCase;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
diff --git 
a/endorsed/src/org.apache.sis.util/test/org/apache/sis/test/Assertions.java 
b/endorsed/src/org.apache.sis.util/test/org/apache/sis/test/Assertions.java
index 0a529c16b7..c564037de9 100644
--- a/endorsed/src/org.apache.sis.util/test/org/apache/sis/test/Assertions.java
+++ b/endorsed/src/org.apache.sis.util/test/org/apache/sis/test/Assertions.java
@@ -40,6 +40,8 @@ import org.opengis.metadata.extent.GeographicBoundingBox;
 import org.opengis.metadata.identification.Identification;
 import org.opengis.metadata.content.FeatureCatalogueDescription;
 import org.opengis.metadata.citation.Citation;
+import org.opengis.metadata.maintenance.Scope;
+import org.opengis.metadata.maintenance.ScopeCode;
 import org.opengis.referencing.IdentifiedObject;
 import org.opengis.util.InternationalString;
 import org.apache.sis.util.Utilities;
@@ -51,6 +53,11 @@ import org.apache.sis.util.Classes;
 import static org.junit.jupiter.api.Assertions.*;
 import org.opengis.referencing.ObjectDomain;
 
+// Specific to the geoapi-3.1 and geoapi-4.0 branches:
+import org.opengis.metadata.citation.Responsibility;
+import org.opengis.metadata.content.FeatureTypeInfo;
+import org.opengis.metadata.lineage.Source;
+
 
 /**
  * Assertion methods used by the <abbr>SIS</abbr> project in addition of the 
JUnit and GeoAPI assertions.
@@ -183,16 +190,6 @@ public final class Assertions {
         return 
assertSingleton(identification.getResourceFormats()).getFormatSpecificationCitation().getTitle().toString();
     }
 
-    /**
-     * Asserts that the given citation declares exactly one responsible party, 
and returns its name in English.
-     *
-     * @param  citation  the citation from which to get the responsible party.
-     * @return name of the responsible party in English.
-     */
-    public static String assertSingletonResponsibleParty(final Citation 
citation) {
-        return 
assertSingleton(assertSingleton(citation.getCitedResponsibleParties()).getParties()).getName().toString(Locale.US);
-    }
-
     /**
      * Asserts that the given object contains exactly one identifier, then 
returns the code of that identifier.
      *
@@ -212,7 +209,7 @@ public final class Assertions {
     public static String assertSingletonScope(final IdentifiedObject object) {
         InternationalString scope = 
assertSingleton(object.getDomains()).getScope();
         assertNotNull(scope, "Missing scope.");
-        return scope.toString(Locale.ENGLISH);
+        return scope.toString(Locale.US);
     }
 
     /**
@@ -227,6 +224,70 @@ public final class Assertions {
         return assertInstanceOf(GeographicBoundingBox.class, extent);
     }
 
+    /**
+     * Asserts that the English title of the given citation is equal to the 
expected string.
+     *
+     * @param expected  the expected English title.
+     * @param citation  the citation to test.
+     * @param message   the message to report in case of test failure.
+     */
+    public static void assertTitleEquals(final String expected, final Citation 
citation, final String message) {
+        assertNotNull(citation, message);
+        InternationalString title = citation.getTitle();
+        assertNotNull(title, message);
+        assertEquals(expected, title.toString(Locale.US), message);
+    }
+
+    /**
+     * Asserts that the given citation has only one responsible party,
+     * and its English name is equal to the expected string.
+     *
+     * @param expected  the expected English responsibly party name.
+     * @param citation  the citation to test.
+     * @param message   the message to report in case of test failure.
+     */
+    public static void assertPartyNameEquals(final String expected, final 
Citation citation, final String message) {
+        assertNotNull(citation, message);
+        Responsibility r = 
assertSingleton(citation.getCitedResponsibleParties());
+        InternationalString name = assertSingleton(r.getParties()).getName();
+        assertNotNull(name, message);
+        assertEquals(expected, name.toString(Locale.US), message);
+    }
+
+    /**
+     * Verifies that the given {@code ContentInfo} describes the given feature.
+     * This method expects that the given catalog contains exactly one feature 
info.
+     *
+     * @param  name     expected feature type name (possibly null).
+     * @param  count    expected feature instance count (possibly null).
+     * @param  catalog  the content info to validate.
+     */
+    public static void assertContentInfoEquals(final String name, final 
Integer count, final FeatureCatalogueDescription catalog) {
+        final FeatureTypeInfo info = 
assertSingleton(catalog.getFeatureTypeInfo());
+        assertEquals(name, String.valueOf(info.getFeatureTypeName()), 
"metadata.contentInfo.featureType");
+        assertEquals(count, info.getFeatureInstanceCount(), 
"metadata.contentInfo.featureInstanceCount");
+    }
+
+    /**
+     * Verifies that the source contains the given feature type. This method 
expects that the given source contains
+     * exactly one scope description and that the hierarchical level is {@link 
ScopeCode#FEATURE_TYPE}.
+     *
+     * @param  name      expected source identifier.
+     * @param  features  expected names of feature type.
+     * @param  source    the source to validate.
+     */
+    public static void assertFeatureSourceEquals(final String name, final 
String[] features, final Source source) {
+        assertEquals(name, 
String.valueOf(source.getSourceCitation().getTitle()), 
"metadata.lineage.source.sourceCitation.title");
+        final Scope scope = source.getScope();
+        assertNotNull(scope, "metadata.lineage.source.scope");
+        assertEquals(ScopeCode.FEATURE_TYPE, scope.getLevel(), 
"metadata.lineage.source.scope.level");
+        final var actual = 
assertSingleton(scope.getLevelDescription()).getFeatures().toArray(CharSequence[]::new);
+        for (int i=0; i<actual.length; i++) {
+            actual[i] = actual[i].toString();
+        }
+        assertArrayEquals(features, actual, 
"metadata.lineage.source.scope.levelDescription.feature");
+    }
+
     /**
      * Asserts that the two given objects are not equal.
      * This method tests all {@link ComparisonMode} except {@code DEBUG}.

Reply via email to