summaryrefslogtreecommitdiff
path: root/tests/test_xpath_operators.cpp
diff options
context:
space:
mode:
authorarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2009-10-28 07:40:15 +0000
committerarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2009-10-28 07:40:15 +0000
commit83183769c1125b3aa489205dd880bf94830831bd (patch)
tree1fd6fa4666f9796d6be1a5bf382b5777bc2fe39c /tests/test_xpath_operators.cpp
parent3472d0272c8353a7aa6d583651a79dd5db50803f (diff)
tests: Added function arguments tests, added arithmetic operators tests
git-svn-id: http://pugixml.googlecode.com/svn/trunk@181 99668b35-9821-0410-8761-19e4c4f06640
Diffstat (limited to 'tests/test_xpath_operators.cpp')
-rw-r--r--tests/test_xpath_operators.cpp65
1 files changed, 65 insertions, 0 deletions
diff --git a/tests/test_xpath_operators.cpp b/tests/test_xpath_operators.cpp
new file mode 100644
index 0000000..41005d4
--- /dev/null
+++ b/tests/test_xpath_operators.cpp
@@ -0,0 +1,65 @@
+#include "common.hpp"
+
+TEST_XML(xpath_operators_arithmetic, "<node><foo-bar>10</foo-bar><foo>2</foo><bar>3</bar></node>")
+{
+ xml_node c;
+ xml_node n = doc.child("node");
+
+ // incorrect unary operator
+ CHECK_XPATH_FAIL("-");
+
+ // correct unary operator
+ CHECK_XPATH_NUMBER(c, "-1", -1);
+ CHECK_XPATH_NUMBER(c, "--1", 1);
+ CHECK_XPATH_NUMBER(c, "---1", -1);
+
+ // incorrect binary operators
+ CHECK_XPATH_FAIL("5+");
+ CHECK_XPATH_FAIL("5-");
+ CHECK_XPATH_FAIL("5*");
+ CHECK_XPATH_FAIL("+5");
+ CHECK_XPATH_FAIL("*5");
+ CHECK_XPATH_FAIL("1div2");
+ CHECK_XPATH_FAIL("1mod");
+ CHECK_XPATH_FAIL("1div");
+
+ // correct trivial binary operators
+ CHECK_XPATH_NUMBER(c, "1 + 2", 3);
+ CHECK_XPATH_NUMBER(c, "1+2", 3);
+ CHECK_XPATH_NUMBER(c, "1 * 2", 2);
+ CHECK_XPATH_NUMBER(c, "1*2", 2);
+ CHECK_XPATH_NUMBER(c, "1 div 2", 0.5);
+
+ // operator precedence
+ CHECK_XPATH_NUMBER(c, "2 + 2 * 2 div 1 mod 3", 3);
+ CHECK_XPATH_NUMBER(c, "2 + 2 * 2 div (1 mod 3)", 6);
+ CHECK_XPATH_NUMBER(c, "(2 + 2) * 2 div (1 mod 3)", 8);
+ CHECK_XPATH_NUMBER(c, "(2 + 2) * (2 div 1) mod 3", 2);
+ CHECK_XPATH_NUMBER(c, "2 - -2", 4);
+ CHECK_XPATH_NUMBER(c, "2--2", 4);
+ CHECK_XPATH_NUMBER(c, "1-2-3", -4);
+
+ // infinity/nan
+ CHECK_XPATH_STRING(c, "1 div 0", "Infinity");
+ CHECK_XPATH_STRING(c, "-1 div 0", "-Infinity");
+ CHECK_XPATH_STRING(c, "-1 div 0 + 1 div 0", "NaN");
+ CHECK_XPATH_STRING(c, "0 div 0", "NaN");
+ CHECK_XPATH_STRING(c, "1 div 0 + 1 div 0", "Infinity");
+ CHECK_XPATH_STRING(c, "-1 div 0 + -1 div 0", "-Infinity");
+ CHECK_XPATH_STRING(c, "1 div 0 + 100", "Infinity");
+ CHECK_XPATH_STRING(c, "-1 div 0 + 100", "-Infinity");
+ CHECK_XPATH_STRING(c, "0 div 0 + 100", "NaN");
+
+ // mod, from W3C standard
+ CHECK_XPATH_NUMBER(c, "5 mod 2", 1);
+ CHECK_XPATH_NUMBER(c, "5 mod -2", 1);
+ CHECK_XPATH_NUMBER(c, "-5 mod 2", -1);
+ CHECK_XPATH_NUMBER(c, "-5 mod -2", -1);
+
+ // correct subtraction parsing, from W3C standard
+ CHECK_XPATH_NUMBER(n, "foo-bar", 10);
+ CHECK_XPATH_NUMBER(n, "foo -bar", -1);
+ CHECK_XPATH_NUMBER(n, "foo - bar", -1);
+ CHECK_XPATH_NUMBER(n, "-foo-bar", -10);
+ CHECK_XPATH_NUMBER(n, "-foo -bar", -5);
+}