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

andy pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/jena.git

commit 869126393d112761a9b5712c4508057c8ef096e4
Author: Andy Seaborne <[email protected]>
AuthorDate: Fri Sep 19 22:15:15 2025 +0100

    GH-3451: Test harness for C14N tests
---
 .../riot/{RiotEvalTest.java => RiotC14NTest.java}  | 110 ++++++++++-----------
 .../apache/jena/arq/junit/riot/RiotEvalTest.java   |  12 +--
 .../apache/jena/arq/junit/riot/RiotSyntaxTest.java |   2 +-
 .../org/apache/jena/arq/junit/riot/RiotTests.java  |  33 +++++--
 .../apache/jena/arq/junit/riot/VocabLangRDF.java   |  21 ++--
 5 files changed, 88 insertions(+), 90 deletions(-)

diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotEvalTest.java 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotC14NTest.java
similarity index 57%
copy from 
jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotEvalTest.java
copy to jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotC14NTest.java
index 5968a5e12b..ea8d8cae47 100644
--- a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotEvalTest.java
+++ b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotC14NTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.jena.arq.junit.riot;
 
-import static org.apache.jena.arq.junit.riot.RiotTestsConfig.fragment;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.fail;
 
@@ -26,18 +25,19 @@ import java.util.function.Consumer;
 
 import org.apache.jena.arq.junit.manifest.AbstractManifestTest;
 import org.apache.jena.arq.junit.manifest.ManifestEntry;
+import org.apache.jena.atlas.io.IO;
+import org.apache.jena.atlas.lib.IRILib;
 import org.apache.jena.graph.Graph;
 import org.apache.jena.riot.*;
-import org.apache.jena.riot.system.ErrorHandlerFactory;
 import org.apache.jena.riot.system.StreamRDF;
 import org.apache.jena.riot.system.StreamRDFLib;
 import org.apache.jena.sparql.core.DatasetGraph;
 import org.apache.jena.sparql.core.DatasetGraphFactory;
 import org.apache.jena.sparql.graph.GraphFactory;
-import org.apache.jena.sparql.util.IsoMatcher;
 
-public class RiotEvalTest extends AbstractManifestTest {
-    final private boolean       expectLegalSyntax;
+public class RiotC14NTest extends AbstractManifestTest {
+
+    final private boolean       positiveTest;
     final private Lang          lang;
     final private String        filename;
 
@@ -46,9 +46,9 @@ public class RiotEvalTest extends AbstractManifestTest {
     final private String output;
     final private Consumer<StreamRDF> parser;
 
-    public RiotEvalTest(ManifestEntry entry, String base, Lang lang, boolean 
positiveTest) {
+    public RiotC14NTest(ManifestEntry entry, String base, Lang lang, boolean 
positiveTest) {
         super(entry);
-        this.expectLegalSyntax = positiveTest;
+        this.positiveTest = positiveTest;
         this.filename = entry.getAction().getURI();
         this.lang = lang;
         baseIRI = base;
@@ -59,107 +59,97 @@ public class RiotEvalTest extends AbstractManifestTest {
         parser = ( baseIRI != null )
             ? ParsingStepForTest.parse(input, baseIRI, lang, silentWarnings)
             : ParsingStepForTest.parse(input, lang, silentWarnings);
+
     }
 
     @Override
-    public void runTest()
-    {
-        // Could generalise run4() to cover both cases.
-        // run3() predates dataset reading and is more tested.
+    public void runTest() {
         if ( RDFLanguages.isTriples(lang) )
             run3();
         else
             run4();
     }
 
-    // Triples test.
-    private void run3() {
-        Graph graph = GraphFactory.createDefaultGraph();
+    public void run3()
+    {
+        Graph graph = GraphFactory.createGraphMem();
         StreamRDF dest = StreamRDFLib.graph(graph);
         try {
             parser.accept(dest);
 
-            if ( ! expectLegalSyntax ) {
-                String fragment = fragment(manifestEntry.getURI());
-                if ( fragment != null )
-                    fail(fragment+": Passed bad syntax eval test");
-                else
-                    fail("Passed bad syntax eval test");
-            }
-
-            Lang outLang = RDFLanguages.filenameToLang(output, Lang.NQUADS);
+            Lang outLang = RDFLanguages.filenameToLang(output, Lang.NTRIPLES);
 
-            Graph results = GraphFactory.createDefaultGraph();
+            // Exactly this string.
+            String actual = 
RDFWriter.source(graph).format(RDFFormat.NTRIPLES_UTF8).asString();
+            String expected;
             try {
-                
RDFParser.create().errorHandler(ErrorHandlerFactory.errorHandlerNoWarnings)
-                    .base(baseIRI)
-                    .forceLang(outLang)
-                    .source(output)
-                    .parse(results);
+                expected = readFile(output);
             } catch (RiotException ex) {
                 fail("Failed to read results: "+ex.getMessage());
+                return;
             }
-
-            boolean b = IsoMatcher.isomorphic(graph, results);
+            boolean b = expected.equals(actual);
 
             if ( !b ) {
-                // graph.isIsomorphicWith(results);
-                System.out.println("---- Parsed");
-                RDFDataMgr.write(System.out, graph, Lang.TURTLE);
+                System.out.println("**** Test: "+manifestEntry.getName());
+                System.out.println("---- Input");
+                String inputString = readFile(input);
+                System.out.print(inputString);
+                System.out.println("---- Actual");
+                System.out.print(actual);
                 System.out.println("---- Expected");
-                
results.getPrefixMapping().setNsPrefixes(graph.getPrefixMapping());
-                RDFDataMgr.write(System.out, results, Lang.TURTLE);
+                System.out.print(expected);
                 System.out.println("--------");
             }
-            assertTrue(b, "Graphs not isomorphic");
+            assertTrue(b, "Does not match expected canonical text");
         } catch (RiotException ex) {
-            if ( expectLegalSyntax )
+            if ( positiveTest )
                 throw ex;
         }
     }
 
-    private void run4() {
+    public void run4()
+    {
         DatasetGraph dsg = DatasetGraphFactory.create();
         StreamRDF dest = StreamRDFLib.dataset(dsg);
         try {
             parser.accept(dest);
 
-            if ( ! expectLegalSyntax )
-                fail("Passed bad syntax eval test");
-
             Lang outLang = RDFLanguages.filenameToLang(output, Lang.NQUADS);
 
-            DatasetGraph results = DatasetGraphFactory.create();
+            // Exactly this string.
+            String actual = 
RDFWriter.source(dsg).format(RDFFormat.NQUADS_UTF8).asString();
+
+            String expected;
             try {
-                
RDFParser.create().errorHandler(ErrorHandlerFactory.errorHandlerNoWarnings)
-                    .base(baseIRI)
-                    .forceLang(outLang)
-                    .source(output)
-                    .parse(results);
+                expected = readFile(output);
             } catch (RiotException ex) {
                 fail("Failed to read results: "+ex.getMessage());
+                return;
             }
+            boolean b = expected.equals(actual);
 
-            boolean b = isomorphic(dsg, results);
-
-            if ( !b )
-            {
+            if ( !b ) {
                 System.out.println("**** Test: "+manifestEntry.getName());
-                System.out.println("---- Parsed");
-                RDFDataMgr.write(System.out, dsg, Lang.TRIG);
+                System.out.println("---- Input");
+                String inputString = readFile(input);
+                System.out.print(inputString);
+                System.out.println("---- Actual");
+                System.out.print(actual);
                 System.out.println("---- Expected");
-                RDFDataMgr.write(System.out, results, Lang.TRIG);
+                System.out.print(expected);
                 System.out.println("--------");
             }
-
-            assertTrue(b, "Datasets not isomorphic");
+            assertTrue(b, "Does not match expected canonical text");
         } catch (RiotException ex) {
-            if ( expectLegalSyntax )
+            if ( positiveTest )
                 throw ex;
         }
     }
 
-    private boolean isomorphic(DatasetGraph dsg1, DatasetGraph dsg2) {
-        return IsoMatcher.isomorphic(dsg1, dsg2);
+    String readFile(String name) {
+        if ( name.startsWith("file:") )
+            return IO.readWholeFileAsUTF8(IRILib.IRIToFilename(name));
+        return IO.readWholeFileAsUTF8(name);
     }
 }
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotEvalTest.java 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotEvalTest.java
index 5968a5e12b..35e5db0c89 100644
--- a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotEvalTest.java
+++ b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotEvalTest.java
@@ -37,7 +37,7 @@ import org.apache.jena.sparql.graph.GraphFactory;
 import org.apache.jena.sparql.util.IsoMatcher;
 
 public class RiotEvalTest extends AbstractManifestTest {
-    final private boolean       expectLegalSyntax;
+    final private boolean       positiveTest;
     final private Lang          lang;
     final private String        filename;
 
@@ -48,7 +48,7 @@ public class RiotEvalTest extends AbstractManifestTest {
 
     public RiotEvalTest(ManifestEntry entry, String base, Lang lang, boolean 
positiveTest) {
         super(entry);
-        this.expectLegalSyntax = positiveTest;
+        this.positiveTest = positiveTest;
         this.filename = entry.getAction().getURI();
         this.lang = lang;
         baseIRI = base;
@@ -79,7 +79,7 @@ public class RiotEvalTest extends AbstractManifestTest {
         try {
             parser.accept(dest);
 
-            if ( ! expectLegalSyntax ) {
+            if ( ! positiveTest ) {
                 String fragment = fragment(manifestEntry.getURI());
                 if ( fragment != null )
                     fail(fragment+": Passed bad syntax eval test");
@@ -113,7 +113,7 @@ public class RiotEvalTest extends AbstractManifestTest {
             }
             assertTrue(b, "Graphs not isomorphic");
         } catch (RiotException ex) {
-            if ( expectLegalSyntax )
+            if ( positiveTest )
                 throw ex;
         }
     }
@@ -124,7 +124,7 @@ public class RiotEvalTest extends AbstractManifestTest {
         try {
             parser.accept(dest);
 
-            if ( ! expectLegalSyntax )
+            if ( ! positiveTest )
                 fail("Passed bad syntax eval test");
 
             Lang outLang = RDFLanguages.filenameToLang(output, Lang.NQUADS);
@@ -154,7 +154,7 @@ public class RiotEvalTest extends AbstractManifestTest {
 
             assertTrue(b, "Datasets not isomorphic");
         } catch (RiotException ex) {
-            if ( expectLegalSyntax )
+            if ( positiveTest )
                 throw ex;
         }
     }
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotSyntaxTest.java 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotSyntaxTest.java
index bbfdca44b8..926c3be322 100644
--- a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotSyntaxTest.java
+++ b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotSyntaxTest.java
@@ -34,7 +34,7 @@ import org.apache.jena.riot.system.StreamRDF;
 import org.apache.jena.riot.system.StreamRDFLib;
 import org.apache.jena.shared.NotFoundException;
 
-public class RiotSyntaxTest extends AbstractManifestTest{
+public class RiotSyntaxTest extends AbstractManifestTest {
 
     final private boolean expectLegalSyntax;
     final private String filename;
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotTests.java 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotTests.java
index 839958ebb7..9982ea1104 100644
--- a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotTests.java
+++ b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/RiotTests.java
@@ -32,12 +32,6 @@ import org.apache.jena.vocabulary.TestManifest;
 
 public class RiotTests
 {
-    public static String assumedRootURIex = "http://example/base/";;
-
-//    // Depends on origin of the tests.
-//    // Now done by entry.getManifest().getTestBase();
-//    public static String x_assumedRootURITurtle = 
"https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-turtle/";;
-//    public static String x_assumedRootURITriG = 
"https://w3c.github.io/rdf-tests/rdf/rdf11/rdf-trig/";;
 
     /** Create a RIOT language test - or return null for "unrecognized" */
     public static Runnable makeRIOTTest(ManifestEntry entry) {
@@ -65,8 +59,10 @@ public class RiotTests
             // Some tests assume a certain base URI.
 
             // == Syntax tests.
-
+            // Assumed base from manifest.
             String assumedBase = entry.getManifest().getTestBase();
+            if ( assumedBase == null )
+                assumedBase = "http://example/base/";;
 
             // TTL
             if ( equalsType(testType, VocabLangRDF.TestPositiveSyntaxTTL) ) {
@@ -146,7 +142,7 @@ public class RiotTests
             }
 
             if ( equalsType(testType, VocabLangRDF.TestEvalRJ) ) {
-                String base = rebase(input, assumedRootURIex);
+                String base = rebase(input, assumedBase);
                 return new RiotEvalTest(entry, base, RDFLanguages.RDFJSON, 
true);
             }
 //            if ( equalsType(testType, VocabLangRDF.TestNegativeEvalRJ) ) {
@@ -154,6 +150,27 @@ public class RiotTests
 //                return new RiotEvalTest(entry, base, RDFLanguages.RDFJSON, 
false);
 //            }
 
+            // Canonicalization tests
+            if ( equalsType(testType, VocabLangRDF.TestNTriplesPositiveC14N) ) 
{
+                String base = rebase(input, assumedBase);
+                return new RiotC14NTest(entry, base, RDFLanguages.NTRIPLES, 
true);
+            }
+
+            if ( equalsType(testType, VocabLangRDF.TestNTriplesNegativeC14N) ) 
{
+                String base = rebase(input, assumedBase);
+                return new RiotC14NTest(entry, base, RDFLanguages.NTRIPLES, 
false);
+
+            }
+            if ( equalsType(testType, VocabLangRDF.TestNQuadsPositiveC14N) ) {
+                String base = rebase(input, assumedBase);
+                return new RiotC14NTest(entry, base, RDFLanguages.NQUADS, 
true);
+
+            }
+            if ( equalsType(testType, VocabLangRDF.TestNQuadsNegativeC14N) ) {
+                String base = rebase(input, assumedBase);
+                return new RiotC14NTest(entry, base, RDFLanguages.NQUADS, 
false);
+            }
+
             // == Not supported : Entailment tests.
 
             String NSX = TestManifest.NS;
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/VocabLangRDF.java 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/VocabLangRDF.java
index b2543bdcd9..21d7543068 100644
--- a/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/VocabLangRDF.java
+++ b/jena-arq/src/test/java/org/apache/jena/arq/junit/riot/VocabLangRDF.java
@@ -40,49 +40,40 @@ public class VocabLangRDF
     public static final Resource NAMESPACE = m_model.createResource( NS );
 
     public static final Resource TestPositiveSyntaxTTL      = 
m_model.createResource( NS+"TestTurtlePositiveSyntax" );
-
     public static final Resource TestNegativeSyntaxTTL      = 
m_model.createResource( NS+"TestTurtleNegativeSyntax" );
-
     public static final Resource TestEvalTTL                = 
m_model.createResource( NS+"TestTurtleEval" );
-
     public static final Resource TestNegativeEvalTTL        = 
m_model.createResource( NS+"TestTurtleNegativeEval" );
 
     public static final Resource TestPositiveSyntaxNT       = 
m_model.createResource( NS+"TestNTriplesPositiveSyntax" );
-
     public static final Resource TestNegativeSyntaxNT       = 
m_model.createResource( NS+"TestNTriplesNegativeSyntax" );
-
     public static final Resource TestEvalNT                 = 
m_model.createResource( NS+"TestNTriplesEval" );
 
     public static final Resource TestNegativeEvalNT         = 
m_model.createResource( NS+"TestNTriplesNegativeEval" );
-
     public static final Resource TestPositiveSyntaxRJ       = 
m_model.createResource( NS+"TestRDFJSONPositiveSyntax" );
 
     public static final Resource TestNegativeSyntaxRJ       = 
m_model.createResource( NS+"TestRDFJSONNegativeSyntax" );
-
     public static final Resource TestEvalRJ                 = 
m_model.createResource( NS+"TestRDFJSONEval" );
-
     public static final Resource TestNegativeEvalRJ         = 
m_model.createResource( NS+"TestRDFJSONNegativeEval" );
 
     public static final Resource TestPositiveSyntaxNQ       = 
m_model.createResource( NS+"TestNQuadsPositiveSyntax" );
-
     public static final Resource TestNegativeSyntaxNQ       = 
m_model.createResource( NS+"TestNQuadsNegativeSyntax" );
-
     public static final Resource TestEvalNQ                 = 
m_model.createResource( NS+"TestNQuadsEval" );
-
     public static final Resource TestNegativeEvalNQ         = 
m_model.createResource( NS+"TestNQuadsNegativeEval" );
 
     public static final Resource TestPositiveSyntaxTriG     = 
m_model.createResource( NS+"TestTrigPositiveSyntax" );
-
     public static final Resource TestNegativeSyntaxTriG     = 
m_model.createResource( NS+"TestTrigNegativeSyntax" );
-
     public static final Resource TestEvalTriG               = 
m_model.createResource( NS+"TestTrigEval" );
-
     public static final Resource TestNegativeEvalTriG       = 
m_model.createResource( NS+"TestTrigNegativeEval" );
 
     public static final Resource TestPositiveRDFXML         = 
m_model.createResource( NS+"TestXMLEval" );
-
     public static final Resource TestNegativeRDFXML         = 
m_model.createResource( NS+"TestXMLNegativeSyntax" );
 
+    // Canonicalization tests
+    public static final Resource TestNTriplesPositiveC14N   = 
m_model.createResource( NS+"TestNTriplesPositiveC14N" );
+    public static final Resource TestNTriplesNegativeC14N   = 
m_model.createResource( NS+"TestNTriplesNegativeC14N" );
+    public static final Resource TestNQuadsPositiveC14N     = 
m_model.createResource( NS+"TestNQuadsPositiveC14N" );
+    public static final Resource TestNQuadsNegativeC14N     = 
m_model.createResource( NS+"TestNQuadsNegativeC14N" );
+
     public static final Resource TestSurpressed             = 
m_model.createResource( NS+"Test" );
 }
 

Reply via email to