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 502858302e GH-3178: Refactor Runner code for test manifests
502858302e is described below

commit 502858302ea527d7950c79bc68aa0cf2b44a40a0
Author: Andy Seaborne <[email protected]>
AuthorDate: Wed May 7 10:35:25 2025 +0100

    GH-3178: Refactor Runner code for test manifests
---
 .../org/apache/jena/arq/junit/TextTestRunner.java  |  11 +-
 .../arq/junit/runners/AbstractRunnerOfTests.java   | 154 ++++-----------------
 ...tractRunnerOfTests.java => SetupManifests.java} | 147 ++++++--------------
 .../java/org/apache/jena/sparql/Scripts_ARQ.java   |   1 -
 4 files changed, 78 insertions(+), 235 deletions(-)

diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/TextTestRunner.java 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/TextTestRunner.java
index 6cb5f29c86..1780059f69 100644
--- a/jena-arq/src/test/java/org/apache/jena/arq/junit/TextTestRunner.java
+++ b/jena-arq/src/test/java/org/apache/jena/arq/junit/TextTestRunner.java
@@ -20,16 +20,17 @@ package org.apache.jena.arq.junit;
 
 import java.util.function.Function;
 
+import org.junit.runner.JUnitCore;
+import org.junit.runner.Result;
+import org.junit.runner.Runner;
+
 import org.apache.jena.arq.junit.manifest.Manifest;
 import org.apache.jena.arq.junit.manifest.ManifestEntry;
-import org.apache.jena.arq.junit.runners.AbstractRunnerOfTests;
-import org.apache.jena.arq.junit.runners.RunnerOneManifest;
+import org.apache.jena.arq.junit.runners.SetupManifests;
 import org.apache.jena.atlas.junit.TextListenerLong;
 import org.apache.jena.sparql.expr.E_Function;
 import org.apache.jena.sparql.expr.NodeValue;
 import org.apache.jena.sparql.junit.EarlReport;
-import org.junit.runner.JUnitCore;
-import org.junit.runner.Result;
 
 public class TextTestRunner {
 
@@ -39,7 +40,7 @@ public class TextTestRunner {
 
     public static void runOne(EarlReport report, String manifestFile, 
Function<ManifestEntry, Runnable> testMaker) {
         Manifest manifest = Manifest.parse(manifestFile);
-        RunnerOneManifest top = AbstractRunnerOfTests.build(report, manifest, 
testMaker, null);
+        Runner top = SetupManifests.build(report, manifest, testMaker, null);
 
         NodeValue.VerboseWarnings = false ;
         E_Function.WarnOnUnknownFunction = false ;
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/runners/AbstractRunnerOfTests.java
 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/runners/AbstractRunnerOfTests.java
index df87ef8e1f..0ceeeffb30 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/runners/AbstractRunnerOfTests.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/runners/AbstractRunnerOfTests.java
@@ -19,15 +19,11 @@
 package org.apache.jena.arq.junit.runners;
 
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import java.util.function.Function;
 
 import org.apache.jena.arq.junit.manifest.*;
-import org.apache.jena.atlas.io.IndentedWriter;
-import org.apache.jena.rdf.model.Statement;
-import org.apache.jena.sparql.junit.EarlReport;
-import org.apache.jena.sparql.vocabulary.VocabTestQuery;
+
 import org.junit.runner.Description;
 import org.junit.runner.Runner;
 import org.junit.runner.notification.RunNotifier;
@@ -47,7 +43,7 @@ import org.junit.runners.model.InitializationError;
  * This class sorts out the annotations, including providing before/after 
class, then
  * creates a hierarchy of tests to run.
  *
- * @see RunnerOneTest
+ * @see SetupManifests
  */
 public abstract class AbstractRunnerOfTests extends ParentRunner<Runner> {
     private Description  description;
@@ -57,138 +53,48 @@ public abstract class AbstractRunnerOfTests extends 
ParentRunner<Runner> {
 
     public AbstractRunnerOfTests(Class<? > klass, Function<ManifestEntry, 
Runnable> maker) throws InitializationError {
         super(klass);
-        String label = getLabel(klass);
+        String label = SetupManifests.getLabel(klass);
         if ( label == null )
             label = klass.getName();
-        String prefix = getPrefix(klass);
-        String[] manifests = getManifests(klass);
-        if ( manifests.length == 0 )
+
+        // Get the annotation arguments.
+        String prefix = SetupManifests.getPrefix(klass);
+        description = Description.createSuiteDescription(label);
+        prepare(klass, maker,prefix);
+    }
+
+    private void prepare(Class<? > klass, Function<ManifestEntry, Runnable> 
maker, String prefix) throws InitializationError {
+        List<String> manifests = SetupManifests.getManifests(klass);
+        if ( manifests.isEmpty() )
             //System.err.println("No manifests: "+label);
             throw new InitializationError("No manifests");
-        description = Description.createSuiteDescription(label);
+        prepare(manifests, klass.getSimpleName(), maker, prefix);
+    }
 
+    private void prepare(List<String> manifests, String traceName, 
Function<ManifestEntry, Runnable> maker, String prefix) throws 
InitializationError {
+        // For each manifest
         for ( String manifestFile : manifests ) {
             //System.out.println("** "+klass.getSimpleName()+" -- 
"+manifestFile);
-            if ( PrintManifests ) {
-                out.println("** "+klass.getSimpleName()+" -- "+manifestFile);
-                out.incIndent();
+            if ( SetupManifests.PrintManifests ) {
+                if ( traceName != null )
+                    SetupManifests.out.println("** "+traceName+" -- 
"+manifestFile);
+                else
+                    SetupManifests.out.println("** Manifest: "+manifestFile);
+                SetupManifests.out.incIndent();
             }
             Manifest manifest = Manifest.parse(manifestFile);
-            if ( PrintManifests ) {
+            if ( SetupManifests.PrintManifests ) {
                 // Record manifests.
-                Manifest.walk(manifest, m->out.println(m.getFileName()+" :: 
"+m.getName()), e->{});
+                Manifest.walk(manifest, 
m->SetupManifests.out.println(m.getFileName()+" :: "+m.getName()), e->{});
             }
-            Runner runner = build(null, manifest, maker, prefix);
+            Runner runner = SetupManifests.build(null, manifest, maker, 
prefix);
             description.addChild(runner.getDescription());
             children.add(runner);
-            if ( PrintManifests )
-                out.decIndent();
-        }
-        if ( PrintManifests )
-            out.flush();
-    }
-
-    // Print all manifests, top level and included.
-    private static boolean PrintManifests = false;
-    private static IndentedWriter out = IndentedWriter.stdout;
-
-    /**
-     * Do one level of tests. test are {@link Runnable Runnables} that each 
succeed or fail with an exception.
-     */
-    public static RunnerOneManifest build(EarlReport report, Manifest 
manifest, Function<ManifestEntry, Runnable> maker, String prefix) {
-        Description description = 
Description.createSuiteDescription(manifest.getName());
-        if ( PrintManifests )
-            out.println(manifest.getFileName()+" :: "+manifest.getName());
-        RunnerOneManifest thisLevel = new RunnerOneManifest(manifest, 
description);
-
-        Iterator<String> sub = manifest.includedManifests();
-        while(sub.hasNext() ) {
-            if ( PrintManifests )
-                out.incIndent();
-
-            String mf = sub.next();
-            Manifest manifestSub = Manifest.parse(mf);
-            Runner runner = build(report, manifestSub, maker, prefix);
-            thisLevel.add(runner);
-            if ( PrintManifests )
-                out.decIndent();
-        }
-
-        // Check entries do have test targets.
-
-        manifest.entries().forEach(entry->{
-            if ( entry.getAction() == null )
-                throw new RuntimeException("Missing: action 
["+entry.getEntry()+"]");
-            if ( entry.getName() == null )
-                throw new RuntimeException("Missing: label 
["+entry.getEntry()+"]");
-        });
-
-        prepareTests(report, thisLevel, manifest, maker, prefix);
-        return thisLevel;
-    }
-
-    private static String prepareTestLabel(ManifestEntry entry, String prefix) 
{
-        String label = fixupName(entry.getName());
-        if ( prefix != null )
-            label = prefix+label;
-
-        // action URI or action -> qt:query
-        String str = null;
-
-        if ( entry.getAction() != null ) {
-            if ( entry.getAction().isURIResource() )
-                str = entry.getAction().getURI();
-            else if ( entry.getAction().isAnon() ) {
-                Statement stmt = 
entry.getAction().getProperty(VocabTestQuery.query);
-                if ( stmt != null && stmt.getObject().isURIResource() )
-                    str = stmt.getObject().asResource().getURI();
-            }
-        }
-
-        if ( str != null ) {
-            int x = str.lastIndexOf('/');
-            if ( x > 0 && x < str.length() ) {
-                String fn = str.substring(x+1) ;
-                label = label+" ("+fn+")";
-            }
-        }
-        return label;
-    }
-
-    public static void prepareTests(EarlReport report, RunnerOneManifest 
level, Manifest manifest, Function<ManifestEntry, Runnable> maker, String 
prefix) {
-        manifest.entries().forEach(entry->{
-            String label = prepareTestLabel(entry, prefix);
-            Runnable runnable = maker.apply(entry);
-            if ( runnable != null ) {
-                Runner r = new RunnerOneTest(label, runnable, entry.getURI(), 
report);
-                level.add(r);
-            }
-        });
-    }
-
-    public static String fixupName(String string) {
-        // Eclipse used to parse test names and () were special. 
-//        string = string.replace('(', '[');
-//        string = string.replace(')', ']');
-        return string;
-    }
-
-    private static String getLabel(Class<? > klass) {
-        Label annotation = klass.getAnnotation(Label.class);
-        return ( annotation == null ) ? null : annotation.value();
-    }
-
-    private static String getPrefix(Class<? > klass) {
-        Prefix annotation = klass.getAnnotation(Prefix.class);
-        return ( annotation == null ) ? null : annotation.value();
-    }
-
-    private static String[] getManifests(Class<? > klass) throws 
InitializationError {
-        Manifests annotation = klass.getAnnotation(Manifests.class);
-        if ( annotation == null ) {
-            throw new InitializationError(String.format("class '%s' must have 
a @Manifests annotation", klass.getName()));
+            if ( SetupManifests.PrintManifests )
+                SetupManifests.out.decIndent();
         }
-        return annotation.value();
+        if ( SetupManifests.PrintManifests )
+            SetupManifests.out.flush();
     }
 
     @Override
diff --git 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/runners/AbstractRunnerOfTests.java
 b/jena-arq/src/test/java/org/apache/jena/arq/junit/runners/SetupManifests.java
similarity index 56%
copy from 
jena-arq/src/test/java/org/apache/jena/arq/junit/runners/AbstractRunnerOfTests.java
copy to 
jena-arq/src/test/java/org/apache/jena/arq/junit/runners/SetupManifests.java
index df87ef8e1f..f09127fa93 100644
--- 
a/jena-arq/src/test/java/org/apache/jena/arq/junit/runners/AbstractRunnerOfTests.java
+++ 
b/jena-arq/src/test/java/org/apache/jena/arq/junit/runners/SetupManifests.java
@@ -18,84 +18,41 @@
 
 package org.apache.jena.arq.junit.runners;
 
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.function.Function;
 
-import org.apache.jena.arq.junit.manifest.*;
+import org.junit.runner.Description;
+import org.junit.runner.Runner;
+import org.junit.runners.model.InitializationError;
+
+import org.apache.jena.arq.junit.manifest.Manifest;
+import org.apache.jena.arq.junit.manifest.ManifestEntry;
+import org.apache.jena.arq.junit.manifest.Manifests;
+import org.apache.jena.arq.junit.manifest.Prefix;
 import org.apache.jena.atlas.io.IndentedWriter;
 import org.apache.jena.rdf.model.Statement;
 import org.apache.jena.sparql.junit.EarlReport;
 import org.apache.jena.sparql.vocabulary.VocabTestQuery;
-import org.junit.runner.Description;
-import org.junit.runner.Runner;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.ParentRunner;
-import org.junit.runners.model.InitializationError;
 
-/**
- * Common super class for {@code @Runner(....)}.
- * <p>
- * Creates a runner for a manifest that has children for each included 
manifest and
- * each test defined in the manifest. It follow included manifests Annotations
- * supported:
- * <ul>
- * <li>{@code @Label("Some name")}</li>
- * <li>{@code @Manifests({"manifest1","manifest2",...})}</li>
- * </ul>
- * This class sorts out the annotations, including providing before/after 
class, then
- * creates a hierarchy of tests to run.
- *
- * @see RunnerOneTest
- */
-public abstract class AbstractRunnerOfTests extends ParentRunner<Runner> {
-    private Description  description;
-    private List<Runner> children = new ArrayList<>();
-
-    // Need unique names.
-
-    public AbstractRunnerOfTests(Class<? > klass, Function<ManifestEntry, 
Runnable> maker) throws InitializationError {
-        super(klass);
-        String label = getLabel(klass);
-        if ( label == null )
-            label = klass.getName();
-        String prefix = getPrefix(klass);
-        String[] manifests = getManifests(klass);
-        if ( manifests.length == 0 )
-            //System.err.println("No manifests: "+label);
-            throw new InitializationError("No manifests");
-        description = Description.createSuiteDescription(label);
-
-        for ( String manifestFile : manifests ) {
-            //System.out.println("** "+klass.getSimpleName()+" -- 
"+manifestFile);
-            if ( PrintManifests ) {
-                out.println("** "+klass.getSimpleName()+" -- "+manifestFile);
-                out.incIndent();
-            }
-            Manifest manifest = Manifest.parse(manifestFile);
-            if ( PrintManifests ) {
-                // Record manifests.
-                Manifest.walk(manifest, m->out.println(m.getFileName()+" :: 
"+m.getName()), e->{});
-            }
-            Runner runner = build(null, manifest, maker, prefix);
-            description.addChild(runner.getDescription());
-            children.add(runner);
-            if ( PrintManifests )
-                out.decIndent();
-        }
-        if ( PrintManifests )
-            out.flush();
-    }
+public class SetupManifests {
 
     // Print all manifests, top level and included.
-    private static boolean PrintManifests = false;
-    private static IndentedWriter out = IndentedWriter.stdout;
+    /*package*/ static boolean PrintManifests = false;
+    /*package*/ static IndentedWriter out = IndentedWriter.stdout;
 
     /**
      * Do one level of tests. test are {@link Runnable Runnables} that each 
succeed or fail with an exception.
      */
-    public static RunnerOneManifest build(EarlReport report, Manifest 
manifest, Function<ManifestEntry, Runnable> maker, String prefix) {
+    public static Runner build(EarlReport report, Manifest manifest, 
Function<ManifestEntry, Runnable> maker, String prefix) {
+        return buildForManifest(report, manifest, maker, prefix);
+    }
+
+    /**
+     * Do one level of tests, recurse into sub-levels.
+     * A test is a {@link Runnable} that succeeds or fails with an exception.
+     */
+    private static RunnerOneManifest buildForManifest(EarlReport report, 
Manifest manifest, Function<ManifestEntry, Runnable> maker, String prefix) {
         Description description = 
Description.createSuiteDescription(manifest.getName());
         if ( PrintManifests )
             out.println(manifest.getFileName()+" :: "+manifest.getName());
@@ -108,7 +65,7 @@ public abstract class AbstractRunnerOfTests extends 
ParentRunner<Runner> {
 
             String mf = sub.next();
             Manifest manifestSub = Manifest.parse(mf);
-            Runner runner = build(report, manifestSub, maker, prefix);
+            Runner runner = buildForManifest(report, manifestSub, maker, 
prefix);
             thisLevel.add(runner);
             if ( PrintManifests )
                 out.decIndent();
@@ -127,6 +84,17 @@ public abstract class AbstractRunnerOfTests extends 
ParentRunner<Runner> {
         return thisLevel;
     }
 
+    public static void prepareTests(EarlReport report, RunnerOneManifest 
level, Manifest manifest, Function<ManifestEntry, Runnable> maker, String 
prefix) {
+        manifest.entries().forEach(entry->{
+            String label = prepareTestLabel(entry, prefix);
+            Runnable runnable = maker.apply(entry);
+            if ( runnable != null ) {
+                Runner r = new RunnerOneTest(label, runnable, entry.getURI(), 
report);
+                level.add(r);
+            }
+        });
+    }
+
     private static String prepareTestLabel(ManifestEntry entry, String prefix) 
{
         String label = fixupName(entry.getName());
         if ( prefix != null )
@@ -155,59 +123,28 @@ public abstract class AbstractRunnerOfTests extends 
ParentRunner<Runner> {
         return label;
     }
 
-    public static void prepareTests(EarlReport report, RunnerOneManifest 
level, Manifest manifest, Function<ManifestEntry, Runnable> maker, String 
prefix) {
-        manifest.entries().forEach(entry->{
-            String label = prepareTestLabel(entry, prefix);
-            Runnable runnable = maker.apply(entry);
-            if ( runnable != null ) {
-                Runner r = new RunnerOneTest(label, runnable, entry.getURI(), 
report);
-                level.add(r);
-            }
-        });
-    }
-
-    public static String fixupName(String string) {
-        // Eclipse used to parse test names and () were special. 
-//        string = string.replace('(', '[');
-//        string = string.replace(')', ']');
-        return string;
-    }
+    private static String fixupName(String string) {
+            // Eclipse used to parse test names and () were special.
+    //        string = string.replace('(', '[');
+    //        string = string.replace(')', ']');
+            return string;
+        }
 
-    private static String getLabel(Class<? > klass) {
+    /*package*/ static String getLabel(Class<? > klass) {
         Label annotation = klass.getAnnotation(Label.class);
         return ( annotation == null ) ? null : annotation.value();
     }
 
-    private static String getPrefix(Class<? > klass) {
+    /*package*/ static String getPrefix(Class<? > klass) {
         Prefix annotation = klass.getAnnotation(Prefix.class);
         return ( annotation == null ) ? null : annotation.value();
     }
 
-    private static String[] getManifests(Class<? > klass) throws 
InitializationError {
+    /*package*/ static List<String> getManifests(Class<? > klass) throws 
InitializationError {
         Manifests annotation = klass.getAnnotation(Manifests.class);
         if ( annotation == null ) {
             throw new InitializationError(String.format("class '%s' must have 
a @Manifests annotation", klass.getName()));
         }
-        return annotation.value();
-    }
-
-    @Override
-    public Description getDescription() {
-        return description;
-    }
-
-    @Override
-    protected List<Runner> getChildren() {
-        return children;
-    }
-
-    @Override
-    protected Description describeChild(Runner child) {
-        return child.getDescription();
-    }
-
-    @Override
-    protected void runChild(Runner child, RunNotifier notifier) {
-        child.run(notifier);
+        return List.of(annotation.value());
     }
 }
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/Scripts_ARQ.java 
b/jena-arq/src/test/java/org/apache/jena/sparql/Scripts_ARQ.java
index c1ac640100..bda5d3a8a2 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/Scripts_ARQ.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/Scripts_ARQ.java
@@ -55,5 +55,4 @@ public class Scripts_ARQ
         NodeValue.VerboseWarnings = bVerboseWarnings;
         E_Function.WarnOnUnknownFunction = bWarnOnUnknownFunction;
     }
-
 }

Reply via email to