summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/test_document.cpp4
-rw-r--r--tests/test_dom_modify.cpp13
-rw-r--r--tests/test_xpath_operators.cpp48
-rw-r--r--tests/test_xpath_paths.cpp2
4 files changed, 67 insertions, 0 deletions
diff --git a/tests/test_document.cpp b/tests/test_document.cpp
index 2cc39a6..2774a07 100644
--- a/tests/test_document.cpp
+++ b/tests/test_document.cpp
@@ -301,6 +301,10 @@ TEST(document_load_file_error)
CHECK(doc.load_file("filedoesnotexist").status == status_file_not_found);
+#ifndef _WIN32
+ CHECK(doc.load_file("/dev/tty").status == status_io_error);
+#endif
+
test_runner::_memory_fail_threshold = 1;
CHECK(doc.load_file("tests/data/small.xml").status == status_out_of_memory);
}
diff --git a/tests/test_dom_modify.cpp b/tests/test_dom_modify.cpp
index 07fe6dc..45cf3ea 100644
--- a/tests/test_dom_modify.cpp
+++ b/tests/test_dom_modify.cpp
@@ -1091,6 +1091,19 @@ TEST_XML(dom_node_append_buffer_fragment, "<node />")
CHECK_NODE(doc, STR("<node>1234</node>"));
}
+TEST_XML(dom_node_append_buffer_empty, "<node />")
+{
+ xml_node node = doc.child(STR("node"));
+
+ CHECK(node.append_buffer("", 0).status == status_no_document_element);
+ CHECK(node.append_buffer("", 0, parse_fragment).status == status_ok);
+
+ CHECK(node.append_buffer(0, 0).status == status_no_document_element);
+ CHECK(node.append_buffer(0, 0, parse_fragment).status == status_ok);
+
+ CHECK_NODE(doc, STR("<node />"));
+}
+
TEST_XML(dom_node_prepend_move, "<node>foo<child/></node>")
{
xml_node child = doc.child(STR("node")).child(STR("child"));
diff --git a/tests/test_xpath_operators.cpp b/tests/test_xpath_operators.cpp
index c028224..57e3755 100644
--- a/tests/test_xpath_operators.cpp
+++ b/tests/test_xpath_operators.cpp
@@ -481,4 +481,52 @@ TEST(xpath_operators_associativity_arithmetic)
CHECK_XPATH_NUMBER(c, STR("1-1+1"), 1);
}
+TEST(xpath_operators_mod)
+{
+ // Check that mod operator conforms to Java spec (since this is the only concrete source of information about XPath mod)
+ xml_node c;
+
+ // Basic tests from spec
+ CHECK_XPATH_NUMBER(c, STR("5 mod 3"), 2);
+ CHECK_XPATH_NUMBER(c, STR("5 mod -3"), 2);
+ CHECK_XPATH_NUMBER(c, STR("-5 mod 3"), -2);
+ CHECK_XPATH_NUMBER(c, STR("-5 mod -3"), -2);
+
+ // If either operand is NaN, the result is NaN
+ CHECK_XPATH_NUMBER_NAN(c, STR("(0 div 0) mod 3"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("3 mod (0 div 0)"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("(0 div 0) mod (0 div 0)"));
+
+ // If the dividend is an infinity, or the divisor is a zero, or both, the result is NaN
+ CHECK_XPATH_NUMBER_NAN(c, STR("(1 div 0) mod 3"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("(1 div 0) mod -3"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("(-1 div 0) mod 3"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("1 mod 0"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("-1 mod 0"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("(1 div 0) mod 0"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("(-1 div 0) mod 0"));
+
+ // If the dividend is finite and the divisor is an infinity, the result equals the dividend
+ CHECK_XPATH_NUMBER(c, STR("1 mod (1 div 0)"), 1);
+ CHECK_XPATH_NUMBER(c, STR("1 mod (-1 div 0)"), 1);
+ CHECK_XPATH_NUMBER(c, STR("-1 mod (1 div 0)"), -1);
+ CHECK_XPATH_NUMBER(c, STR("0 mod (1 div 0)"), 0);
+ CHECK_XPATH_NUMBER(c, STR("0 mod (-1 div 0)"), 0);
+ CHECK_XPATH_NUMBER(c, STR("100000 mod (1 div 0)"), 100000);
+
+ // If the dividend is a zero and the divisor is finite, the result equals the dividend.
+ CHECK_XPATH_NUMBER(c, STR("0 mod 1000000"), 0);
+ CHECK_XPATH_NUMBER(c, STR("0 mod -1000000"), 0);
+
+ // In the remaining cases ... the floating-point remainder r from the division of a dividend n by a divisor d
+ // is defined by the mathematical relation r = n - (d * q) where q is an integer that is negative only if n/d is
+ // negative and positive only if n/d is positive, and whose magnitude is as large as possible without exceeding the magnitude of the true
+ // mathematical quotient of n and d.
+ CHECK_XPATH_NUMBER(c, STR("9007199254740991 mod 2"), 1);
+ CHECK_XPATH_NUMBER(c, STR("9007199254740991 mod 3"), 1);
+ CHECK_XPATH_NUMBER(c, STR("18446744073709551615 mod 2"), 0);
+ CHECK_XPATH_NUMBER(c, STR("18446744073709551615 mod 3"), 1);
+ CHECK_XPATH_NUMBER(c, STR("115792089237316195423570985008687907853269984665640564039457584007913129639935 mod 2"), 0);
+ CHECK_XPATH_NUMBER(c, STR("115792089237316195423570985008687907853269984665640564039457584007913129639935 mod 3"), 1);
+}
#endif
diff --git a/tests/test_xpath_paths.cpp b/tests/test_xpath_paths.cpp
index df0dfa4..e51a395 100644
--- a/tests/test_xpath_paths.cpp
+++ b/tests/test_xpath_paths.cpp
@@ -664,6 +664,8 @@ TEST_XML(xpath_paths_optimize_step_once, "<node><para1><para2/><para3/><para4><p
CHECK_XPATH_BOOLEAN(doc, STR("//para5/ancestor-or-self::*"), true);
CHECK_XPATH_BOOLEAN(doc, STR("//para5/ancestor::*"), true);
+
+ CHECK_XPATH_BOOLEAN(doc, STR("//@attr5/ancestor-or-self::node()"), true);
}
TEST_XML(xpath_paths_null_nodeset_entries, "<node attr='value'/>")