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" ); }
