summaryrefslogtreecommitdiff
path: root/test/java/src/org/apache/qetest/xalanj2/TestXPathAPI.java
diff options
context:
space:
mode:
authorVictor Chang <vichang@google.com>2023-07-03 08:55:35 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-07-03 08:55:35 +0000
commit4ff52b81bf727dbc3cd48e3d01c0e8e0a11ed474 (patch)
tree93663204726851f7b7e23e7ad8292cbd34cb9361 /test/java/src/org/apache/qetest/xalanj2/TestXPathAPI.java
parent0a0225c9c7e13f627a3490cb9d6e73092d46f1c9 (diff)
parent52bcda73243c16c411b4073599f8bf4f54f5c8ff (diff)
downloadapache-xml-4ff52b81bf727dbc3cd48e3d01c0e8e0a11ed474.tar.gz
Merge "Import sources from xalan-tests xalan-j_2_7_3-rc10" am: 52bcda7324
Original change: https://android-review.googlesource.com/c/platform/external/apache-xml/+/2643660 Change-Id: I37ecfcf287a7bc6f50ae6c523e0fab7f32546d31 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'test/java/src/org/apache/qetest/xalanj2/TestXPathAPI.java')
-rw-r--r--test/java/src/org/apache/qetest/xalanj2/TestXPathAPI.java462
1 files changed, 462 insertions, 0 deletions
diff --git a/test/java/src/org/apache/qetest/xalanj2/TestXPathAPI.java b/test/java/src/org/apache/qetest/xalanj2/TestXPathAPI.java
new file mode 100644
index 0000000..ff9bd85
--- /dev/null
+++ b/test/java/src/org/apache/qetest/xalanj2/TestXPathAPI.java
@@ -0,0 +1,462 @@
+/*
+ * 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.
+ */
+/*
+ * $Id$
+ */
+// This file uses 2 space indents, no tabs.
+
+/*
+ *
+ * TestXPathAPI.java
+ *
+ */
+package org.apache.qetest.xalanj2;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.util.Properties;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
+import org.apache.qetest.FileBasedTest;
+import org.apache.qetest.OutputNameManager;
+import org.apache.qetest.xsl.XSLTestfileInfo;
+import org.apache.xml.dtm.DTM;
+import org.apache.xml.dtm.DTMIterator;
+import org.apache.xml.dtm.DTMManager;
+import org.apache.xml.utils.PrefixResolverDefault;
+import org.apache.xpath.XPathAPI;
+import org.apache.xpath.objects.XObject;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.traversal.NodeIterator;
+import org.xml.sax.InputSource;
+
+/**
+ * Basic functionality test of the public XPathAPI methods.
+ *
+ * Very basic coverage/smoketest level test.
+ * Applies a number of XPaths to some sample documents
+ * and checks output from the various public XPathAPI mehods.
+ * @see XPathAPI
+ * @author myriam_midy@lotus.com
+ * @author shane_curcuru@lotus.com
+ */
+public class TestXPathAPI extends FileBasedTest
+{
+ /** Array of sample XPaths to test. */
+ protected String[] xpath;
+
+ /** Base path/name of all output files. */
+ protected String baseOutName = null;
+
+ protected XSLTestfileInfo testFileInfo1 = new XSLTestfileInfo();
+ protected XSLTestfileInfo testFileInfo2 = new XSLTestfileInfo();
+ protected XSLTestfileInfo testFileInfo3 = new XSLTestfileInfo();
+ protected XSLTestfileInfo testFileInfo4 = new XSLTestfileInfo();
+ protected XSLTestfileInfo testFileInfo5 = new XSLTestfileInfo();
+ protected XSLTestfileInfo testFileInfo6 = new XSLTestfileInfo();
+ protected XSLTestfileInfo testFileInfo7 = new XSLTestfileInfo();
+
+
+ /** Provides nextName(), currentName() functionality. */
+ protected OutputNameManager outNames;
+
+ /** Subdirectory under test\tests\api for our xsl/xml files. */
+ public static final String X2J_SUBDIR = "xalanj2";
+
+ /** Just initialize test name, comment, numTestCases. */
+ public TestXPathAPI()
+ {
+ numTestCases = 7; // REPLACE_num
+ testName = "TestXPathAPI";
+ testComment = "API coverage testing of XPathAPI";
+ }
+
+ /**
+ * Initialize this test - Set names of xml/xsl test files etc.
+ * Also initializes an array of sample xpaths to test.
+ *
+ * @param p Properties to initialize from (if needed)
+ * @return false if we should abort the test; true otherwise
+ */
+ public boolean doTestFileInit(Properties p)
+ {
+ // Used for all tests; just dump files in trax subdir
+ File outSubDir = new File(outputDir + File.separator + X2J_SUBDIR);
+ if (!outSubDir.mkdirs())
+ reporter.logWarningMsg("Could not create output dir: " + outSubDir);
+ // Output name manager initialized in each testCase
+ baseOutName = outputDir + File.separator + X2J_SUBDIR + File.separator + testName;
+
+ String testBasePath = inputDir
+ + File.separator
+ + X2J_SUBDIR
+ + File.separator;
+ String goldBasePath = goldDir
+ + File.separator
+ + X2J_SUBDIR
+ + File.separator;
+
+ // Gold names are appended onto for each test
+ testFileInfo1.xmlName = testBasePath + "testXPath.xml";
+ testFileInfo1.goldName = goldBasePath;
+
+ testFileInfo2.xmlName = testBasePath + "testXPath.xml";
+ testFileInfo2.goldName = goldBasePath;
+
+ testFileInfo3.xmlName = testBasePath + "testXPath.xml";
+ testFileInfo3.goldName = goldBasePath;
+
+ testFileInfo4.xmlName = testBasePath + "testXPath.xml";
+ testFileInfo4.goldName = goldBasePath;
+
+ testFileInfo5.xmlName = testBasePath + "testXPath.xml";
+ testFileInfo5.goldName = goldBasePath;
+
+ testFileInfo6.xmlName = testBasePath + "testXPath2.xml";
+ testFileInfo6.goldName = goldBasePath;
+
+ testFileInfo7.xmlName = testBasePath + "testXPath3.xml";
+ testFileInfo7.goldName = goldBasePath;
+
+ // Initialize xpath test data
+ // Note: when adding new xpaths, update array ctor and
+ // also need to update each testCase's gold files
+ xpath = new String[25];
+ xpath[0] = "/doc/a/@test";
+ xpath[1] = "//.";
+ xpath[2] = "/doc";
+ xpath[3] = "/doc/a";
+ xpath[4] = "//@*";
+ xpath[5] = ".";
+ xpath[6] = "//ancestor-or-self::*";
+ xpath[7] = "./child::*[1]";
+ xpath[8] = "//descendant-or-self::*/@*[1]";
+ xpath[9] = "//@* | * | node()";
+ xpath[10] = "//*";
+ xpath[11] = "/doc/namespace::*";
+ xpath[12] = "//descendant::comment()";
+ xpath[13] = "//*[local-name()='a']";
+ xpath[14] = "//*[current()]/@*";
+ xpath[15] = "//*[last()]";
+ xpath[16] = "doc/*[last()]";
+ xpath[17] = "/doc/a/*[current()]/@*";
+ xpath[18] = "doc/descendant::node()";
+ xpath[19] = "doc/a/@*";
+ xpath[20] = "doc/b/a/ancestor-or-self::*";
+ xpath[21] = "doc/b/a/preceding::*";
+ xpath[22] = "doc/a/following::*";
+ xpath[23] = "/doc/b/preceding-sibling::*";
+ xpath[24] = "/doc/a/following-sibling::*";
+
+ return true;
+ }
+
+
+
+ /** Quick test of XPathAPI.selectNodeIterator(). */
+ public boolean testCase1()
+ throws Exception
+ {
+ reporter.testCaseInit("Quick test of XPathAPI.selectNodeIterator()");
+ outNames = new OutputNameManager(baseOutName + reporter.getCurrentCaseNum(), ".out");
+
+ Document doc = parseToDOM(testFileInfo1.xmlName);
+ Transformer serializer = getSerializer();
+
+ for (int i=0;i<xpath.length; i++)
+ {
+ // Use the simple XPath API to select a nodeIterator.
+ NodeIterator nl = XPathAPI.selectNodeIterator(doc, xpath[i]);
+
+ Node n;
+ while ((n = nl.nextNode())!= null)
+ {
+ serializer.transform(new DOMSource(n), new StreamResult(outNames.nextName()));
+ File f = new File(outNames.currentName());
+ fileChecker.check(reporter,
+ f,
+ new File(testFileInfo1.goldName + f.getName()),
+ "selectNodeIterator() of "+xpath[i] + " into " + outNames.currentName());
+ }
+ } // of for...
+ reporter.testCaseClose();
+ return true;
+ }
+
+ /** Quick test of XPathAPI.selectNodeList(). */
+ public boolean testCase2()
+ throws Exception
+ {
+ reporter.testCaseInit("Quick test of XPathAPI.selectNodeList()");
+ outNames = new OutputNameManager(baseOutName + reporter.getCurrentCaseNum(), ".out");
+
+ // Note: parsed file and gold file don't match - why? 10-Oct-01 -sc
+ Document doc = parseToDOM(testFileInfo1.xmlName);
+ Transformer serializer = getSerializer();
+
+ for (int i=0;i<xpath.length; i++)
+ {
+ NodeList nl = XPathAPI.selectNodeList(doc, xpath[i]);
+
+ Node n;
+ int j = 0;
+ while (j < nl.getLength())
+ {
+ n = nl.item(j++);
+ serializer.transform(new DOMSource(n), new StreamResult(outNames.nextName()));
+ File f = new File(outNames.currentName());
+ fileChecker.check(reporter,
+ f,
+ new File(testFileInfo2.goldName + f.getName()),
+ "selectNodeList() of "+xpath[i] + " into " + outNames.currentName());
+ }
+ } // of for...
+ reporter.testCaseClose();
+ return true;
+ }
+
+ /** Quick test of XPathAPI.selectSingleNode(). */
+ public boolean testCase3()
+ throws Exception
+ {
+ reporter.testCaseInit("Quick test of XPathAPI.selectSingleNode()");
+ outNames = new OutputNameManager(baseOutName + reporter.getCurrentCaseNum(), ".out");
+
+ // Note: parsed file and gold file don't match - why? 10-Oct-01 -sc
+ Document doc = parseToDOM(testFileInfo1.xmlName);
+ Transformer serializer = getSerializer();
+
+ for (int i=0;i<xpath.length; i++)
+ {
+ Node n = XPathAPI.selectSingleNode(doc, xpath[i]);
+
+ if (n != null)
+ {
+ serializer.transform(new DOMSource(n), new StreamResult(outNames.nextName()));
+ File f = new File(outNames.currentName());
+ fileChecker.check(reporter,
+ f,
+ new File(testFileInfo3.goldName + f.getName()),
+ "selectSingleNode() of "+xpath[i] + " into " + outNames.currentName());
+ }
+ else
+ {
+ reporter.logWarningMsg("No node found with selectSingleNode() of "+xpath[i]);
+ }
+ } // of for...
+ reporter.testCaseClose();
+ return true;
+ }
+
+
+ /** Quick test of XPathAPI.eval(). */
+ public boolean testCase4()
+ throws Exception
+ {
+ reporter.testCaseInit("Quick test of XPathAPI.eval()");
+ outNames = new OutputNameManager(baseOutName + reporter.getCurrentCaseNum(), ".out");
+
+ // Note: parsed file and gold file don't match - why? 10-Oct-01 -sc
+ Document doc = parseToDOM(testFileInfo1.xmlName);
+ Transformer serializer = getSerializer();
+
+ //Document d1 =(Document) doc.getDocumentElement();
+ // Node d = (doc.getNodeType() == Node.DOCUMENT_NODE)
+ // ? (Document) doc.getDocumentElement() : doc;
+ reporter.logInfoMsg("Creating a PrefixResolverDefault(...)");
+ PrefixResolverDefault prefixResolver =
+ new PrefixResolverDefault(doc.getDocumentElement());
+
+ for (int i=0;i<xpath.length; i++)
+ {
+ XObject list = XPathAPI.eval(doc, xpath[i], prefixResolver);
+
+ int n;
+ DTMIterator nl = list.iter();
+ DTMManager dtmManager = nl.getDTMManager();
+ while ((n = nl.nextNode())!= DTM.NULL)
+ {
+ Node node = dtmManager.getDTM(n).getNode(n);
+ serializer.transform(new DOMSource(node), new StreamResult(outNames.nextName()));
+ File f = new File(outNames.currentName());
+ fileChecker.check(reporter,
+ f,
+ new File(testFileInfo4.goldName + f.getName()),
+ "eval() of "+xpath[i] + " into " + outNames.currentName());
+ }
+ } // of for...
+ reporter.testCaseClose();
+ return true;
+ }
+
+ /** Quick test of XPathAPI.selectNodeList() and doc.getFirstChild(). */
+ public boolean testCase5()
+ throws Exception
+ {
+ reporter.testCaseInit("Quick test of XPathAPI.selectNodeList() and doc.getFirstChild()");
+ outNames = new OutputNameManager(baseOutName + reporter.getCurrentCaseNum(), ".out");
+
+ Document doc = parseToDOM(testFileInfo5.xmlName);
+ Transformer serializer = getSerializer();
+
+ // Use the simple XPath API to select a nodeIterator.
+ reporter.logStatusMsg("Querying DOM using selectNodeList(doc.getFirstChild(), 'a')");
+ NodeList nl = XPathAPI.selectNodeList(doc.getFirstChild(), "a");
+
+ Node n;
+ int j = 0;
+ while (j < nl.getLength())
+ {
+ n = nl.item(j++);
+ serializer.transform(new DOMSource(n), new StreamResult(outNames.nextName()));
+ File f = new File(outNames.currentName());
+ fileChecker.check(reporter,
+ f,
+ new File(testFileInfo5.goldName + f.getName()),
+ "selectNodeList(doc.getFirstChild(), 'a') into " + outNames.currentName());
+ }
+ reporter.testCaseClose();
+ return true;
+ }
+
+ /** Quick test of XPathAPI.selectNodeIterator() and non-document node. */
+ public boolean testCase6()
+ throws Exception
+ {
+ reporter.testCaseInit("Quick test of XPathAPI.selectNodeIterator() and non-document node");
+ outNames = new OutputNameManager(baseOutName + reporter.getCurrentCaseNum(), ".out");
+ String filename = testFileInfo6.xmlName;
+ String xpathStr = "*[local-name()='sitemap' and namespace-uri()='http://apache.org/xalan/test/sitemap']";
+
+ // Set up a DOM tree to query.
+ reporter.logInfoMsg("Parsing input file "+filename);
+ InputSource in = new InputSource(new FileInputStream(filename));
+ DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
+ dfactory.setNamespaceAware(true);
+ Document doc = dfactory.newDocumentBuilder().parse(in);
+
+ Transformer serializer = getSerializer();
+
+ // Create DocumentFragment
+ DocumentFragment frag = doc.createDocumentFragment();
+ frag.appendChild(doc.getFirstChild());
+
+ // Use the simple XPath API to select a nodeIterator.
+ reporter.logStatusMsg("selectNodeIterator(" + xpathStr + ") and a non document node");
+ NodeIterator nl = XPathAPI.selectNodeIterator(frag, xpathStr);
+
+ Node n;
+ while ((n = nl.nextNode())!= null)
+ {
+ serializer.transform(new DOMSource(n), new StreamResult(outNames.nextName()));
+ File f = new File(outNames.currentName());
+ fileChecker.check(reporter,
+ f,
+ new File(testFileInfo6.goldName + f.getName()),
+ "selectNodeIterator(...) into " + outNames.currentName());
+ }
+ reporter.testCaseClose();
+ return true;
+ }
+
+ /** Quick test of XPathAPI.selectNodeList using 'id(a)'. */
+ public boolean testCase7()
+ throws Exception
+ {
+ reporter.testCaseInit("Quick test of XPathAPI.selectNodeList using 'id(a)'");
+ outNames = new OutputNameManager(baseOutName + reporter.getCurrentCaseNum(), ".out");
+
+ // Note: parsed file and gold file don't match - why? 10-Oct-01 -sc
+ Document doc = parseToDOM(testFileInfo7.xmlName);
+ Transformer serializer = getSerializer();
+
+ // Use the simple XPath API to select a nodeIterator.
+ reporter.logStatusMsg("selectNodeList using 'id(a)' ");
+ NodeList nl = XPathAPI.selectNodeList(doc, "id('a')");
+
+ Node n;
+ int j = 0;
+ while (j < nl.getLength())
+ {
+ n = nl.item(j++);
+ serializer.transform(new DOMSource(n), new StreamResult(outNames.nextName()));
+ File f = new File(outNames.currentName());
+ fileChecker.check(reporter,
+ f,
+ new File(testFileInfo5.goldName + f.getName()),
+ "selectNodeList using 'id(a)' into " + outNames.currentName());
+ }
+ reporter.testCaseClose();
+ return true;
+ }
+
+ /** Worker method to return a transformer for serializing. */
+ protected Transformer getSerializer() throws TransformerException
+ {
+ // Set up an identity transformer to use as serializer.
+ Transformer serializer = TransformerFactory.newInstance().newTransformer();
+ serializer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
+ return serializer;
+ }
+
+ /** Worker method to parse file into a DOM. */
+ protected Document parseToDOM(String filename) throws Exception
+ {
+ reporter.logInfoMsg("Parsing input file "+filename);
+
+ // Set up a DOM tree to query.
+ InputSource in = new InputSource(new FileInputStream(filename));
+ DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
+ Document doc = dfactory.newDocumentBuilder().parse(in);
+ return doc;
+ }
+
+ //-----------------------------------------------------------
+ //---- Basic XSLProcessorTestBase utility methods
+ //-----------------------------------------------------------
+ /**
+ * Convenience method to print out usage information - update if needed.
+ * @return String denoting usage of this test class
+ */
+ public String usage()
+ {
+ return ("Common [optional] options supported by TestXPathAPI:\n"
+ + "(Note: assumes inputDir=.\\tests\\api)\n"
+ + super.usage()); // Grab our parent classes usage as well
+ }
+
+
+ /** Main method to run from the command line. */
+ public static void main (String[] args)
+ {
+ TestXPathAPI app = new TestXPathAPI();
+ app.doMain(args);
+ }
+
+} // end of class ApplyXPath
+