summaryrefslogtreecommitdiffstats
path: root/src/dom/xpathtest.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/dom/xpathtest.cpp')
-rwxr-xr-xsrc/dom/xpathtest.cpp1399
1 files changed, 1399 insertions, 0 deletions
diff --git a/src/dom/xpathtest.cpp b/src/dom/xpathtest.cpp
new file mode 100755
index 000000000..e3308b1a3
--- /dev/null
+++ b/src/dom/xpathtest.cpp
@@ -0,0 +1,1399 @@
+/**
+ * Phoebe DOM Implementation.
+ *
+ * This is a C++ approximation of the W3C DOM model, which follows
+ * fairly closely the specifications in the various .idl files, copies of
+ * which are provided for reference. Most important is this one:
+ *
+ * http://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/idl-definitions.html
+ *
+ * Authors:
+ * Bob Jamison
+ *
+ * Copyright (C) 2005 Bob Jamison
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+
+
+#include "lsimpl.h"
+#include "xpathparser.h"
+
+#include <stdio.h>
+
+using namespace org::w3c::dom;
+using namespace org::w3c::dom::xpath;
+
+
+typedef struct
+{
+ char *xpathStr;
+ char *desc;
+ char *xml;
+} XpathTest;
+
+XpathTest xpathTests[] =
+{
+
+{
+"/AAA",
+"Select the root element AAA",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/CCC",
+"Select all elements CCC which are children of the root element AAA",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/DDD/BBB",
+"Select all elements BBB which are children of DDD which are children of the root element AAA",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB",
+"Select all elements BBB",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <BBB/>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//DDD/BBB",
+"Select all elements BBB which are children of DDD",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <BBB/>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/CCC/DDD/*",
+"Select all elements enclosed by elements /AAA/CCC/DDD",
+" <AAA>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <EEE/>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <EEE/>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </CCC>\n"
+" <CCC>\n"
+" <BBB>\n"
+" <BBB>\n"
+" <BBB/>\n"
+" </BBB>\n"
+" </BBB>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/*/*/*/BBB",
+"Select all elements BBB which have 3 ancestors",
+" <AAA>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <EEE/>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <EEE/>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </CCC>\n"
+" <CCC>\n"
+" <BBB>\n"
+" <BBB>\n"
+" <BBB/>\n"
+" </BBB>\n"
+" </BBB>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//*",
+"Select all elements",
+" <AAA>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <EEE/>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <EEE/>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </CCC>\n"
+" <CCC>\n"
+" <BBB>\n"
+" <BBB>\n"
+" <BBB/>\n"
+" </BBB>\n"
+" </BBB>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/BBB[1]",
+"Select the first BBB child of element AAA",
+" <AAA>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/BBB[last()]",
+"Select the last BBB child of element AAA",
+" <AAA>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </AAA>\n"
+},
+
+{
+"//@id",
+"Select all attributes @id",
+" <AAA>\n"
+" <BBB id = 'b1'/>\n"
+" <BBB id = 'b2'/>\n"
+" <BBB name = 'bbb'/>\n"
+" <BBB/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[@id]",
+"Select BBB elements which have attribute id",
+" <AAA>\n"
+" <BBB id = 'b1'/>\n"
+" <BBB id = 'b2'/>\n"
+" <BBB name = 'bbb'/>\n"
+" <BBB/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[@name]",
+"Select BBB elements which have attribute name",
+" <AAA>\n"
+" <BBB id = 'b1'/>\n"
+" <BBB id = 'b2'/>\n"
+" <BBB name = 'bbb'/>\n"
+" <BBB/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[@*]",
+"Select BBB elements which have any attribute",
+" <AAA>\n"
+" <BBB id = 'b1'/>\n"
+" <BBB id = 'b2'/>\n"
+" <BBB name = 'bbb'/>\n"
+" <BBB/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[not(@*)]",
+"Select BBB elements without an attribute",
+" <AAA>\n"
+" <BBB id = 'b1'/>\n"
+" <BBB id = 'b2'/>\n"
+" <BBB name = 'bbb'/>\n"
+" <BBB/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[@id='b1']",
+"Select BBB elements which have attribute id with value b1",
+" <AAA>\n"
+" <BBB id = 'b1'/>\n"
+" <BBB name = ' bbb '/>\n"
+" <BBB name = 'bbb'/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[@name='bbb']",
+"Select BBB elements which have attribute name with value 'bbb'",
+" <AAA>\n"
+" <BBB id = 'b1'/>\n"
+" <BBB name = ' bbb '/>\n"
+" <BBB name = 'bbb'/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[normalize-space(@name)='bbb']",
+"Select BBB elements which have attribute name with value bbb, leading and trailing spaces are removed before comparison",
+" <AAA>\n"
+" <BBB id = 'b1'/>\n"
+" <BBB name = ' bbb '/>\n"
+" <BBB name = 'bbb'/>\n"
+" </AAA>\n"
+},
+
+{
+"//*[count(BBB)=2]",
+"Select elements which have two children BBB",
+" <AAA>\n"
+" <CCC>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </CCC>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" <EEE>\n"
+" <CCC/>\n"
+" <DDD/>\n"
+" </EEE>\n"
+" </AAA>\n"
+},
+
+{
+"//*[count(*)=2]",
+"Select elements which have 2 children",
+" <AAA>\n"
+" <CCC>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </CCC>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" <EEE>\n"
+" <CCC/>\n"
+" <DDD/>\n"
+" </EEE>\n"
+" </AAA>\n"
+},
+
+{
+"//*[count(*)=3]",
+"Select elements which have 3 children",
+" <AAA>\n"
+" <CCC>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </CCC>\n"
+" <DDD>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </DDD>\n"
+" <EEE>\n"
+" <CCC/>\n"
+" <DDD/>\n"
+" </EEE>\n"
+" </AAA>\n"
+},
+
+{
+"//*[name()='BBB']",
+"Select all elements with name BBB, equivalent with //BBB",
+" <AAA>\n"
+" <BCC>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </BCC>\n"
+" <DDB>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </DDB>\n"
+" <BEC>\n"
+" <CCC/>\n"
+" <DBD/>\n"
+" </BEC>\n"
+" </AAA>\n"
+},
+
+{
+"//*[starts-with(name(),'B')]",
+"Select all elements name of which starts with letter B",
+" <AAA>\n"
+" <BCC>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </BCC>\n"
+" <DDB>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </DDB>\n"
+" <BEC>\n"
+" <CCC/>\n"
+" <DBD/>\n"
+" </BEC>\n"
+" </AAA>\n"
+},
+
+{
+"//*[contains(name(),'C')]",
+"Select all elements name of which contain letter C",
+" <AAA>\n"
+" <BCC>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </BCC>\n"
+" <DDB>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" </DDB>\n"
+" <BEC>\n"
+" <CCC/>\n"
+" <DBD/>\n"
+" </BEC>\n"
+" </AAA>\n"
+},
+
+{
+"//*[string-length(name()) = 3]",
+"Select elements with three-letter name",
+" <AAA>\n"
+" <Q/>\n"
+" <SSSS/>\n"
+" <BB/>\n"
+" <CCC/>\n"
+" <DDDDDDDD/>\n"
+" <EEEE/>\n"
+" </AAA>\n"
+},
+
+{
+"//*[string-length(name()) < 3]",
+"Select elements name of which has one or two characters",
+" <AAA>\n"
+" <Q/>\n"
+" <SSSS/>\n"
+" <BB/>\n"
+" <CCC/>\n"
+" <DDDDDDDD/>\n"
+" <EEEE/>\n"
+" </AAA>\n"
+},
+
+{
+"//*[string-length(name()) > 3]",
+"Select elements with name longer than three characters",
+" <AAA>\n"
+" <Q/>\n"
+" <SSSS/>\n"
+" <BB/>\n"
+" <CCC/>\n"
+" <DDDDDDDD/>\n"
+" <EEEE/>\n"
+" </AAA>\n"
+},
+
+{
+"//CCC | //BBB",
+"Select all elements CCC and BBB",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <DDD>\n"
+" <CCC/>\n"
+" </DDD>\n"
+" <EEE/>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/EEE | //BBB",
+"Select all elements BBB and elements EEE which are children of root element AAA",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <DDD>\n"
+" <CCC/>\n"
+" </DDD>\n"
+" <EEE/>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/EEE | //DDD/CCC | /AAA | //BBB",
+"Number of combinations is not restricted",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <DDD>\n"
+" <CCC/>\n"
+" </DDD>\n"
+" <EEE/>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA",
+"Equivalent of /child::AAA",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"/child::AAA",
+"Equivalent of /AAA",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/BBB",
+"Equivalent of /child::AAA/child::BBB",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"/child::AAA/child::BBB",
+"Equivalent of /AAA/BBB",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"/child::AAA/BBB",
+"Both possibilities can be combined",
+" <AAA>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"/descendant::*",
+"Select all descendants of document root and therefore all elements",
+" <AAA>\n"
+" <BBB>\n"
+" <DDD>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" <EEE/>\n"
+" </CCC>\n"
+" </DDD>\n"
+" </BBB>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <EEE>\n"
+" <DDD>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </EEE>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/BBB/descendant::*",
+"Select all descendants of /AAA/BBB",
+" <AAA>\n"
+" <BBB>\n"
+" <DDD>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" <EEE/>\n"
+" </CCC>\n"
+" </DDD>\n"
+" </BBB>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <EEE>\n"
+" <DDD>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </EEE>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//CCC/descendant::*",
+"Select all elements which have CCC among its ancestors",
+" <AAA>\n"
+" <BBB>\n"
+" <DDD>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" <EEE/>\n"
+" </CCC>\n"
+" </DDD>\n"
+" </BBB>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <EEE>\n"
+" <DDD>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </EEE>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//CCC/descendant::DDD",
+"Select elements DDD which have CCC among its ancestors",
+" <AAA>\n"
+" <BBB>\n"
+" <DDD>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" <EEE/>\n"
+" </CCC>\n"
+" </DDD>\n"
+" </BBB>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <EEE>\n"
+" <DDD>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </EEE>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//DDD/parent::*",
+"Select all parents of DDD element",
+" <AAA>\n"
+" <BBB>\n"
+" <DDD>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" <EEE/>\n"
+" </CCC>\n"
+" </DDD>\n"
+" </BBB>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <EEE>\n"
+" <DDD>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </EEE>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/BBB/DDD/CCC/EEE/ancestor::*",
+"Select all elements given in this absolute path",
+" <AAA>\n"
+" <BBB>\n"
+" <DDD>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" <EEE/>\n"
+" </CCC>\n"
+" </DDD>\n"
+" </BBB>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <EEE>\n"
+" <DDD>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </EEE>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//FFF/ancestor::*",
+"Select ancestors of FFF element",
+" <AAA>\n"
+" <BBB>\n"
+" <DDD>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" <EEE/>\n"
+" </CCC>\n"
+" </DDD>\n"
+" </BBB>\n"
+" <CCC>\n"
+" <DDD>\n"
+" <EEE>\n"
+" <DDD>\n"
+" <FFF/>\n"
+" </DDD>\n"
+" </EEE>\n"
+" </DDD>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/BBB/following-sibling::*",
+"The following-sibling axis contains all the following siblings of the context node.",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <DDD/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//CCC/following-sibling::*",
+"The following-sibling axis contains all the following siblings of the context node.",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <DDD/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/XXX/preceding-sibling::*",
+"The preceding-sibling axis contains all the preceding siblings of the context node.",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <DDD/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//CCC/preceding-sibling::*",
+"The preceding-sibling axis contains all the preceding siblings of the context node",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <DDD/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/XXX/following::*",
+"The following axis contains all nodes in the same document as the context "
+"node that are after the context node in document order, "
+"excluding any descendants and excluding attribute nodes and namespace nodes.",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ>\n"
+" <DDD/>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" </DDD>\n"
+" </ZZZ>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//ZZZ/following::*",
+"The following axis contains all nodes in the same document as the context "
+"node that are after the context node in document order, "
+"excluding any descendants and excluding attribute nodes and namespace nodes.",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ>\n"
+" <DDD/>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" </DDD>\n"
+" </ZZZ>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/XXX/preceding::*",
+"The preceding axis contains all nodes in the same document as the "
+"context node that are before the context node in document order, "
+"excluding any ancestors and excluding attribute nodes and namespace nodes",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ>\n"
+" <DDD/>\n"
+" </ZZZ>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//GGG/preceding::*",
+"The preceding axis contains all nodes in the same document as the "
+"context node that are before the context node in document order, "
+"excluding any ancestors and excluding attribute nodes and namespace nodes",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ>\n"
+" <DDD/>\n"
+" </ZZZ>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/XXX/descendant-or-self::*",
+"The descendant-or-self axis contains the "
+"context node and the descendants of the context node",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ>\n"
+" <DDD/>\n"
+" </ZZZ>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//CCC/descendant-or-self::*",
+"The descendant-or-self axis contains the "
+"context node and the descendants of the context node",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ>\n"
+" <DDD/>\n"
+" </ZZZ>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"/AAA/XXX/DDD/EEE/ancestor-or-self::*",
+"The ancestor-or-self axis contains the context node and the "
+"ancestors of the context node; thus, the ancestor-or-self axis "
+"will always include the root node.",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ>\n"
+" <DDD/>\n"
+" </ZZZ>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//GGG/ancestor-or-self::*",
+"The ancestor-or-self axis contains the context node and the "
+"ancestors of the context node; thus, the ancestor-or-self axis "
+"will always include the root node.",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ>\n"
+" <DDD/>\n"
+" </ZZZ>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <DDD/>\n"
+" <CCC/>\n"
+" <FFF/>\n"
+" <FFF>\n"
+" <GGG/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//GGG/ancestor::*",
+"The ancestor, descendant, following, preceding and self axes partition a document",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <FFF>\n"
+" <HHH/>\n"
+" <GGG>\n"
+" <JJJ>\n"
+" <QQQ/>\n"
+" </JJJ>\n"
+" <JJJ/>\n"
+" </GGG>\n"
+" <HHH/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//GGG/descendant::*",
+"The ancestor, descendant, following, preceding and self axes partition a document",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <FFF>\n"
+" <HHH/>\n"
+" <GGG>\n"
+" <JJJ>\n"
+" <QQQ/>\n"
+" </JJJ>\n"
+" <JJJ/>\n"
+" </GGG>\n"
+" <HHH/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//GGG/following::*",
+"The ancestor, descendant, following, preceding and self axes partition a document",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <FFF>\n"
+" <HHH/>\n"
+" <GGG>\n"
+" <JJJ>\n"
+" <QQQ/>\n"
+" </JJJ>\n"
+" <JJJ/>\n"
+" </GGG>\n"
+" <HHH/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//GGG/preceding::*",
+"The ancestor, descendant, following, preceding and self axes partition a document",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <FFF>\n"
+" <HHH/>\n"
+" <GGG>\n"
+" <JJJ>\n"
+" <QQQ/>\n"
+" </JJJ>\n"
+" <JJJ/>\n"
+" </GGG>\n"
+" <HHH/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//GGG/self::*",
+"The ancestor, descendant, following, preceding and self axes partition a document",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <FFF>\n"
+" <HHH/>\n"
+" <GGG>\n"
+" <JJJ>\n"
+" <QQQ/>\n"
+" </JJJ>\n"
+" <JJJ/>\n"
+" </GGG>\n"
+" <HHH/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//GGG/ancestor::* | //GGG/descendant::* | //GGG/following::* | //GGG/preceding::* | //GGG/self::*",
+"The ancestor, descendant, following, preceding and self axes partition a document",
+" <AAA>\n"
+" <BBB>\n"
+" <CCC/>\n"
+" <ZZZ/>\n"
+" </BBB>\n"
+" <XXX>\n"
+" <DDD>\n"
+" <EEE/>\n"
+" <FFF>\n"
+" <HHH/>\n"
+" <GGG>\n"
+" <JJJ>\n"
+" <QQQ/>\n"
+" </JJJ>\n"
+" <JJJ/>\n"
+" </GGG>\n"
+" <HHH/>\n"
+" </FFF>\n"
+" </DDD>\n"
+" </XXX>\n"
+" <CCC>\n"
+" <DDD/>\n"
+" </CCC>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[position() mod 2 = 0 ]",
+"Select even BBB elements",
+" <AAA>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <CCC/>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"//BBB[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]",
+"Select middle BBB element(s)",
+" <AAA>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <CCC/>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{
+"//CCC[ position() = floor(last() div 2 + 0.5) or position() = ceiling(last() div 2 + 0.5) ]",
+"Select middle CCC element(s)",
+" <AAA>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <BBB/>\n"
+" <CCC/>\n"
+" <CCC/>\n"
+" <CCC/>\n"
+" </AAA>\n"
+},
+
+{ //end data
+NULL,
+NULL,
+NULL,
+}
+
+};
+
+
+
+bool doStringTest(char *str)
+{
+ XPathParser xp;
+ xp.setDebug(true);
+
+ if (!xp.parse(str))
+ return false;
+
+
+ return true;
+}
+
+
+
+bool doStringTests()
+{
+ for (XpathTest *xpt = xpathTests ; xpt->xpathStr ; xpt++)
+ {
+ if (!doStringTest(xpt->xpathStr))
+ return false;
+ }
+ return true;
+}
+
+bool doXmlTest(XpathTest *xpt)
+{
+ //### READ
+ ls::DOMImplementationLSImpl domImpl;
+ ls::LSInput input = domImpl.createLSInput();
+ ls::LSParser &parser = domImpl.createLSParser(0, "");
+ input.setStringData(xpt->xml);
+ Document *doc = parser.parse(input);
+
+ //### WRITE
+ ls::LSSerializer &serializer = domImpl.createLSSerializer();
+ ls::LSOutput output = domImpl.createLSOutput();
+ StdWriter writer;
+ output.setCharacterStream(&writer);
+ serializer.write(doc, output);
+
+ delete doc;
+ return true;
+}
+
+bool doXmlTests()
+{
+ for (XpathTest *xpt = xpathTests ; xpt->xpathStr ; xpt++)
+ {
+ if (!doXmlTest(xpt))
+ return false;
+ }
+ return true;
+}
+
+bool doTests()
+{
+ /*
+ if (!doStringTests())
+ {
+ printf("## Failed string tests\n");
+ return false;
+ }
+ */
+ if (!doXmlTests())
+ {
+ printf("## Failed xml tests\n");
+ return false;
+ }
+ return true;
+}
+
+
+
+int main(int argc, char **argv)
+{
+ doTests();
+ return 0;
+}