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


The following commit(s) were added to refs/heads/main by this push:
     new 82f4723057 Improve rdftests
82f4723057 is described below

commit 82f4723057287ca53565ac39ea4eb53152836531
Author: Andy Seaborne <a...@apache.org>
AuthorDate: Sun Sep 7 20:39:23 2025 +0100

    Improve rdftests
---
 .../java/org/apache/jena/arq/junit/LibTest.java    |   1 +
 .../jena/arq/junit/manifest/ManifestProcessor.java |  35 +++----
 .../apache/jena/arq/junit/riot/RiotSyntaxTest.java |  27 ++++--
 .../jena/arq/junit/sparql/tests/QueryEvalTest.java |  16 +--
 .../arq/junit/sparql/tests/QuerySyntaxTest.java    |   8 +-
 .../jena/arq/junit/textrunner/ExecutionStats.java  |  71 ++++++++++++++
 .../junit/textrunner/ManifestConfiguration.java    |  51 ++++++++++
 .../jena/arq/junit/textrunner/ManifestHolder.java  |  51 +++++-----
 .../junit/textrunner/PrintExecutionListener.java   | 107 +++++++++++----------
 .../{TextTestRunner5.java => TextTestRunner.java}  |  66 +++++++------
 jena-arq/testing/DAWG/Syntax/manifest.n3           |   2 +-
 jena-cmds/src/test/java/arq/rdftests.java          |  26 +++--
 12 files changed, 299 insertions(+), 162 deletions(-)

diff --git a/jena-arq/src/test/java/org/apache/jena/arq/junit/LibTest.java 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/LibTest.java
index 06ec2b567f..f54c730018 100644
--- a/jena-arq/src/test/java/org/apache/jena/arq/junit/LibTest.java
+++ b/jena-arq/src/test/java/org/apache/jena/arq/junit/LibTest.java
@@ -31,6 +31,7 @@ public class LibTest {
         for ( int i = 0 ; i < x.length ; i++ ) {
             System.out.printf("%2d -- %s\n", i+1, x[i]);
         }
+        System.out.println("====");
     }
 
     /** Print a (small) file, with line numbers. The file is read into memory. 
*/
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/manifest/ManifestProcessor.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/manifest/ManifestProcessor.java
index 59286e943e..95feb3c14a 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/manifest/ManifestProcessor.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/manifest/ManifestProcessor.java
@@ -40,12 +40,19 @@ import org.apache.jena.system.G;
  * {@link DynamicContainer}.
  * <p>
  * Manifest files can contain other manifest files.
- *
  */
 public class ManifestProcessor {
 
     private static int counterTest = 0;
-    private static int counterContainer = 0;
+    private static int counterManifests = 0;
+
+    public static int getCounterTest() {
+        return counterTest;
+    }
+
+    public static int getCounterManifests() {
+        return counterManifests;
+    }
 
     public static Stream<DynamicNode> testFactory(String filename, String 
namePrefix, EntryToTest entryToTest) {
         DynamicContainer tests = ManifestProcessor.buildFrom(filename, 
namePrefix, entryToTest);
@@ -59,7 +66,7 @@ public class ManifestProcessor {
 
     // "visited" is a safety measure to detect loops in included manifests 
files.
     private static DynamicContainer build(String filenameOrURI, String 
namePrefix, EntryToTest entryToTest, Set<String> visited) {
-        int x = ++counterContainer;
+        int x = ++counterManifests;
         // Cycle detection.
         // This must work for URIs and files so converting to Path is not an 
option.
         // If via a symbolic links, then real link, this catches one step 
later because we didn't normalize.
@@ -73,23 +80,12 @@ public class ManifestProcessor {
         // One test seems to be treated differently. test runs, but name does 
not show up.
         List<DynamicTest> tests = buildTests(manifest, namePrefix, 
entryToTest);
 
-
         List<DynamicNode> children = new ArrayList<>();
         children.addAll(subManifests);
-
-        // Add tests
-        if ( tests.size() == 1 ) {
-            // Otherwise JUnit5 only shows the container name. (this is maybe 
an Eclipse thing)
-            DynamicTest test = tests.get(0);
-            DynamicContainer here = 
DynamicContainer.dynamicContainer(test.getDisplayName(), tests);
-            children.add(here);
-        } else {
-            children.addAll(tests);
-        }
-
+        children.addAll(tests);
         String containerName = manifest.getName();
-        //containerName = "{"+x+"} "+containerName;
-        //System.out.println("Container of children="+children.size());
+        if ( containerName == null || containerName.isBlank() )
+            containerName = "Manifest [C"+counterManifests+"] "+filenameOrURI;
 
         try {
             return DynamicContainer.dynamicContainer(containerName, children);
@@ -166,7 +162,6 @@ public class ManifestProcessor {
             // Eclipse used to parse test names and () were special.
     //        string = string.replace('(', '[');
     //        string = string.replace(')', ']');
-            return string;
-        }
-
+        return string;
+    }
 }
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 09c442951b..bbfdca44b8 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
@@ -72,17 +72,32 @@ public class RiotSyntaxTest extends AbstractManifestTest{
         try {
             parser.accept(stream);
             if (! expectLegalSyntax ) {
+                String reason = "Parsing succeeded in a bad syntax test";
+                outputFailure(reason, fn, null);
                 String s = IO.readWholeFileAsUTF8(fn);
-                System.err.println();
-                System.err.println("== "+filename);
-                System.err.print(s);
-                fail("Parsing succeeded in a bad syntax test");
+                System.out.println();
+                System.out.println("== "+filename);
+                System.out.println(s);
+                fail(reason);
             }
         } catch(RiotNotFoundException ex) {
             throw ex;
         } catch(RiotException ex) {
-            if ( expectLegalSyntax )
-                fail("Parse error: "+ex.getMessage());
+            if ( expectLegalSyntax ) {
+                String reason = "Parsing failed in a good syntax test";
+                outputFailure(reason, fn, ex);
+                fail(reason+" : "+ex.getMessage());
+            }
         }
     }
+
+    private void outputFailure(String reason, String fn, Throwable th) {
+        String s = IO.readWholeFileAsUTF8(fn);
+        System.err.println();
+        System.err.println("== "+filename+ " -- "+reason);
+        System.err.print(s);
+        if ( !s.endsWith("\n") )
+            System.err.println();
+        fail("Parsing succeeded in a bad syntax test");
+    }
 }
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/sparql/tests/QueryEvalTest.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/sparql/tests/QueryEvalTest.java
index 3ca205ebc3..c51e2bc72e 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/sparql/tests/QueryEvalTest.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/sparql/tests/QueryEvalTest.java
@@ -92,16 +92,17 @@ public class QueryEvalTest extends AbstractManifestTest {
         try {
             try {
                 query = SparqlTestLib.queryFromEntry(manifestEntry);
-            } catch (QueryException qEx) {
-                qEx.printStackTrace(System.err);
-                setupFailure("Parse failure: " + qEx.getMessage());
+            } catch (QueryParseException qEx) {
+                System.err.println("Parse failure in eval test: " + 
qEx.getMessage());
+                //setupFailure("Parse failure: " + qEx.getMessage());
+                fail("Parse failure: " + qEx.getMessage());
+                // Keep Java quiet!
                 throw qEx;
             }
 
             Dataset dataset = setUpDataset(query, testItem);
             if ( dataset == null && !doesQueryHaveDataset(query) )
                 setupFailure("No dataset for query");
-
             if ( dataset != null )
                 Txn.executeRead(dataset, ()->execute(dataset,query));
             else
@@ -133,8 +134,6 @@ public class QueryEvalTest extends AbstractManifestTest {
 
     protected Dataset setUpDataset(Query query, QueryTestItem testItem) {
         try {
-            // testItem.requiresTextIndex()
-
             if ( doesQueryHaveDataset(query) && 
doesTestItemHaveDataset(testItem) ) {
                 // Only warn if there are results to test
                 // Syntax tests may have FROM etc and a manifest data file.
@@ -152,9 +151,10 @@ public class QueryEvalTest extends AbstractManifestTest {
 
             // Left to query
             return null;
-
         } catch (JenaException jEx) {
-            setupFailure("JenaException creating data source: " + 
jEx.getMessage());
+            // Parser logger will have printed an error
+            //setupFailure("JenaException creating data source: " + 
jEx.getMessage());
+            fail("Parse failure on data: " + jEx.getMessage());
             return null;
         }
     }
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/sparql/tests/QuerySyntaxTest.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/sparql/tests/QuerySyntaxTest.java
index 47716a6ee0..88078aea3d 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/sparql/tests/QuerySyntaxTest.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/sparql/tests/QuerySyntaxTest.java
@@ -45,15 +45,19 @@ public class QuerySyntaxTest extends AbstractManifestTest {
     public void runTest() {
         try {
             Query query = SparqlTestLib.queryFromEntry(manifestEntry, 
testSyntax);
-            if ( !expectLegalSyntax )
+            if ( !expectLegalSyntax ) {
+                String filename = SparqlTestLib.queryFile(manifestEntry);
+                System.out.printf("==== %s\n", "Negative Syntax test");
+                LibTest.printFile(filename);
                 fail("Expected parse failure");
+            }
         } catch (QueryException qEx) {
             if ( expectLegalSyntax ) {
                 String filename = SparqlTestLib.queryFile(manifestEntry);
+                System.out.printf("==== %s\n", "Positive Syntax test");
                 LibTest.printFile(filename);
                 throw qEx;
             }
-            // Expected a failure.
         } catch (Exception ex) {
             ex.printStackTrace();
             fail("Exception: " + ex.getClass().getName() + ": " + 
ex.getMessage());
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ExecutionStats.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ExecutionStats.java
new file mode 100644
index 0000000000..3165d9e6fd
--- /dev/null
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ExecutionStats.java
@@ -0,0 +1,71 @@
+/*
+ * 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.jena.arq.junit.textrunner;
+
+import org.junit.platform.engine.TestExecutionResult;
+import org.junit.platform.launcher.TestExecutionListener;
+import org.junit.platform.launcher.TestIdentifier;
+
+class ExecutionStats implements TestExecutionListener {
+
+    // Skips outer containers:
+    private int skip = 3;
+    private int depth = 0 ;
+
+    private int testCount = 0 ;
+    private int containerCount = 0 ;
+
+    private int errors = 0 ;
+    private int successful = 0 ;
+
+    public ExecutionStats() { }
+
+    @Override
+    public void executionStarted(TestIdentifier testIdentifier) {
+        // Not in walk order
+        if ( testIdentifier.isContainer() ) {
+            depth++;
+            if ( depth > skip )
+                containerCount++;
+        } else {
+            testCount++;
+        }
+    }
+
+    @Override
+    public void executionFinished(TestIdentifier testIdentifier, 
TestExecutionResult result) {
+        if ( testIdentifier.isContainer() ) {
+            depth--;
+        } else {
+            // Summary
+            switch(result.getStatus()) {
+                case ABORTED->{}
+                case FAILED ->  errors++;
+                case SUCCESSFUL -> successful++;
+            }
+        }
+    }
+
+    //@formatter:off
+    public int getContainerCount()  { return containerCount; }
+    public int getTestCount()       { return testCount; }
+    public int getTestPasses()      { return successful; }
+    public int getTestFailures()    { return errors; }
+    //@formatter:on
+}
\ No newline at end of file
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ManifestConfiguration.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ManifestConfiguration.java
new file mode 100644
index 0000000000..6f5a3ec53c
--- /dev/null
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ManifestConfiguration.java
@@ -0,0 +1,51 @@
+/*
+ * 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.jena.arq.junit.textrunner;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Configuration for one run of TextTestRunner.
+ */
+public class ManifestConfiguration implements 
Iterable<ManifestConfiguration.Entry> {
+    public record Entry(String manifestFile, String prefix) {}
+
+    private List<Entry> manifests = new ArrayList<>();
+
+    static ManifestConfiguration singleton = new ManifestConfiguration();
+
+    public static ManifestConfiguration get() {
+            return singleton;
+    }
+
+    public void add(String manifestFile) {
+        add(manifestFile, null);
+    }
+
+    public void add(String manifestFile, String prefix) {
+        manifests.add(new Entry(manifestFile, prefix));
+    }
+
+    @Override
+    public Iterator<Entry> iterator() {
+        return manifests.iterator();
+    }
+}
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ManifestHolder.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ManifestHolder.java
index 7fa66f8001..47e8f21c5f 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ManifestHolder.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/ManifestHolder.java
@@ -23,51 +23,46 @@ import java.util.stream.Stream;
 import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.DynamicNode;
 import org.junit.jupiter.api.TestFactory;
-import org.junit.platform.launcher.LauncherDiscoveryListener;
-import org.junit.platform.launcher.LauncherDiscoveryRequest;
 
 import org.apache.jena.arq.junit.Scripts;
+import org.apache.jena.arq.junit.manifest.ManifestProcessor;
+import org.apache.jena.atlas.lib.FileOps;
+import org.apache.jena.atlas.lib.StreamOps;
+import org.apache.jena.riot.RiotNotFoundException;
 import org.apache.jena.shared.JenaException;
 
-// This class DOES NOT run on its own. It is used by TextTestRunner.
-
+//This class DOES NOT run on its own.
+// It is used by TextTestRunner and gets configuration from 
ManifestConfiguration
 class ManifestHolder {
 
-    static class INIT implements LauncherDiscoveryListener {
-
-        @Override public void 
launcherDiscoveryStarted(LauncherDiscoveryRequest request) {
-            String fn = 
request.getConfigurationParameters().get(MANIFEST).get();
-            if ( fn == null ) {
-                System.err.println("Manifest not set");
-                throw new JenaException("Manifest not set");
-            }
-            manifest = fn;
-        }
-    }
-
-    public static String MANIFEST = "org.apache.jena.manifest";
-    public static String namePrefix = null;
-    public static String manifest = null;
-
-    public ManifestHolder() {}
+    public ManifestHolder() { }
 
     @TestFactory
     @DisplayName("TextTestRunner")
     public Stream<DynamicNode> testFactory() {
-        //String fn = System.getProperty(MANIFEST);
+        Stream<DynamicNode> tests = null;
+        for ( var entry : ManifestConfiguration.get() ) {
+            Stream<DynamicNode> tests1 = oneManifest(entry.manifestFile(), 
entry.prefix());
+            tests = StreamOps.concat(tests, tests1);
+        }
+        return tests;
+    }
 
-        String fn = manifest;
+    private int totalManifestCount = 0 ;
 
+    private Stream<DynamicNode> oneManifest(String fn, String prefix) {
         if ( fn == null ) {
             System.err.println("Manifest not set");
             throw new JenaException("Manifest not set");
         }
-
-//            DynamicNode dn = DynamicTest.dynamicTest("Hello!", 
()->System.err.println("ManifestHolder: Executable"));
-//            return Stream.of(dn);
-
+        if ( ! FileOps.exists(fn) ) {
+            throw new RiotNotFoundException("Manifest "+fn);
+        }
         try {
-            var x = Scripts.manifestTestFactory(fn, namePrefix);
+            int before = ManifestProcessor.getCounterManifests();
+            Stream<DynamicNode> x = Scripts.manifestTestFactory(fn, prefix);
+            int after = ManifestProcessor.getCounterManifests();
+            totalManifestCount = after-before;
             return x;
         } catch (Exception ex) {
             ex.printStackTrace();
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/PrintExecutionListener.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/PrintExecutionListener.java
index d99f4237b3..2b9d0df669 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/PrintExecutionListener.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/PrintExecutionListener.java
@@ -27,67 +27,68 @@ import org.apache.jena.atlas.io.IndentedWriter;
 
 class PrintExecutionListener implements TestExecutionListener {
 
-        // Skips outer containers:
-        private int skip = 3;
-        private int depth = 0 ;
+    // Skips outer containers:
+    private int skip = 3;
+    private int depth = 0 ;
 
-        private int testCount = 0 ;
-        private int containerCount = 0 ;
+    // Duplicates ExecutionStats but not exposes and we need the test count 
anyway.
+    private int testCount = 0 ;
+    private int containerCount = 0 ;
+    private int errors = 0 ;
+    private int successful = 0 ;
+    private final IndentedWriter out;
 
-        private int errors = 0 ;
-        private int successful = 0 ;
-        private final IndentedWriter out;
+    public PrintExecutionListener(IndentedWriter out) {
+        this.out = out;
+    }
 
-        public PrintExecutionListener(IndentedWriter out) {
-            this.out = out;
-        }
+    @Override
+    public void testPlanExecutionStarted(TestPlan testPlan) {
+        out.flush();
+    }
 
-        @Override
-        public void testPlanExecutionStarted(TestPlan testPlan) {
-            out.flush();
-        }
+    @Override
+    public void testPlanExecutionFinished(TestPlan testPlan) {
+        // Another way to print the summary but printed even
+        // for an EARL report so rdftests --earl > earl.ttl does not work.
+        //        out.println();
+//        out.println("Containers: "+containerCount);
+//        out.println("Successes:  "+successful);
+//        out.println("Errors:     "+errors);
+        out.flush();
+    }
 
-        @Override
-        public void testPlanExecutionFinished(TestPlan testPlan) {
-//            out.println();
-//            out.println("Containers: "+containerCount);
-//            out.println("Successes:  "+successful);
-//            out.println("Errors:     "+errors);
-            out.flush();
-        }
+    @Override
+    public void executionStarted(TestIdentifier testIdentifier) {
+        // Container vs Test?
+        // Not in walk order
 
-        @Override
-        public void executionStarted(TestIdentifier testIdentifier) {
-            // Container vs Test?
-            // Not in walk order
-
-            if ( testIdentifier.isContainer() ) {
-                depth++;
-                if ( depth > skip ) {
-                    containerCount++;
-                    out.println(testIdentifier.getDisplayName());
-                    out.incIndent();
-                }
-            } else {
-                testCount++;
+        if ( testIdentifier.isContainer() ) {
+            depth++;
+            if ( depth > skip ) {
+                containerCount++;
+                out.println(testIdentifier.getDisplayName());
+                out.incIndent();
             }
+        } else {
+            testCount++;
         }
+    }
 
-        @Override
-        public void executionFinished(TestIdentifier testIdentifier, 
TestExecutionResult result) {
-
-            if ( testIdentifier.isContainer() ) {
-                if ( depth > skip )
-                    out.decIndent();
-                depth--;
-            } else {
-                out.printf("%d [%s] %s\n", testCount, 
result.getStatus().name().substring(0, 1), testIdentifier.getDisplayName());
-                // Or summary
-                switch(result.getStatus()) {
-                    case ABORTED->{}
-                    case FAILED ->  errors++;
-                    case SUCCESSFUL -> successful++;
-                }
+    @Override
+    public void executionFinished(TestIdentifier testIdentifier, 
TestExecutionResult result) {
+        if ( testIdentifier.isContainer() ) {
+            if ( depth > skip )
+                out.decIndent();
+            depth--;
+        } else {
+            out.printf("%d [%s] %s\n", testCount, 
result.getStatus().name().substring(0, 1), testIdentifier.getDisplayName());
+            // Summary
+            switch(result.getStatus()) {
+                case ABORTED->{}
+                case FAILED ->  errors++;
+                case SUCCESSFUL -> successful++;
             }
         }
-    }
\ No newline at end of file
+    }
+}
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/TextTestRunner5.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/TextTestRunner.java
similarity index 57%
rename from 
jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/TextTestRunner5.java
rename to 
jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/TextTestRunner.java
index e6d109991c..a84b7f4b23 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/TextTestRunner5.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/textrunner/TextTestRunner.java
@@ -18,38 +18,49 @@
 
 package org.apache.jena.arq.junit.textrunner;
 
+import java.util.List;
 import java.util.function.Function;
 
 import org.junit.platform.engine.discovery.DiscoverySelectors;
-import org.junit.platform.launcher.*;
+import org.junit.platform.launcher.Launcher;
+import org.junit.platform.launcher.LauncherDiscoveryRequest;
+import org.junit.platform.launcher.TestPlan;
 import org.junit.platform.launcher.core.LauncherDiscoveryRequestBuilder;
 import org.junit.platform.launcher.core.LauncherFactory;
 import org.junit.platform.launcher.listeners.LoggingListener;
 import org.junit.platform.launcher.listeners.SummaryGeneratingListener;
+import org.junit.platform.launcher.listeners.TestExecutionSummary;
 
 import org.apache.jena.arq.junit.EarlReport;
 import org.apache.jena.arq.junit.manifest.EarlReporter;
 import org.apache.jena.arq.junit.manifest.ManifestEntry;
 import org.apache.jena.atlas.io.IndentedWriter;
 
-public class TextTestRunner5 {
+public class TextTestRunner {
 
-    public static void runOne(String manifestFile, Function<ManifestEntry, 
Runnable> testMaker) {
-        runInternal(null, manifestFile);
+    public static void run(List<String> manifestFiles, Function<ManifestEntry, 
Runnable> testMaker) {
+        runInternal(null, manifestFiles);
     }
 
-    public static void runOne(EarlReport report, String manifestFile, 
Function<ManifestEntry, Runnable> testMaker) {
-        runInternal(report, manifestFile);
+    public static void run(EarlReport report, List<String> manifestFiles, 
Function<ManifestEntry, Runnable> testMaker) {
+        runInternal(report, manifestFiles);
     }
 
-    static void runInternal(EarlReport earlReport, String filename) {
-        try ( IndentedWriter out = IndentedWriter.stdout.clone(); ) {
-            runInternal0(out, earlReport, filename);
+    static void runInternal(EarlReport earlReport, List<String> filenames) {
+        try ( IndentedWriter out = 
IndentedWriter.stdout.clone().setFlushOnNewline(true) ; ) {
+            // Statics used for configuration so multiple calls would
+            // interfere for both input configuration and output printing.
+            synchronized(TextTestRunner.class) {
+                runInternal0(out, earlReport, filenames);
+            }
         }
     }
 
     // Either an EARL report xor text output.
-    static void runInternal0(IndentedWriter out, EarlReport earlReport, String 
filename) {
+    static void runInternal0(IndentedWriter out, EarlReport earlReport, 
List<String> filenames) {
+        if ( filenames.isEmpty() )
+            throw new IllegalArgumentException("No manifests");
+
         boolean produceEarlReport = earlReport!=null ;
         if ( produceEarlReport ) {
             EarlReporter.setEarlReport(earlReport);
@@ -61,43 +72,40 @@ public class TextTestRunner5 {
         });
 
 
-        TestExecutionListener testExecListener = new 
PrintExecutionListener(out);
-
-//        // Unsubtle
-//        System.setProperty(ManifestHolder.MANIFEST, filename);
+        ManifestConfiguration config = ManifestConfiguration.get();
+        filenames.forEach(config::add);
 
-        // Best way?
-        LauncherDiscoveryListener injectManifest = new ManifestHolder.INIT();
         LauncherDiscoveryRequest request = 
LauncherDiscoveryRequestBuilder.request()
                 
.selectors(DiscoverySelectors.selectClass(ManifestHolder.class))
-                .configurationParameter(ManifestHolder.MANIFEST, filename)
-                .listeners(injectManifest)
                 .build();
 
         Launcher launcher = LauncherFactory.create();
-
         TestPlan testPlan = launcher.discover(request);
-        //System.err.println("X: 
"+testPlan.getConfigurationParameters().get(ManifestHolder.MANIFEST));
 
+        ExecutionStats executionStats = new ExecutionStats();
+        PrintExecutionListener printExecListener = new 
PrintExecutionListener(out);
 
-        if ( ! produceEarlReport ) {
-            launcher.registerTestExecutionListeners(testExecListener, 
summaryListener);
-        } else {
+        if ( produceEarlReport ) {
             // Build report, no output.
-            //launcher.registerTestExecutionListeners();
+            launcher.registerTestExecutionListeners(executionStats);
+        } else {
+            launcher.registerTestExecutionListeners(executionStats, 
printExecListener, summaryListener);
         }
 
+        // Run, which calls the TestFactory which generates the tests from the 
manifest.
         launcher.execute(request);
 
-        // ----
+        // For skips tests.
+        TestExecutionSummary summary = summaryListener.getSummary();
 
-        var summary = summaryListener.getSummary();
         if ( summary != null ) {
             //summary.printTo(new PrintWriter(System.out));
             out.println();
-            out.println("Manifests:  "+summary.getContainersFoundCount());
-            out.println("Tests pass: "+summary.getTestsSucceededCount());
-            out.println("Tests fail: "+summary.getTestsFailedCount());
+//            out.println("Containers: "+executionStats.getContainerCount());
+//            out.println("Manifests:  "+manifestCount);
+            out.println("Manifests: "+executionStats.getContainerCount());
+            out.println("Tests pass: "+executionStats.getTestPasses());
+            out.println("Tests fail: "+executionStats.getTestFailures());
             if ( summary.getTestsSkippedCount() > 0 )
                 out.println("Tests skip: "+summary.getTestsSkippedCount());
         }
diff --git a/jena-arq/testing/DAWG/Syntax/manifest.n3 
b/jena-arq/testing/DAWG/Syntax/manifest.n3
index 95fb3caa90..dff9ea4bbe 100644
--- a/jena-arq/testing/DAWG/Syntax/manifest.n3
+++ b/jena-arq/testing/DAWG/Syntax/manifest.n3
@@ -19,7 +19,7 @@
 @prefix qt:     <http://www.w3.org/2001/sw/DataAccess/tests/test-query#> .
 
 <>  rdf:type mf:Manifest ;
-    rdfs:comment "Some SPARQL test of synta" ;
+    rdfs:comment "Some SPARQL test of syntax" ;
     mf:entries
     (
      [  mf:name    "syntax-001" ;
diff --git a/jena-cmds/src/test/java/arq/rdftests.java 
b/jena-cmds/src/test/java/arq/rdftests.java
index 487444d9af..357395d472 100644
--- a/jena-cmds/src/test/java/arq/rdftests.java
+++ b/jena-cmds/src/test/java/arq/rdftests.java
@@ -33,7 +33,7 @@ import org.apache.jena.arq.junit.riot.RiotTests;
 import org.apache.jena.arq.junit.riot.VocabLangRDF;
 import org.apache.jena.arq.junit.sparql.SparqlTests;
 import org.apache.jena.arq.junit.sparql.tests.QueryEvalTest;
-import org.apache.jena.arq.junit.textrunner.TextTestRunner5;
+import org.apache.jena.arq.junit.textrunner.TextTestRunner;
 import org.apache.jena.atlas.legacy.BaseTest2;
 import org.apache.jena.atlas.lib.Lib;
 import org.apache.jena.atlas.logging.LogCtl;
@@ -166,13 +166,9 @@ public class rdftests extends CmdGeneral
         else
             SparqlTests.defaultForSyntaxTests = Syntax.syntaxSPARQL_12;
 
-        for ( String fn : getPositional() ) {
-            if ( createEarlReport )
-                System.out.println("# Run: "+fn);
-            else
-                System.out.println("# Run: "+fn);
-            exec1(report, fn);
-        }
+        List<String> manifests = getPositional();
+        System.out.println("# Run: "+manifests);
+        exec(report, manifests);
 
         if ( createEarlReport ) {
             earlOut.println();
@@ -194,19 +190,19 @@ public class rdftests extends CmdGeneral
         }
     }
 
-    protected void exec1(EarlReport report, String manifest) {
+    protected void exec(EarlReport report, List<String> manifests) {
         if ( createEarlReport )
-            oneManifestEarl(report, manifest);
+            oneManifestEarl(report, manifests);
         else
-            oneManifest(manifest);
+            oneManifest(manifests);
     }
 
-    static void oneManifest(String testManifest) {
-        TextTestRunner5.runOne(testManifest, Scripts.testMaker());
+    static void oneManifest(List<String> manifests) {
+        TextTestRunner.run(manifests, Scripts.testMaker());
     }
 
-    static void oneManifestEarl(EarlReport earlReport, String testManifest) {
-        TextTestRunner5.runOne(earlReport, testManifest, Scripts.testMaker());
+    static void oneManifestEarl(EarlReport earlReport, List<String> manifests) 
{
+        TextTestRunner.run(earlReport, manifests, Scripts.testMaker());
     }
 
     // Test subsystems.

Reply via email to