Author: ate Date: Sat Nov 15 04:10:09 2014 New Revision: 1639831 URL: http://svn.apache.org/r1639831 Log: SCXML-222: Add support for executing the SCXML IRP test cases
Added: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java (with props) commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl (with props) commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/tests.xml (with props) Modified: commons/proper/scxml/trunk/pom.xml Modified: commons/proper/scxml/trunk/pom.xml URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/pom.xml?rev=1639831&r1=1639830&r2=1639831&view=diff ============================================================================== --- commons/proper/scxml/trunk/pom.xml (original) +++ commons/proper/scxml/trunk/pom.xml Sat Nov 15 04:10:09 2014 @@ -170,6 +170,12 @@ <artifactId>commons-beanutils</artifactId> <version>1.9.2</version> </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>2.4</version> + <scope>test</scope> + </dependency> </dependencies> <distributionManagement> @@ -205,6 +211,7 @@ <directory>src/test/java</directory> <includes> <include>**/*.xml</include> + <include>**/*.xsl</include> <include>**/*.gif</include> </includes> </testResource> @@ -257,6 +264,17 @@ <cleanupDaemonThreads>false</cleanupDaemonThreads> </configuration> </plugin> + <plugin> + <groupId>org.apache.rat</groupId> + <artifactId>apache-rat-plugin</artifactId> + <!-- Should agree with config in reporting section --> + <configuration> + <excludes combine.children="append"> + <!--exclude stylesheet adapted from http://www.w3.org/Voice/2013/scxml-irp/confXPath.xsl --> + <exclude>src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl</exclude> + </excludes> + </configuration> + </plugin> </plugins> </build> @@ -297,6 +315,17 @@ </configuration> </plugin> --> + <plugin> + <groupId>org.apache.rat</groupId> + <artifactId>apache-rat-plugin</artifactId> + <!-- Should agree with config in build section --> + <configuration> + <excludes combine.children="append"> + <!--exclude stylesheet adapted from http://www.w3.org/Voice/2013/scxml-irp/confXPath.xsl --> + <exclude>src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl</exclude> + </excludes> + </configuration> + </plugin> </plugins> </reporting> @@ -357,6 +386,160 @@ </plugins> </build> </profile> + <profile> + <!-- download the W3C IRP tests and ecma and xpath stylesheets to transform them, using: + $ mvn -P w3Tests.get + --> + <id>w3cTests.get</id> + <build> + <defaultGoal>test</defaultGoal> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <skipTests>true</skipTests> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.3.2</version> + <executions> + <execution> + <phase>test</phase> + <goals> + <goal>java</goal> + </goals> + </execution> + </executions> + <configuration> + <mainClass>org.apache.commons.scxml2.w3c.W3CTests</mainClass> + <arguments> + <argument>get</argument> + </arguments> + <systemProperties> + <systemProperty> + <key>org.apache.commons.logging.Log</key> + <value>org.apache.commons.logging.impl.SimpleLog</value> + </systemProperty> + <systemProperty> + <key>org.apache.commons.logging.simplelog.defaultlog</key> + <value>${simplelog.defaultlog}</value> + </systemProperty> + </systemProperties> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <profile> + <!-- make the W3C IRP tests by transforming them with the datamodel specific stylesheets using: + $ mvn -P w3cTests.make + --> + <id>w3cTests.make</id> + <dependencies> + <!-- needed for XPath 2.0 support to transform w3c txml tests --> + <dependency> + <groupId>net.sf.saxon</groupId> + <artifactId>Saxon-HE</artifactId> + <version>9.6.0-1</version> + <scope>test</scope> + </dependency> + </dependencies> + <build> + <defaultGoal>test</defaultGoal> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <skipTests>true</skipTests> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.3.2</version> + <executions> + <execution> + <phase>test</phase> + <goals> + <goal>java</goal> + </goals> + </execution> + </executions> + <configuration> + <mainClass>org.apache.commons.scxml2.w3c.W3CTests</mainClass> + <arguments> + <argument>make</argument> + </arguments> + <systemProperties> + <systemProperty> + <key>org.apache.commons.logging.Log</key> + <value>org.apache.commons.logging.impl.SimpleLog</value> + </systemProperty> + <systemProperty> + <key>org.apache.commons.logging.simplelog.defaultlog</key> + <value>${simplelog.defaultlog}</value> + </systemProperty> + </systemProperties> + </configuration> + </plugin> + </plugins> + </build> + </profile> + <profile> + <!-- Run one or multiple W3C IRP tests using optional system parameters for datamodel and/or test id, using: + $ mvn -P w3cTests.run [-Ddatamodel=<ecma|xpath|minimal>] [-Dtest=<testId>] + + Also see: src/test/java/org/apache/commons/scxml2/w3c/tests.xml + which contains configurations per test (if it default is enabled/disabled, status, etc.) + For precise details if and how tests are executed, see the W3CTests.java class + --> + <id>w3cTests.run</id> + <build> + <defaultGoal>test</defaultGoal> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-surefire-plugin</artifactId> + <configuration> + <skipTests>true</skipTests> + </configuration> + </plugin> + <plugin> + <groupId>org.codehaus.mojo</groupId> + <artifactId>exec-maven-plugin</artifactId> + <version>1.3.2</version> + <executions> + <execution> + <phase>test</phase> + <goals> + <goal>java</goal> + </goals> + </execution> + </executions> + <configuration> + <mainClass>org.apache.commons.scxml2.w3c.W3CTests</mainClass> + <arguments> + <argument>run</argument> + </arguments> + <systemProperties> + <systemProperty> + <key>org.apache.commons.logging.Log</key> + <value>org.apache.commons.logging.impl.SimpleLog</value> + </systemProperty> + <systemProperty> + <key>org.apache.commons.logging.simplelog.defaultlog</key> + <value>${simplelog.defaultlog}</value> + </systemProperty> + </systemProperties> + </configuration> + </plugin> + </plugins> + </build> + </profile> </profiles> </project> Added: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java?rev=1639831&view=auto ============================================================================== --- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java (added) +++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java Sat Nov 15 04:10:09 2014 @@ -0,0 +1,758 @@ +/* + * 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.commons.scxml2.w3c; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.XmlValue; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.stream.StreamResult; +import javax.xml.transform.stream.StreamSource; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.scxml2.SCXMLExecutor; +import org.apache.commons.scxml2.env.Tracer; +import org.apache.commons.scxml2.invoke.SimpleSCXMLInvoker; +import org.apache.commons.scxml2.io.SCXMLReader; +import org.apache.commons.scxml2.model.Final; +import org.apache.commons.scxml2.model.SCXML; + +/** + * W3C SCXML 1.0 IRP tests: <a href="http://www.w3.org/Voice/2013/scxml-irp/">http://www.w3.org/Voice/2013/scxml-irp/</a>. + * <p> + * The <b>W3CTests</b> class is standalone and can download and transform the IRP tests locally using respectively + * commandline parameter <b>get</b> or <b>make</b>. + * </p> + * <p> + * To execute one or multiple IRP tests the commandline parameter <b>run</b> must be specified. + * </p> + * <p> + * Optional environment parameter <b>-Ddatamodel=<minimal|ecma|xpath></b> can be specified to limit the + * execution of the tests for and using only the specified datamodel language. + * </p> + * <p> + * Optional environment parameter <b>-Dtest=<testId></b> can be specified to only execute a single test, which + * also can be combined with the <b>-Ddatamodel</b> parameter. + * </p> + * <p> + * The W3CTests also uses a separate <b><code>tests.xml</code></b> configuration file, located in the + * <b><code>src/test/resources/w3c</code></b> directory, which is manually maintained to enable|disable execution + * of tests (when <em>not</em> using the <b>-Dtest</b> parameter, which will always execute the specified test).<br/> + * Furthermore, in this configuration file the current <em>success</em> or <em>failure</em> status, and even more + * meta data per test is maintained. + * </p> + */ +@SuppressWarnings("unused") +public class W3CTests { + + private static final String SCXML_IRP_BASE_URL = "http://www.w3.org/Voice/2013/scxml-irp/"; + private static final String SCXML_IRP_MANIFEST_URI = "manifest.xml"; + private static final String SCXML_IRP_ECMA_XSL_URI = "confEcma.xsl"; + private static final String SCXML_IRP_XPATH_XSL_URI = "confXpath.xsl"; + + private static final String TESTS_SRC_DIR = "src/w3c/scxml-irp/"; + private static final String TXML_TESTS_DIR = TESTS_SRC_DIR + "txml/"; + private static final String MINIMAL_TESTS_DIR = TESTS_SRC_DIR + "minimal/"; + private static final String ECMA_TESTS_DIR = TESTS_SRC_DIR + "ecma/"; + private static final String XPATH_TESTS_DIR = TESTS_SRC_DIR + "xpath/"; + private static final String PACKAGE_PATH = "/"+W3CTests.class.getPackage().getName().replace('.','/'); + private static final String TESTS_FILENAME = PACKAGE_PATH + "/tests.xml"; + private static final String SCXML_IRP_MINIMAL_XSL_FILENAME = PACKAGE_PATH + "/confMinimal.xsl"; + + /** + * Tests model class used for loading the <b>tests.xml</b> configuration file + */ + @XmlRootElement(name="tests") + @XmlAccessorType(XmlAccessType.FIELD) + protected static class Tests { + + @XmlAccessorType(XmlAccessType.FIELD) + protected static class Test { + + @XmlAttribute(required=true) + private String id; + @XmlAttribute(required=true) + private Boolean mandatory; + @XmlAttribute(required=true) + private Boolean manual; + @XmlAttribute(required=true) + private boolean enabled; + @XmlAttribute + private String finalId; + @XmlAttribute + private Boolean implemented; + @XmlAttribute(name="minimal") + String minimalStatus; + @XmlAttribute(name="ecma") + String ecmaStatus; + @XmlAttribute(name="xpath") + String xpathStatus; + @XmlAttribute + Boolean xpathEnabled; + @XmlValue + private String comment; + + public String getId() { + return id; + } + + public boolean isMandatory() { + return mandatory; + } + + public boolean isManual() { + return manual == null || manual; + } + + public boolean isEnabled() { + return enabled; + } + + public String getFinalState() { + return finalId; + } + + public boolean isImplemented() { + return implemented == null || implemented; + } + + public String getMinimalStatus() { + return minimalStatus; + } + + public String getEcmaStatus() { + return ecmaStatus; + } + + public String getXpathStatus() { + return xpathStatus; + } + + public boolean isXPathEnabled() { + return xpathEnabled == null || xpathEnabled; + } + + public String getComment() { + return comment; + } + + public String toString() { + return id; + } + } + + @XmlElement(name="test") + private ArrayList<Test> tests; + + private LinkedHashMap<String, Test> testsMap; + + public LinkedHashMap<String, Test> getTests() { + if (testsMap == null) { + testsMap = new LinkedHashMap<String, Test>(); + if (tests != null) { + for (Test t : tests) { + testsMap.put(t.getId(), t); + } + } + } + return testsMap; + } + } + + /** + * Datamodel enum representing the minimal, ecma and xpath datamodel types used and tested by the W3C IRP tests. + */ + protected enum Datamodel { + + MINIMAL("minimal"), + ECMA("ecma"), + XPATH("xpath"); + + private final String value; + + private Datamodel(final String value) { + this.value = value; + } + + public String value() { + return value; + } + + public static Datamodel fromValue(final String value) { + for (Datamodel datamodel : Datamodel.values()) { + if (datamodel.value().equals(value)) { + return datamodel; + } + } + return null; + } + } + + /** + * Assertions model class used for loading the W3C IRP tests manifest.xml file, defining the meta data and + * source URIs for all the W3C IRP tests. + */ + @XmlRootElement(name="assertions") + @XmlAccessorType(XmlAccessType.FIELD) + protected static class Assertions { + + @XmlAccessorType(XmlAccessType.FIELD) + protected static class Assertion { + + @XmlAttribute + private String id; + @XmlAttribute(name="specnum") + private String specnum; + @XmlAttribute(name="specid") + private String specid; + @XmlElement(name="test") + private ArrayList<TestCase> testCases; + + public String getId() { + return id; + } + + public String getSpecNum() { + return specnum; + } + + public String getSpecId() { + return specid; + } + + public List<TestCase> getTestCases() { + return testCases != null ? testCases : Collections.<TestCase>emptyList(); + } + + public Datamodel getDatamodel() { + if ("#minimal-profile".equals(specid)) { + return Datamodel.MINIMAL; + } + else if ("#ecma-profile".equals(specid)) { + return Datamodel.ECMA; + } + else if ("#xpath-profile".equals(specid)) { + return Datamodel.XPATH; + } + return null; + } + + public String toString() { + return id; + } + } + + @XmlAccessorType(XmlAccessType.FIELD) + protected static class TestCase { + + @XmlAttribute + private String id; + @XmlAttribute + private String manual; + @XmlAttribute + private String conformance; + @XmlElement(name="start") + private ArrayList<Resource> scxmlResources; + @XmlElement(name="dep") + private ArrayList<Resource> depResources; + + private ArrayList<Resource> resources; + + public String getId() { + return id; + } + + public boolean isManual() { + return Boolean.parseBoolean(manual); + } + + public boolean isOptional() { + return "mandatory".equals(conformance); + } + + public List<Resource> getScxmlResources() { + return scxmlResources != null ? scxmlResources : Collections.<Resource>emptyList(); + } + + public List<Resource> getResources() { + if (resources == null) { + resources = new ArrayList<Resource>(); + if (scxmlResources != null) { + resources.addAll(scxmlResources); + } + if (depResources != null) { + resources.addAll(depResources); + // no longer needed + depResources = null; + } + } + return resources; + } + } + + @XmlAccessorType(XmlAccessType.FIELD) + protected static class Resource { + + @XmlAttribute + private String uri; + + public String getUri() { + return uri; + } + + public String getName() { + return uri.substring(uri.indexOf("/")+1, uri.indexOf(".")); + } + + public String getFilename() { + return uri.substring(uri.indexOf("/")+1); + } + } + + @XmlElement(name="assert") + private ArrayList<Assertion> assertions; + + private LinkedHashMap<String, Assertion> assertionsMap; + + public LinkedHashMap<String, Assertion> getAssertions() { + if (assertionsMap == null) { + assertionsMap = new LinkedHashMap<String, Assertion>(); + if (assertions != null) { + for (Assertion a : assertions) { + assertionsMap.put(a.getId(), a); + } + } + } + return assertionsMap; + } + } + + /** + * Simple TestResult data struct for tracking test results + */ + protected static class TestResults { + int testsSkipped; + int testsPassed; + int testsFailed; + int minimalPassed; + int minimalFailed; + int ecmaPassed; + int ecmaFailed; + int xpathPassed; + int xpathFailed; + ArrayList<String> failedTests = new ArrayList<String>(); + } + + /** + * W3CTests main function, see {@link #usage()} how to use. + * @param args + * @throws Exception + */ + public static void main(final String[] args) throws Exception { + if (args.length > 0) { + if ("get".equals(args[0])) { + new W3CTests().getTests(); + return; + } + else if ("make".equals(args[0])) { + new W3CTests().makeTests(); + return; + } + else if ("run".equals(args[0])) { + Datamodel datamodel = Datamodel.fromValue(System.getProperty("datamodel")); + String testId = System.getProperty("test"); + new W3CTests().runTests(testId, datamodel); + return; + } + } + usage(); + } + + /** + * Usage prints the 'commandline' usage options. + */ + protected static void usage() { + System.out.println("Usage: W3CTests <get|run>\n" + + " get - downloads the W3C IRP tests\n" + + " make - make previously downloaded W3C IRP tests by transforming the .txml templates\n" + + " run - runs test(s), optionally only for a specific datamodel (default: all)\n\n" + + "To run a single test, specify -Dtest=<testId>, otherwise all enabled tests will be run.\n" + + "To only run test(s) for a specific datamodel, specify -Ddatamodel=<minimal|ecma|xpath>.\n"); + } + + /** + * Downloads the W3C IRP manifest.xml, the IRP ecma and xpath stylesheets to transform the tests, and the + * actual test templates (.txml) as defined in the manifest.xml + * @throws Exception + */ + protected void getTests() throws Exception { + final File testsSrcDir = new File(TESTS_SRC_DIR); + if (!testsSrcDir.mkdirs()) { + FileUtils.cleanDirectory(testsSrcDir); + } + new File(TXML_TESTS_DIR).mkdirs(); + new File(MINIMAL_TESTS_DIR).mkdirs(); + new File(ECMA_TESTS_DIR).mkdirs(); + new File(XPATH_TESTS_DIR).mkdirs(); + System.out.println("Downloading IRP manifest: " + SCXML_IRP_BASE_URL + SCXML_IRP_MANIFEST_URI); + FileUtils.copyURLToFile(new URL(SCXML_IRP_BASE_URL + SCXML_IRP_MANIFEST_URI), new File(testsSrcDir, SCXML_IRP_MANIFEST_URI)); + System.out.println("Downloading ecma stylesheet: " + SCXML_IRP_BASE_URL + SCXML_IRP_ECMA_XSL_URI); + FileUtils.copyURLToFile(new URL(SCXML_IRP_BASE_URL + SCXML_IRP_ECMA_XSL_URI), new File(testsSrcDir, SCXML_IRP_ECMA_XSL_URI)); + System.out.println("Downloading xpath stylesheet: " + SCXML_IRP_BASE_URL + SCXML_IRP_XPATH_XSL_URI); + FileUtils.copyURLToFile(new URL(SCXML_IRP_BASE_URL + SCXML_IRP_XPATH_XSL_URI), new File(testsSrcDir, SCXML_IRP_XPATH_XSL_URI)); + Assertions assertions = loadAssertions(); + for (Assertions.Assertion entry : assertions.getAssertions().values()) { + for (Assertions.TestCase test : entry.getTestCases()) { + for (Assertions.Resource resource : test.getResources()) { + System.out.println("Downloading IRP test file: " + SCXML_IRP_BASE_URL + resource.getUri()); + FileUtils.copyURLToFile(new URL(SCXML_IRP_BASE_URL + resource.getUri()), new File(TXML_TESTS_DIR + resource.getFilename())); + } + } + } + } + + /** + * Transforms the W3C IRP tests. + * <p> + * Note: for transforming the IRP .txml test files XPath 2.0 is required, for which the Saxon library is used. + * </p> + * @throws Exception + */ + protected void makeTests() throws Exception { + final File testsSrcDir = new File(TESTS_SRC_DIR); + + TransformerFactory factory = TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl",null); + factory.setFeature("http://saxon.sf.net/feature/suppressXsltNamespaceCheck", true); + Transformer ecmaTransformer = factory.newTransformer(new StreamSource(new FileInputStream(new File(testsSrcDir, SCXML_IRP_ECMA_XSL_URI)))); + Transformer xpathTransformer = factory.newTransformer(new StreamSource(new FileInputStream(new File(testsSrcDir, SCXML_IRP_XPATH_XSL_URI)))); + Transformer minimalTransformer = factory.newTransformer(new StreamSource(getClass().getResourceAsStream(SCXML_IRP_MINIMAL_XSL_FILENAME))); + Assertions assertions = loadAssertions(); + for (Assertions.Assertion entry : assertions.getAssertions().values()) { + for (Assertions.TestCase test : entry.getTestCases()) { + for (Assertions.Resource resource : test.getResources()) { + processResource(entry.getSpecId(), resource, minimalTransformer, ecmaTransformer, xpathTransformer); + } + } + } + } + + /** + * Unmarshall and return the W3C IRP tests manifest.xml + * @return an Assertions instance reprenting the W3C IRP tests manifest.xml + * @throws Exception + */ + protected Assertions loadAssertions() throws Exception { + final JAXBContext jaxbContext = JAXBContext.newInstance(Assertions.class); + final Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + return (Assertions)jaxbUnmarshaller.unmarshal(new File(TESTS_SRC_DIR, SCXML_IRP_MANIFEST_URI)); + } + + /** + * Download and transform a W3C IRP test resource file + * @param specid the SCXML 1.0 spec id (anchor) for the current assertion, + * which is used to determine if, how and where the resource should be transformed. + * @param resource The test resource definition + * @param minimalTransformer transformer to produce an minimal datamodel SCXML document from the txml resource + * @param ecmaTransformer transformer to produce an ecmascript datamodel SCXML document from the txml resource + * @param xpathTransformer transformer to produce a xpath datamodel based SCXML document from the txml resource + * @throws Exception + */ + protected void processResource(final String specid, final Assertions.Resource resource, + final Transformer minimalTransformer, final Transformer ecmaTransformer, + final Transformer xpathTransformer) + throws Exception { + System.out.println("processing IRP test file " + resource.getFilename()); + FileUtils.copyURLToFile(new URL(SCXML_IRP_BASE_URL + resource.getUri()), new File(TXML_TESTS_DIR + resource.getFilename())); + if (specid.equals("#minimal-profile")) { + transformResource(resource, minimalTransformer, MINIMAL_TESTS_DIR); + } + else if (specid.equals("#ecma-profile")) { + transformResource(resource, ecmaTransformer, ECMA_TESTS_DIR); + } + else if (specid.equals("#xpath-profile")) { + transformResource(resource, xpathTransformer, XPATH_TESTS_DIR); + } + else { + transformResource(resource, ecmaTransformer, ECMA_TESTS_DIR); + transformResource(resource, xpathTransformer, XPATH_TESTS_DIR); + } + } + + /** + * XSL transform a W3C IRP test SCXML resource to a datamodel specific location and format, + * or simply copy a non SCXML resource to that location. + * @param resource the test resource definition + * @param transformer the XSL transformer to use + * @param targetDir the target location for the transformed SCXML document, or the non-SCXML resource + * @throws Exception + */ + protected void transformResource(final Assertions.Resource resource, final Transformer transformer, + final String targetDir) throws Exception { + if (resource.getFilename().endsWith(".txml")) { + StreamSource txmlSource = new StreamSource(new FileInputStream(new File(TXML_TESTS_DIR, resource.getFilename()))); + transformer.transform(txmlSource, new StreamResult(new FileOutputStream(new File(targetDir, resource.getName() + ".scxml")))); + } + else { + FileUtils.copyFile(new File(TXML_TESTS_DIR, resource.getFilename()), new File(targetDir, resource.getFilename())); + } + } + + protected void createCleanDirectory(final String path) throws Exception { + final File dir = new File(path); + if (!dir.mkdirs()) { + FileUtils.cleanDirectory(dir); + } + } + + /** + * Run one or multiple W3C IRP tests + * @param testId a W3C IRP test id, or null to specify all tests to run + * @param datamodel only tests available for or executable with the specified datamodel will be run (or all if null) + * @throws Exception + */ + protected void runTests(final String testId, final Datamodel datamodel) throws Exception { + final Assertions assertions = loadAssertions(); + final Tests tests = loadTests(); + final TestResults results = new TestResults(); + if (testId != null) { + final Assertions.Assertion assertion = assertions.getAssertions().get(testId); + if (assertion != null) { + runTest(assertion, tests, datamodel, true, results); + } + else { + throw new IllegalArgumentException("Unknown test with id: "+testId); + } + } + else { + for (Assertions.Assertion entry : assertions.getAssertions().values()) { + runTest(entry, tests, datamodel, false, results); + } + } + System.out.println( + "\nTest results running " + + (testId == null ? "all enabled tests" : "test "+testId) + + (datamodel != null ? " for the "+datamodel.value+" datamodel" : "") + + ":\n" + + " number of tests : "+(results.testsSkipped+results.testsPassed+results.testsFailed) + + " ("+results.testsPassed+" passed, "+results.testsFailed +" failed, "+results.testsSkipped+" skipped)"); + if (results.minimalPassed+results.minimalFailed > 0) { + System.out.println( + " mimimal datamodel: "+results.minimalPassed+" passed, "+results.minimalFailed+" failed"); + } + if (results.ecmaPassed+results.ecmaFailed > 0) { + System.out.println( + " ecma datamodel: "+results.ecmaPassed+" passed, "+results.ecmaFailed+" failed"); + } + if (results.xpathPassed+results.xpathFailed > 0) { + System.out.println( + " xpath datamodel: "+results.xpathPassed+" passed, "+results.xpathFailed+" failed"); + } + System.out.print("\n"); + if (!results.failedTests.isEmpty()) { + System.out.println(" failed tests: "); + for (String filename : results.failedTests) { + System.out.println(" "+filename); + } + System.out.print("\n"); + } + } + + /** + * Loads the tests.xml configuration file into a Tests class configuration model instance. + * @return a Tests instance for the tests.xml configuration file. + * @throws Exception + */ + protected Tests loadTests() throws Exception { + final JAXBContext jaxbContext = JAXBContext.newInstance(Tests.class); + final Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + return (Tests)jaxbUnmarshaller.unmarshal(getClass().getResource(TESTS_FILENAME)); + } + + /** + * Run a single W3C IRP test (assert) + * @param assertion The W3C IRP assert, defining one or more {@link Assertions.TestCase}s + * @param tests the tests configurations + * @param datamodel the datamodel to limit and restrict the execution of the test + * @param singleTest if true a single test id was specified which will be executed even if disabled in the configuration. + * @throws Exception + */ + protected void runTest(final Assertions.Assertion assertion, final Tests tests, final Datamodel datamodel, + final boolean singleTest, TestResults results) throws Exception { + final Tests.Test test = tests.getTests().get(assertion.getId()); + if (test == null) { + throw new IllegalStateException("No test configuration found for W3C IRP test with id: "+assertion.getId()); + } + boolean skipped = true; + boolean passed = true; + if (singleTest || test.isEnabled()) { + if (datamodel != Datamodel.MINIMAL || datamodel.equals(assertion.getDatamodel())) { + if (datamodel == null || assertion.getDatamodel() == null || datamodel.equals(assertion.getDatamodel())) { + final Datamodel effectiveDM = datamodel != null ? datamodel : assertion.getDatamodel(); + for (Assertions.TestCase testCase : assertion.getTestCases()) { + if (effectiveDM != null) { + switch (effectiveDM) { + case MINIMAL: + skipped = false; + if (runTests(assertion, testCase, test, MINIMAL_TESTS_DIR, results.failedTests)) { + results.minimalPassed++; + } + else { + passed = false; + results.minimalFailed++; + } + break; + case ECMA: + skipped = false; + if (runTests(assertion, testCase, test, ECMA_TESTS_DIR, results.failedTests)) { + results.ecmaPassed++; + } + else { + passed = false; + results.ecmaFailed++; + } + break; + case XPATH: + if (test.isXPathEnabled()) { + skipped = false; + if (runTests(assertion, testCase, test, XPATH_TESTS_DIR, results.failedTests)) { + results.xpathPassed++; + } + else { + passed = false; + results.xpathFailed++; + } + } + break; + } + } + else { + skipped = false; + if (runTests(assertion, testCase, test, ECMA_TESTS_DIR, results.failedTests)) { + results.ecmaPassed++; + } + else { + passed = false; + results.ecmaFailed++; + } + if (test.isXPathEnabled()) { + if (runTests(assertion, testCase, test, XPATH_TESTS_DIR, results.failedTests)) { + results.xpathPassed++; + } + else { + passed = false; + results.xpathFailed++; + } + } + } + } + } + } + } + if (skipped) { + results.testsSkipped++; + } + else if (passed) { + results.testsPassed++; + } + else { + results.testsFailed++; + } + } + + /** + * Execute all W3C IRP SCXML tests for a specific {@link Assertions.TestCase} + * @param assertion the W3C IRP test assert definition + * @param testCase the W3C IRP test definition + * @param test the test configuration + * @param scxmlDir the datamodel specific directory path containing the SCXML document(s) + * @throws Exception + */ + protected boolean runTests(final Assertions.Assertion assertion, final Assertions.TestCase testCase, + final Tests.Test test, final String scxmlDir, ArrayList<String> failedTests) + throws Exception { + boolean passed = true; + for (Assertions.Resource scxmlResource : testCase.getScxmlResources()) { + File scxmlFile = new File(scxmlDir, scxmlResource.getName()+".scxml"); + if (!runTest(testCase, test, scxmlFile)) { + passed = false; + failedTests.add(scxmlFile.getParentFile().getName()+"/"+scxmlFile.getName()); + } + } + return passed; + } + + /** + * Run a single W3C IRP SCXML test + * @param testCase the W3C IRP test definition + * @param test the test configuration + * @param scxmlFile the file handle for the SCXML document + */ + protected boolean runTest(final Assertions.TestCase testCase, final Tests.Test test, final File scxmlFile) { + try { + System.out.println("Executing test: "+scxmlFile.getParentFile().getName()+"/"+scxmlFile.getName()); + final Tracer trc = new Tracer(); + final SCXML doc = SCXMLReader.read(new FileReader(scxmlFile)); + if (doc == null) { + System.out.println(" FAIL: the SCXML file " + + scxmlFile.getCanonicalPath() + " can not be parsed!"); + return false; + } + final SCXMLExecutor exec = new SCXMLExecutor(null, null, trc); + exec.setStateMachine(doc); + exec.addListener(doc, trc); + exec.registerInvokerClass("scxml", SimpleSCXMLInvoker.class); + exec.registerInvokerClass("http://www.w3.org/TR/scxml/", SimpleSCXMLInvoker.class); + exec.go(); + Final end; + while ((end = exec.getCurrentStatus().getFinalState()) == null) { + Thread.sleep(100); + exec.triggerEvents(); + } + System.out.println(" final state: "+end.getId()); + if (!testCase.isManual()) { + return end.getId().equals("pass"); + } + else if (test.getFinalState() != null) { + return end.getId().equals(test.getFinalState()); + } + else { + // todo: manual verification for specific tests + return false; + } + } + catch (Exception e) { + System.out.println(" FAIL: "+e.getMessage()); + return false; + } + } +} Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/W3CTests.java ------------------------------------------------------------------------------ svn:keywords = Id Added: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl?rev=1639831&view=auto ============================================================================== --- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl (added) +++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl Sat Nov 15 04:10:09 2014 @@ -0,0 +1,42 @@ +<?xml version="1.0"?> +<!-- Copyright 1998-2003 W3C (MIT, ERCIM, Keio), All Rights Reserved. See http://www.w3.org/Consortium/Legal/. --> +<!-- Adapted from http://www.w3.org/Voice/2013/scxml-irp/confXPath.xsl --> +<xsl:stylesheet + xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + xmlns:conf="http://www.w3.org/2005/scxml-conformance" + version="2.0"> + +<!-- Copy everything that doesn't match other rules --> +<xsl:template match="/ | @* | node()"> + <xsl:copy> + <xsl:apply-templates select="@* | node()"/> + </xsl:copy> +</xsl:template> + +<!-- Success criteria --> + +<xsl:template match="//@conf:targetpass"> + <xsl:attribute name="target">pass</xsl:attribute> +</xsl:template> + +<xsl:template match="conf:pass"> + <final xmlns="http://www.w3.org/2005/07/scxml" id="pass"/> +</xsl:template> + +<!-- Failure criteria --> + +<xsl:template match="//@conf:targetfail"> + <xsl:attribute name="target">fail</xsl:attribute> +</xsl:template> + +<xsl:template match="conf:fail"> + <final xmlns="http://www.w3.org/2005/07/scxml" id="fail"/> +</xsl:template> + +<!-- returns true if machine is in the state specified --> + +<xsl:template match="//@conf:inState"> + <xsl:attribute name="cond">In(<xsl:value-of select="."/>)</xsl:attribute> +</xsl:template> + +</xsl:stylesheet> Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/confMinimal.xsl ------------------------------------------------------------------------------ svn:keywords = Id Added: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/tests.xml URL: http://svn.apache.org/viewvc/commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/tests.xml?rev=1639831&view=auto ============================================================================== --- commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/tests.xml (added) +++ commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/tests.xml Sat Nov 15 04:10:09 2014 @@ -0,0 +1,234 @@ +<?xml version="1.0" encoding="UTF-8"?> +<tests> + <test id="355" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="576" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="364" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="372" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="570" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="375" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="376" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="377" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="378" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="387" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="579" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="580" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="388" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="396" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="399" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="401" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="402" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="403" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="404" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="405" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="406" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="407" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="409" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="411" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="412" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="413" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="415" mandatory="true" manual="true" enabled="true" finalId="final" ecma="final" xpath="final"/> + <test id="416" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="417" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="419" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="421" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="422" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail">fails with error: null</test> + <test id="423" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="503" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="504" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="505" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="506" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="533" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="144" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="147" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="148" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="149" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="150" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="151" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="152" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="153" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="155" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="156" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="525" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="158" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="159" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="276" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="277" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="279" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="280" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="fail"/> + <test id="550" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="551" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="552" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="286" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="287" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="288" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="487" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="294" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="527" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="528" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="529" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="298" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="343" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="488" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="301" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="302" mandatory="true" manual="false" enabled="true" ecma="pass" xpathEnabled="false"/> + <test id="303" mandatory="true" manual="false" enabled="true" ecma="pass" xpathEnabled="false"/> + <test id="304" mandatory="true" manual="false" enabled="true" ecma="pass" xpathEnabled="false"/> + <test id="307" mandatory="true" manual="true" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="309" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="310" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="311" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="312" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="313" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="314" mandatory="true" manual="true" enabled="false" ecma="fail" xpath="fail"/> + <test id="344" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="318" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="">xpath fails with error: null</test> + <test id="319" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="321" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="322" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="">xpath fails with error: null</test> + <test id="323" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="">xpath fails with error: null</test> + <test id="324" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="">xpath fails with error: null</test> + <test id="325" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="326" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="329" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="">xpath fails with error: null</test> + <test id="330" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="fail"/> + <test id="331" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="">xpath fails with error: null</test> + <test id="332" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="333" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="335" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="336" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="337" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="338" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="339" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="342" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="fail">xpath fails with error: null</test> + <test id="346" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="fail"/> + <test id="172" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="173" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="pass"/> + <test id="174" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="175" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath: Fails to complete</test> + <test id="176" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="178" mandatory="true" manual="true" enabled="true" finalId="final" ecma="final" xpath="final"/> + <test id="179" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="183" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="185" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="186" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="187" mandatory="true" manual="false" enabled="false" ecma="" xpath="">fails with error: null</test> + <test id="194" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="198" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="199" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="200" mandatory="true" manual="false" enabled="true" ecma="true" xpath="true"/> + <test id="201" mandatory="false" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="205" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="521" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="553" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="fail"/> + <test id="207" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="208" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="210" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="215" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails with error: null</test> + <test id="216" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="220" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="223" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="224" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="225" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="226" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="228" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="229" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="230" mandatory="true" manual="true" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="232" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="233" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="234" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="235" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="236" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="237" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="239" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="240" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="241" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="242" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="243" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="244" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="245" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="247" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="250" mandatory="true" manual="true" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="252" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="253" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="530" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="554" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="436" mandatory="true" manual="false" enabled="true" minimal="pass"/> + <test id="278" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="444" mandatory="false" manual="false" enabled="true" ecma="pass"/> + <test id="445" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="448" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="449" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="451" mandatory="false" manual="false" enabled="true" ecma="pass"/> + <test id="452" mandatory="false" manual="false" enabled="true" ecma="pass"/> + <test id="453" mandatory="false" manual="false" enabled="true" ecma="pass"/> + <test id="456" mandatory="false" manual="false" enabled="true" ecma="pass"/> + <test id="446" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="557" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="558" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="560" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="578" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="561" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="562" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="569" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="457" mandatory="false" manual="false" enabled="false" ecma="fail"/> + <test id="459" mandatory="false" manual="false" enabled="true" ecma="pass"/> + <test id="460" mandatory="false" manual="false" enabled="true" ecma="pass"/> + <test id="463" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="464" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="465" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="466" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="467" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="468" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="469" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="470" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="473" mandatory="false" manual="false" enabled="false" xpath="">xpath fails with error: null</test> + <test id="474" mandatory="false" manual="false" enabled="false" xpath="">xpath fails with error: null</test> + <test id="475" mandatory="false" manual="false" enabled="false" xpath="">xpath fails with error: null</test> + <test id="476" mandatory="false" manual="false" enabled="false" xpath="">xpath fails with error: null</test> + <test id="477" mandatory="false" manual="false" enabled="false" xpath="">xpath fails with error: null</test> + <test id="478" mandatory="false" manual="false" enabled="false" xpath="">xpath fails with error: null</test> + <test id="479" mandatory="false" manual="false" enabled="false" xpath="">xpath fails with error: null</test> + <test id="480" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="481" mandatory="false" manual="false" enabled="false" xpath="">xpath fails with error: null</test> + <test id="482" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="483" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="537" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="539" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="540" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="542" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="543" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="544" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="545" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="546" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="547" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="555" mandatory="false" manual="false" enabled="true" xpath="pass"/> + <test id="568" mandatory="false" manual="false" enabled="false" xpath="fail"/> + <test id="189" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="190" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="191" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="192" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="193" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="347" mandatory="true" manual="false" enabled="false" ecma="" xpath="">Fails to complete</test> + <test id="348" mandatory="true" manual="false" enabled="true" ecma="pass" xpath="pass"/> + <test id="349" mandatory="true" manual="false" enabled="false" ecma="pass" xpath="">xpath fails with error: null</test> + <test id="350" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="351" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="352" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="354" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="pass"/> + <test id="495" mandatory="true" manual="false" enabled="true" ecma="true" xpath="true"/> + <test id="496" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="fail"/> + <test id="500" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="501" mandatory="true" manual="false" enabled="false" ecma="fail" xpath="">xpath fails with error: null</test> + <test id="509" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="510" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="513" mandatory="false" manual="true" enabled="false" implemented="false"/> + <test id="518" mandatory="true" manual="false" enabled="false" implemented="false"/> + <test id="519" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="520" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="522" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="531" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="532" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="534" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="567" mandatory="false" manual="false" enabled="false" implemented="false"/> + <test id="577" mandatory="false" manual="false" enabled="false" implemented="false"/> +</tests> Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/tests.xml ------------------------------------------------------------------------------ svn:eol-style = native Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/tests.xml ------------------------------------------------------------------------------ svn:keywords = Id Propchange: commons/proper/scxml/trunk/src/test/java/org/apache/commons/scxml2/w3c/tests.xml ------------------------------------------------------------------------------ svn:mime-type = text/plain