From 36ad41386f5892eb2de0fa78f9f6c4a050eccac4 Mon Sep 17 00:00:00 2001 From: Bert Frees Date: Tue, 1 Nov 2016 14:11:54 +0100 Subject: [PATCH] [xspec-maven-plugin] Make focus work across xspec files and also add public "hasFocus" method for determining in advance whether one or more tests have a focus attribute, which can be used for making focus work across XSpec *and* XProcSpec (see issue https://github.com/daisy/xprocspec/issues/37). Also make utility function "listXSpecFilesRecursively" public. --- .../org/daisy/maven/xspec/XSpecRunner.java | 53 +++++++++++++++++-- 1 file changed, 49 insertions(+), 4 deletions(-) diff --git a/utils/xspec-maven-plugin/xspec-runner/src/main/java/org/daisy/maven/xspec/XSpecRunner.java b/utils/xspec-maven-plugin/xspec-runner/src/main/java/org/daisy/maven/xspec/XSpecRunner.java index 261385ea14..0a5ba589ed 100644 --- a/utils/xspec-maven-plugin/xspec-runner/src/main/java/org/daisy/maven/xspec/XSpecRunner.java +++ b/utils/xspec-maven-plugin/xspec-runner/src/main/java/org/daisy/maven/xspec/XSpecRunner.java @@ -24,6 +24,7 @@ import java.net.URISyntaxException; import java.util.Collection; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; @@ -49,6 +50,7 @@ import net.sf.saxon.s9api.XsltCompiler; import net.sf.saxon.s9api.XsltExecutable; import net.sf.saxon.s9api.XsltTransformer; +import net.sf.saxon.trans.XPathException; import org.apache.xml.resolver.CatalogManager; import org.apache.xml.resolver.tools.CatalogResolver; @@ -57,7 +59,7 @@ import com.google.common.base.Function; import com.google.common.base.Stopwatch; import com.google.common.collect.Collections2; -import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; import com.google.common.io.Files; import com.google.common.io.InputSupplier; import com.google.common.io.Resources; @@ -87,13 +89,56 @@ public void setProcessor(Processor processor) { this.processor = processor; } + public boolean hasFocus(File testDir) { + return hasFocus(listXSpecFilesRecursively(testDir)); + } + + public boolean hasFocus(Collection tests) { + for (File test : tests) { + if (test.exists()) { + try { + XdmNode node = new XdmNode( + processor.getUnderlyingConfiguration().buildDocument(new StreamSource(test))); + if (((XdmAtomicValue)xpathCompiler.evaluateSingle("exists(//scenario[@focus])", node)).getBooleanValue()) + return true; + } catch (SaxonApiException e) { + } catch (XPathException e) { + } + } + } + return false; + } + public TestResults run(Map tests, File reportDir) { + Set focusTests = new HashSet(); { + for (String testName : tests.keySet()) { + File test = tests.get(testName); + if (test.exists()) { + try { + XdmNode node = new XdmNode( + processor.getUnderlyingConfiguration().buildDocument(new StreamSource(test))); + if (((XdmAtomicValue)xpathCompiler.evaluateSingle("exists(//scenario[@focus])", node)).getBooleanValue()) + focusTests.add(testName); + } catch (SaxonApiException e) { + } catch (XPathException e) { + } + } + } + } + Set skipTests = new HashSet(); { + if (!focusTests.isEmpty()) + for (String testName : tests.keySet()) + if (!focusTests.contains(testName)) + skipTests.add(testName); + } TestResults.Builder builder = new TestResults.Builder(""); for (Map.Entry test : tests.entrySet()) { + if (skipTests.contains(test.getKey())) + continue; builder.addSubResults(runSingle(test.getKey(), test.getValue(), reportDir)); } - writeSummaryReport(tests.keySet(), reportDir); + writeSummaryReport(focusTests.isEmpty() ? tests.keySet() : focusTests, reportDir); return builder.build(); } @@ -313,8 +358,8 @@ private static Source getXSpecSource(String path) { * FileUtils.listFiles from Apache Commons IO could be used here as well, * but would introduce another dependency. */ - private static Collection listXSpecFilesRecursively(File directory) { - ImmutableList.Builder builder = new ImmutableList.Builder(); + public static Set listXSpecFilesRecursively(File directory) { + ImmutableSet.Builder builder = new ImmutableSet.Builder(); if (directory.isDirectory()) for (File file : directory.listFiles()) { if (file.isDirectory())