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


The following commit(s) were added to refs/heads/geoapi-4.0 by this push:
     new 67ece65ce1 Store the reason why the mandatory boolean value of a 
quality conformance result is missing. This is a partial replacement for a 
feature supported since SIS 0.3 but removed in SIS 1.4 because of 
https://issues.apache.org/jira/browse/SIS-586
67ece65ce1 is described below

commit 67ece65ce1cc874d79fa0b5f23756e49e0697002
Author: Martin Desruisseaux <martin.desruisse...@geomatys.com>
AuthorDate: Thu Nov 16 18:40:23 2023 +0100

    Store the reason why the mandatory boolean value of a quality conformance 
result is missing.
    This is a partial replacement for a feature supported since SIS 0.3 but 
removed in SIS 1.4
    because of https://issues.apache.org/jira/browse/SIS-586
---
 .../iso/quality/DefaultConformanceResult.java      |  82 +++++++++++++--
 .../sis/metadata/iso/quality/package-info.java     |   3 +-
 .../org/apache/sis/xml/bind/gco/GO_Boolean.java    |  11 ++
 .../org/apache/sis/xml/bind/gco/PropertyType.java  |  33 ++++++
 .../metadata/iso/quality/AbstractElementTest.java  |   2 +-
 .../quality/AbstractPositionalAccuracyTest.java    |   5 +-
 .../iso/quality/DefaultConformanceResultTest.java  | 117 +++++++++++++++++++++
 .../iso/quality/DefaultDomainConsistencyTest.java  |   2 +-
 .../iso/quality/DefaultEvaluationMethodTest.java   |  12 +--
 .../iso/quality/DefaultQuantitativeResultTest.java |   2 +-
 .../sis/metadata/iso/quality/ScopeCodeTest.java    |   4 +-
 .../test/org/apache/sis/xml/test/TestCase.java     |  12 +++
 12 files changed, 264 insertions(+), 21 deletions(-)

diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/DefaultConformanceResult.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/DefaultConformanceResult.java
index 05f287e6dd..2c5641f5fb 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/DefaultConformanceResult.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/DefaultConformanceResult.java
@@ -23,6 +23,8 @@ import org.opengis.util.InternationalString;
 import org.opengis.metadata.citation.Citation;
 import org.opengis.metadata.quality.ConformanceResult;
 import org.apache.sis.util.iso.Types;
+import org.apache.sis.xml.NilReason;
+import org.apache.sis.xml.bind.gco.GO_Boolean;
 
 
 /**
@@ -48,13 +50,13 @@ import org.apache.sis.util.iso.Types;
  * @author  Martin Desruisseaux (IRD, Geomatys)
  * @author  Touraïvane (IRD)
  * @author  Guilhem Legal (Geomatys)
- * @version 1.4
+ * @version 1.5
  * @since   0.3
  */
 @XmlType(name = "DQ_ConformanceResult_Type", propOrder = {
     "specification",
     "explanation",
-    "pass"
+    "result"
 })
 @XmlRootElement(name = "DQ_ConformanceResult")
 public class DefaultConformanceResult extends AbstractResult implements 
ConformanceResult {
@@ -77,13 +79,14 @@ public class DefaultConformanceResult extends 
AbstractResult implements Conforma
 
     /**
      * Indication of the conformance result.
-     *
-     * <p>The field is directly annotated here, because the getter method is 
called {@link #pass()},
-     * and JAXB does not recognize it. The method should have been called 
getPass() or isPass().</p>
      */
-    @XmlElement(name = "pass", required = true)
     private Boolean pass;
 
+    /**
+     * If no result is provided, the reason why.
+     */
+    private NilReason nilReason;
+
     /**
      * Constructs an initially empty conformance result.
      */
@@ -121,6 +124,9 @@ public class DefaultConformanceResult extends 
AbstractResult implements Conforma
             specification = object.getSpecification();
             explanation   = object.getExplanation();
             pass          = object.pass();
+            if (object instanceof DefaultConformanceResult) {
+                nilReason = ((DefaultConformanceResult) object).getNilReason();
+            }
         }
     }
 
@@ -193,6 +199,7 @@ public class DefaultConformanceResult extends 
AbstractResult implements Conforma
 
     /**
      * Returns an indication of the conformance result.
+     * If this method returns {@code null}, then {@link #getNilReason()} gives 
the reason why.
      *
      * @return indication of the conformance result, or {@code null}.
      */
@@ -210,4 +217,67 @@ public class DefaultConformanceResult extends 
AbstractResult implements Conforma
         checkWritePermission(pass);
         pass = newValue;
     }
+
+    /**
+     * Returns the reason why the result is missing.
+     * This value is non-null only if {@link #pass()} is null.
+     *
+     * @return the reason why the result is missing, or {@code null} if the 
result is not missing.
+     *
+     * @see NilReason#forObject(Object)
+     *
+     * @since 1.5
+     */
+    public NilReason getNilReason() {
+        return (pass != null) ? null : (nilReason != null) ? nilReason : 
NilReason.UNKNOWN;
+    }
+
+    /**
+     * Sets the reason why the result is missing.
+     * Invoking this method with a non-null value sets {@link #pass()} to 
{@code null}.
+     *
+     * @param  newValue  the reason why the result is missing, or {@code null} 
if the result is not missing.
+     *
+     * @since 1.5
+     */
+    public void setNilReason(final NilReason newValue) {
+        checkWritePermission(nilReason);
+        if ((nilReason = newValue) != null) {
+            pass = null;
+        }
+    }
+
+
+
+
+    
//////////////////////////////////////////////////////////////////////////////////////////////////
+    ////////                                                                   
               ////////
+    ////////                               XML support with JAXB               
               ////////
+    ////////                                                                   
               ////////
+    ////////        The following methods are invoked by JAXB using reflection 
(even if       ////////
+    ////////        they are private) or are helpers for other methods invoked 
by JAXB.       ////////
+    ////////        Those methods can be safely removed if Geographic Markup 
Language         ////////
+    ////////        (GML) support is not needed.                               
               ////////
+    ////////                                                                   
               ////////
+    
//////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Invoked by JAXB for fetching the value to marshal.
+     *
+     * @return the value to marshal.
+     */
+    @XmlElement(name = "pass", required = true)
+    private GO_Boolean getResult() {
+        return new GO_Boolean(pass(), getNilReason());
+    }
+
+    /**
+     * Invoked by JAXB for setting the value.
+     *
+     * @param  result  the value.
+     */
+    private void setResult(final GO_Boolean result) {
+        setPass(result.getElement());
+        setNilReason(result.parseNilReason());
+    }
 }
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/package-info.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/package-info.java
index c4c528276f..3a4817bb9d 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/package-info.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/metadata/iso/quality/package-info.java
@@ -40,7 +40,7 @@
  * @author  Guilhem Legal (Geomatys)
  * @author  Cullen Rombach (Image Matters)
  * @author  Alexis Gaillard (Geomatys)
- * @version 1.4
+ * @version 1.5
  * @since   0.3
  */
 @XmlSchema(location="https://schemas.isotc211.org/19157/-2/mdq/1.0/mdq.xsd";,
@@ -68,7 +68,6 @@
     @XmlJavaTypeAdapter(DQM_Parameter.class),
     @XmlJavaTypeAdapter(DQM_SourceReference.class),
     @XmlJavaTypeAdapter(DQM_ValueStructure.class),
-    @XmlJavaTypeAdapter(GO_Boolean.class),
     @XmlJavaTypeAdapter(GO_Temporal.class),
     @XmlJavaTypeAdapter(GO_DateTime.class),
     @XmlJavaTypeAdapter(GO_GenericName.class),
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gco/GO_Boolean.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gco/GO_Boolean.java
index f4224f806e..31bf1540e6 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gco/GO_Boolean.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gco/GO_Boolean.java
@@ -19,6 +19,7 @@ package org.apache.sis.xml.bind.gco;
 import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlSchemaType;
 import jakarta.xml.bind.annotation.XmlType;
+import org.apache.sis.xml.NilReason;
 
 
 /**
@@ -38,6 +39,16 @@ public final class GO_Boolean extends 
PropertyType<GO_Boolean, Boolean> {
     public GO_Boolean() {
     }
 
+    /**
+     * Builds a wrapper for the specified value, which may be nil.
+     *
+     * @param  value      the value to wrap.
+     * @param  nilReason  if the value is nil, the reason why.
+     */
+    public GO_Boolean(final Boolean value, final NilReason nilReason) {
+        super(value, nilReason);
+    }
+
     /**
      * Constructs a wrapper for the given value.
      *
diff --git 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gco/PropertyType.java
 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gco/PropertyType.java
index 5d8982ce2d..88a2888396 100644
--- 
a/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gco/PropertyType.java
+++ 
b/endorsed/src/org.apache.sis.metadata/main/org/apache/sis/xml/bind/gco/PropertyType.java
@@ -141,6 +141,22 @@ public abstract class PropertyType<ValueType extends 
PropertyType<ValueType,Boun
     protected PropertyType() {
     }
 
+    /**
+     * Builds a {@code PropertyType} wrapper for an instance of a primitive 
wrapper.
+     * Those property types are handled in a different way because final 
classes
+     * cannot implement the {@link NilObject} interface.
+     *
+     * @param  value      the primitive type wrapper.
+     * @param  nilReason  if the value is nil, the reason why.
+     */
+    protected PropertyType(final BoundType value, final NilReason nilReason) {
+        if (nilReason != null) {
+            reference = nilReason.toString();
+        } else {
+            metadata = value;
+        }
+    }
+
     /**
      * Builds a {@code PropertyType} wrapper for an instance of a final class.
      * This constructor checks for nil reasons only if {@code check} is {@code 
true}.
@@ -288,6 +304,23 @@ public abstract class PropertyType<ValueType extends 
PropertyType<ValueType,Boun
         return xlink;
     }
 
+    /**
+     * The reason why a mandatory attribute if left unspecified, as a parsed 
object.
+     *
+     * @return the nil reason, or {@code null} if none.
+     */
+    public final NilReason parseNilReason() {
+        final String reason = getNilReason();
+        if (reason == null) {
+            return null;
+        } else try {
+            return NilReason.valueOf(reason);
+        } catch (URISyntaxException e) {
+            Context.warningOccured(Context.current(), getClass(), 
"parseNilReason", e, true);
+            return NilReason.OTHER;
+        }
+    }
+
     /**
      * The reason why a mandatory attribute if left unspecified.
      *
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/AbstractElementTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/AbstractElementTest.java
index 3aca9e65e0..b5b2e61121 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/AbstractElementTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/AbstractElementTest.java
@@ -26,7 +26,7 @@ import java.util.Collection;
 import org.junit.Test;
 import org.apache.sis.test.TestCase;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/AbstractPositionalAccuracyTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/AbstractPositionalAccuracyTest.java
index 39e7dee852..7c15dd8824 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/AbstractPositionalAccuracyTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/AbstractPositionalAccuracyTest.java
@@ -21,6 +21,7 @@ import java.io.InputStream;
 import jakarta.xml.bind.JAXBException;
 import org.opengis.metadata.quality.Result;
 import org.opengis.util.InternationalString;
+import org.opengis.metadata.quality.ConformanceResult;
 
 // Test dependencies
 import org.junit.Test;
@@ -28,7 +29,7 @@ import org.apache.sis.xml.bind.lan.FreeTextMarshallingTest;
 import org.apache.sis.metadata.xml.TestUsingFile;
 import org.apache.sis.test.DependsOn;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.opengis.test.Assert.assertInstanceOf;
 import static org.apache.sis.test.TestUtilities.getSingleton;
 
@@ -102,7 +103,7 @@ public final class AbstractPositionalAccuracyTest extends 
TestUsingFile {
          */
         final Result result = getSingleton(metadata.getResults());
         assertInstanceOf("Wrong value for <gmd:result>", 
DefaultConformanceResult.class, result);
-        assertEquals("result.pass", Boolean.TRUE, ((DefaultConformanceResult) 
result).pass());
+        assertEquals(Boolean.TRUE, ((ConformanceResult) result).pass(), 
"result.pass");
         /*
          * Marshalling: ensure that we didn't lost any information.
          */
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultConformanceResultTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultConformanceResultTest.java
new file mode 100644
index 0000000000..0b64e76994
--- /dev/null
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultConformanceResultTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.iso.quality;
+
+import jakarta.xml.bind.JAXBException;
+import org.apache.sis.util.SimpleInternationalString;
+import org.apache.sis.xml.Namespaces;
+import org.apache.sis.xml.NilReason;
+
+// Test dependencies
+import org.junit.Test;
+import org.apache.sis.xml.test.TestCase;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+
+/**
+ * Tests {@link DefaultConformanceResult}.
+ *
+ * @author  Martin Desruisseaux (Geomatys)
+ */
+public final class DefaultConformanceResultTest extends TestCase {
+    /**
+     * Creates a new test case.
+     */
+    public DefaultConformanceResultTest() {
+    }
+
+    /**
+     * Tests marshalling and unmarshalling of the given result.
+     *
+     * @param  result  the result to test.
+     * @param  xml     the expected XML
+     * @throws JAXBException if an error occurred during the during 
marshalling / unmarshalling processes.
+     */
+    private void testXML(final DefaultConformanceResult result, final String 
xml) throws JAXBException {
+        result.setExplanation(new SimpleInternationalString("A result"));
+        assertMarshalEquals(xml, result);
+        assertEquals(result, unmarshal(DefaultConformanceResult.class, xml));
+    }
+
+    /**
+     * Tests (un)marshalling of an XML document with a result.
+     *
+     * @throws JAXBException if an error occurred during the during 
marshalling / unmarshalling processes.
+     */
+    @Test
+    public void testXML() throws JAXBException {
+        final var result = new DefaultConformanceResult();
+        result.setPass(true);
+        assertNull(result.getNilReason());
+        testXML(result,
+                "<mdq:DQ_ConformanceResult xmlns:mdq=\"" + Namespaces.MDQ + '"'
+                                       + " xmlns:gco=\"" + Namespaces.GCO + 
"\">\n" +
+                "  <mdq:explanation>\n" +
+                "    <gco:CharacterString>A result</gco:CharacterString>\n" +
+                "  </mdq:explanation>\n" +
+                "  <mdq:pass>\n" +
+                "    <gco:Boolean>true</gco:Boolean>\n" +
+                "  </mdq:pass>\n" +
+                "</mdq:DQ_ConformanceResult>");
+    }
+
+    /**
+     * Tests (un)marshalling of an XML document with a result missing for an 
unknown reason.
+     *
+     * @throws JAXBException if an error occurred during the during 
marshalling / unmarshalling processes.
+     */
+    @Test
+    public void testUnknownReason() throws JAXBException {
+        final var result = new DefaultConformanceResult();
+        assertEquals(NilReason.UNKNOWN, result.getNilReason());
+        testXML(result,
+                "<mdq:DQ_ConformanceResult xmlns:mdq=\"" + Namespaces.MDQ + '"'
+                                       + " xmlns:gco=\"" + Namespaces.GCO + 
"\">\n" +
+                "  <mdq:explanation>\n" +
+                "    <gco:CharacterString>A result</gco:CharacterString>\n" +
+                "  </mdq:explanation>\n" +
+                "  <mdq:pass gco:nilReason=\"unknown\"/>\n" +
+                "</mdq:DQ_ConformanceResult>");
+    }
+
+    /**
+     * Tests (un)marshalling of an XML document with a result missing because 
the XML is a template.
+     *
+     * @throws JAXBException if an error occurred during the during 
marshalling / unmarshalling processes.
+     */
+    @Test
+    public void testTemplateReason() throws JAXBException {
+        final var result = new DefaultConformanceResult();
+        result.setPass(true);
+        result.setNilReason(NilReason.TEMPLATE);
+        assertNull(result.pass());
+        testXML(result,
+                "<mdq:DQ_ConformanceResult xmlns:mdq=\"" + Namespaces.MDQ + '"'
+                                       + " xmlns:gco=\"" + Namespaces.GCO + 
"\">\n" +
+                "  <mdq:explanation>\n" +
+                "    <gco:CharacterString>A result</gco:CharacterString>\n" +
+                "  </mdq:explanation>\n" +
+                "  <mdq:pass gco:nilReason=\"template\"/>\n" +
+                "</mdq:DQ_ConformanceResult>");
+    }
+}
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultDomainConsistencyTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultDomainConsistencyTest.java
index 8cd98a147a..f1dd37ee97 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultDomainConsistencyTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultDomainConsistencyTest.java
@@ -24,7 +24,7 @@ import java.util.Set;
 import org.junit.Test;
 import org.apache.sis.test.TestCase;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethodTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethodTest.java
index a7e2e0a50a..7a931c7a13 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethodTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultEvaluationMethodTest.java
@@ -24,7 +24,7 @@ import java.time.temporal.Temporal;
 import org.junit.Test;
 import org.apache.sis.test.TestCase;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.apache.sis.test.Assertions.assertSerializedEquals;
 
 
@@ -52,7 +52,7 @@ public final class DefaultEvaluationMethodTest extends 
TestCase {
         /*
          * dates = []
          */
-        assertTrue("isEmpty()", dates.isEmpty());
+        assertTrue(dates.isEmpty(), "isEmpty()");
         assertCanNotGet(dates, 2);
         assertCanNotGet(dates, 1);
         assertCanNotGet(dates, 0);
@@ -62,7 +62,7 @@ public final class DefaultEvaluationMethodTest extends 
TestCase {
         assertCanNotAdd(dates, 2, now);
         assertCanNotAdd(dates, 1, now);
         dates.add(0, now);
-        assertEquals("size()", 1, dates.size());
+        assertEquals(1, dates.size(), "size()");
         assertCanNotGet(dates, 2);
         assertCanNotGet(dates, 1);
         assertEquals(now, dates.get(0));
@@ -71,7 +71,7 @@ public final class DefaultEvaluationMethodTest extends 
TestCase {
          */
         assertCanNotAdd(dates, 2, later);
         dates.add(1, later);
-        assertEquals("size()", 2, dates.size());
+        assertEquals(2, dates.size(), "size()");
         assertCanNotGet(dates, 2);
         assertEquals(later, dates.get(1));
         assertEquals(now,   dates.get(0));
@@ -79,7 +79,7 @@ public final class DefaultEvaluationMethodTest extends 
TestCase {
          * dates = [later]
          */
         assertEquals(now, dates.remove(0));
-        assertEquals("size()", 1, dates.size());
+        assertEquals(1, dates.size(), "size()");
         assertCanNotGet(dates, 2);
         assertCanNotGet(dates, 1);
         assertEquals(later, dates.get(0));
@@ -87,7 +87,7 @@ public final class DefaultEvaluationMethodTest extends 
TestCase {
          * dates = [now, later]
          */
         dates.add(0, now);
-        assertEquals("size()", 2, dates.size());
+        assertEquals(2, dates.size(), "size()");
         assertCanNotGet(dates, 2);
         assertEquals(later, dates.get(1));
         assertEquals(now,   dates.get(0));
diff --git 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
index de37ed6bb6..396fdc68b2 100644
--- 
a/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
+++ 
b/endorsed/src/org.apache.sis.metadata/test/org/apache/sis/metadata/iso/quality/DefaultQuantitativeResultTest.java
@@ -37,7 +37,7 @@ import org.junit.Test;
 import org.apache.sis.test.TestUtilities;
 import org.apache.sis.test.TestCase;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 
 
 /**
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 61f7441757..bf708118a7 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,7 @@ import org.opengis.metadata.maintenance.ScopeCode;
 import org.junit.Test;
 import org.apache.sis.xml.test.TestCase;
 
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
 import static org.apache.sis.metadata.Assertions.assertXmlEquals;
 
 // Specific to the geoapi-3.1 and geoapi-4.0 branches:
@@ -80,7 +80,7 @@ public final class ScopeCodeTest extends TestCase {
     public void testUnmarshallingLegacy() throws JAXBException {
         final DefaultDataQuality metadata = 
unmarshal(DefaultDataQuality.class, XML);
         final Scope scope = metadata.getScope();
-        assertNotNull("scope", scope);
+        assertNotNull(scope, "scope");
         assertEquals(ScopeCode.DATASET, scope.getLevel());
     }
 }
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 7b86ff7f1b..3f9c9afa5d 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
@@ -175,6 +175,18 @@ public abstract class TestCase extends 
org.apache.sis.test.TestCase {
         }
     }
 
+    /**
+     * 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.
+     *
+     * @param  expected  the expected XML.
+     * @param  object    the object to marshal.
+     * @throws JAXBException if an error occurred during marshalling.
+     */
+    protected final void assertMarshalEquals(final String expected, final 
Object object) throws JAXBException {
+        assertXmlEquals(expected, marshal(object), "xmlns:*");
+    }
+
     /**
      * Marshals the given object and ensures that the result is equal to the 
content of the given stream.
      * The stream should be opened by a call to {@link 
Class#getResourceAsStream(String)} from the module

Reply via email to