diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_xpath_functions.cpp | 128 | ||||
-rw-r--r-- | tests/test_xpath_parse.cpp | 6 | ||||
-rw-r--r-- | tests/test_xpath_paths.cpp | 7 |
3 files changed, 140 insertions, 1 deletions
diff --git a/tests/test_xpath_functions.cpp b/tests/test_xpath_functions.cpp index e098813..e34fac1 100644 --- a/tests/test_xpath_functions.cpp +++ b/tests/test_xpath_functions.cpp @@ -498,6 +498,41 @@ TEST(xpath_string_translate) CHECK_XPATH_FAIL("translate('a', 'b', 'c', 'd')");
}
+TEST_XML(xpath_nodeset_last, "<node><c1/><c1/><c2/><c3/><c3/><c3/><c3/></node>")
+{
+ doc.precompute_document_order();
+
+ xml_node n = doc.child("node");
+
+ // last with 0 arguments
+ CHECK_XPATH_NUMBER(n, "last()", 1);
+ CHECK_XPATH_NODESET(n, "c1[last() = 1]");
+ CHECK_XPATH_NODESET(n, "c1[last() = 2]") % 3 % 4; // c1, c1
+ CHECK_XPATH_NODESET(n, "c2/preceding-sibling::node()[last() = 2]") % 4 % 3; // c1, c1
+
+ // last with 1 argument
+ CHECK_XPATH_FAIL("last(c)");
+}
+
+TEST_XML(xpath_nodeset_position, "<node><c1/><c1/><c2/><c3/><c3/><c3/><c3/></node>")
+{
+ doc.precompute_document_order();
+
+ xml_node n = doc.child("node");
+
+ // position with 0 arguments
+ CHECK_XPATH_NUMBER(n, "position()", 1);
+ CHECK_XPATH_NODESET(n, "c1[position() = 0]");
+ CHECK_XPATH_NODESET(n, "c1[position() = 1]") % 3;
+ CHECK_XPATH_NODESET(n, "c1[position() = 2]") % 4;
+ CHECK_XPATH_NODESET(n, "c1[position() = 3]");
+ CHECK_XPATH_NODESET(n, "c2/preceding-sibling::node()[position() = 1]") % 4;
+ CHECK_XPATH_NODESET(n, "c2/preceding-sibling::node()[position() = 2]") % 3;
+
+ // position with 1 argument
+ CHECK_XPATH_FAIL("position(c)");
+}
+
TEST_XML(xpath_nodeset_count, "<node><c1/><c1/><c2/><c3/><c3/><c3/><c3/></node>")
{
xml_node c;
@@ -537,6 +572,83 @@ TEST_XML(xpath_nodeset_id, "<node id='foo'/>") CHECK_XPATH_FAIL("id(1, 2)");
}
+TEST_XML_FLAGS(xpath_nodeset_local_name, "<node xmlns:foo='http://foo'><c1>text</c1><c2 xmlns:foo='http://foo2' foo:attr='value'><foo:child/></c2><c3 xmlns='http://def' attr='value'><child/></c3><c4><?target stuff?></c4></node>", parse_default | parse_pi)
+{
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ // local-name with 0 arguments
+ CHECK_XPATH_STRING(c, "local-name()", "");
+ CHECK_XPATH_STRING(n, "local-name()", "node");
+
+ // local-name with 1 non-node-set argument
+ CHECK_XPATH_FAIL("local-name(1)");
+
+ // local-name with 1 node-set argument
+ CHECK_XPATH_STRING(n, "local-name(c1)", "c1");
+ CHECK_XPATH_STRING(n, "local-name(c2/node())", "child");
+ CHECK_XPATH_STRING(n, "local-name(c2/attribute::node())", "attr");
+ CHECK_XPATH_STRING(n, "local-name(c1/node())", "");
+ CHECK_XPATH_STRING(n, "local-name(c4/node())", "target");
+ CHECK_XPATH_STRING(n, "local-name(c1/following-sibling::node())", "c2");
+ CHECK_XPATH_STRING(n, "local-name(c4/preceding-sibling::node())", "c1");
+
+ // local-name with 2 arguments
+ CHECK_XPATH_FAIL("local-name(c1, c2)");
+}
+
+TEST_XML_FLAGS(xpath_nodeset_namespace_uri, "<node xmlns:foo='http://foo'><c1>text</c1><c2 xmlns:foo='http://foo2' foo:attr='value'><foo:child/></c2><c3 xmlns='http://def' attr='value'><child/></c3><c4><?target stuff?></c4><c5><foo:child/></c5></node>", parse_default | parse_pi)
+{
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ // namespace-uri with 0 arguments
+ CHECK_XPATH_STRING(c, "namespace-uri()", "");
+ CHECK_XPATH_STRING(n.child("c2").child("foo:child"), "namespace-uri()", "http://foo2");
+
+ // namespace-uri with 1 non-node-set argument
+ CHECK_XPATH_FAIL("namespace-uri(1)");
+
+ // namespace-uri with 1 node-set argument
+ CHECK_XPATH_STRING(n, "namespace-uri(c1)", "");
+ CHECK_XPATH_STRING(n, "namespace-uri(c5/child::node())", "http://foo");
+ CHECK_XPATH_STRING(n, "namespace-uri(c2/attribute::node())", "http://foo2");
+ CHECK_XPATH_STRING(n, "namespace-uri(c2/child::node())", "http://foo2");
+ CHECK_XPATH_STRING(n, "namespace-uri(c1/child::node())", "");
+ CHECK_XPATH_STRING(n, "namespace-uri(c4/child::node())", "");
+ CHECK_XPATH_STRING(n, "namespace-uri(c3)", "http://def");
+ CHECK_XPATH_STRING(n, "namespace-uri(c3/@attr)", ""); // the namespace name for an unprefixed attribute name always has no value (Namespaces in XML 1.0)
+ CHECK_XPATH_STRING(n, "namespace-uri(c3/child::node())", "http://def");
+
+ // namespace-uri with 2 arguments
+ CHECK_XPATH_FAIL("namespace-uri(c1, c2)");
+}
+
+TEST_XML_FLAGS(xpath_nodeset_name, "<node xmlns:foo='http://foo'><c1>text</c1><c2 xmlns:foo='http://foo2' foo:attr='value'><foo:child/></c2><c3 xmlns='http://def' attr='value'><child/></c3><c4><?target stuff?></c4></node>", parse_default | parse_pi)
+{
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ // name with 0 arguments
+ CHECK_XPATH_STRING(c, "name()", "");
+ CHECK_XPATH_STRING(n, "name()", "node");
+
+ // name with 1 non-node-set argument
+ CHECK_XPATH_FAIL("name(1)");
+
+ // name with 1 node-set argument
+ CHECK_XPATH_STRING(n, "name(c1)", "c1");
+ CHECK_XPATH_STRING(n, "name(c2/node())", "foo:child");
+ CHECK_XPATH_STRING(n, "name(c2/attribute::node())", "foo:attr");
+ CHECK_XPATH_STRING(n, "name(c1/node())", "");
+ CHECK_XPATH_STRING(n, "name(c4/node())", "target");
+ CHECK_XPATH_STRING(n, "name(c1/following-sibling::node())", "c2");
+ CHECK_XPATH_STRING(n, "name(c4/preceding-sibling::node())", "c1");
+
+ // name with 2 arguments
+ CHECK_XPATH_FAIL("name(c1, c2)");
+}
+
TEST(xpath_function_arguments)
{
xml_node c;
@@ -572,4 +684,20 @@ TEST(xpath_function_arguments) CHECK_XPATH_FAIL("substring(1 2)");
}
+TEST_XML_FLAGS(xpath_string_value, "<node><c1>pcdata</c1><c2><child/></c2><c3 attr='avalue'/><c4><?target pivalue?></c4><c5><!--comment--></c5><c6><![CDATA[cdata]]></c6></node>", parse_default | parse_pi | parse_comments)
+{
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_STRING(c, "string()", "");
+ CHECK_XPATH_STRING(doc, "string()", "pcdatacdata");
+ CHECK_XPATH_STRING(n, "string()", "pcdatacdata");
+ CHECK_XPATH_STRING(n, "string(c1/node())", "pcdata");
+ CHECK_XPATH_STRING(n, "string(c2/node())", "");
+ CHECK_XPATH_STRING(n, "string(c3/@attr)", "avalue");
+ CHECK_XPATH_STRING(n, "string(c4/node())", "pivalue");
+ CHECK_XPATH_STRING(n, "string(c5/node())", "comment");
+ CHECK_XPATH_STRING(n, "string(c6/node())", "cdata");
+}
+
#endif
diff --git a/tests/test_xpath_parse.cpp b/tests/test_xpath_parse.cpp index 6d9a4e7..5eb23b8 100644 --- a/tests/test_xpath_parse.cpp +++ b/tests/test_xpath_parse.cpp @@ -29,10 +29,14 @@ TEST(xpath_number_parse) TEST(xpath_number_error)
{
- xml_node c;
CHECK_XPATH_FAIL("123a");
CHECK_XPATH_FAIL("123.a");
CHECK_XPATH_FAIL(".123a");
}
+TEST(xpath_variables)
+{
+ CHECK_XPATH_FAIL("$var"); // not implemented
+}
+
#endif
diff --git a/tests/test_xpath_paths.cpp b/tests/test_xpath_paths.cpp index 31704df..e44045d 100644 --- a/tests/test_xpath_paths.cpp +++ b/tests/test_xpath_paths.cpp @@ -136,6 +136,13 @@ TEST_XML(xpath_paths_axes_attribute, "<node attr1='value' attr2='value'><child a CHECK_XPATH_NODESET(n.child("another"), "attribute:: node()"); // namespace nodes are not attributes
}
+TEST_XML(xpath_paths_axes_namespace, "<node xmlns:foo='bar'/>")
+{
+ xml_node n = doc.child("node");
+
+ CHECK_XPATH_NODESET(n, "namespace:: node()"); // namespace nodes are not supported
+}
+
TEST_XML(xpath_paths_axes_self, "<node attr='value'><child attr='value'><subchild/></child><another><subchild/></another><last/></node>")
{
doc.precompute_document_order();
|