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