summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-05-29 12:59:26 +0000
committerarseny.kapoulkine <arseny.kapoulkine@99668b35-9821-0410-8761-19e4c4f06640>2010-05-29 12:59:26 +0000
commit64fc9478af7e83fbf0671d34ed29ed455a279082 (patch)
tree227fecd8a2e72cb864219743f600d1d4cdb512db
parentc3f4423e98f6fa506dfd163c2b53a1404476e93f (diff)
tests: Added more ceiling/round tests, added first batch of Xalan tests
git-svn-id: http://pugixml.googlecode.com/svn/trunk@460 99668b35-9821-0410-8761-19e4c4f06640
-rw-r--r--tests/test_xpath_functions.cpp20
-rw-r--r--tests/test_xpath_xalan_1.cpp398
2 files changed, 418 insertions, 0 deletions
diff --git a/tests/test_xpath_functions.cpp b/tests/test_xpath_functions.cpp
index 6713a89..5fc61fc 100644
--- a/tests/test_xpath_functions.cpp
+++ b/tests/test_xpath_functions.cpp
@@ -71,6 +71,7 @@ TEST(xpath_number_floor)
CHECK_XPATH_FAIL(STR("floor()"));
// floor with 1 argument
+ CHECK_XPATH_NUMBER(c, STR("floor(0)"), 0);
CHECK_XPATH_NUMBER(c, STR("floor(1.2)"), 1);
CHECK_XPATH_NUMBER(c, STR("floor(1)"), 1);
CHECK_XPATH_NUMBER(c, STR("floor(-1.2)"), -2);
@@ -90,6 +91,7 @@ TEST(xpath_number_ceiling)
CHECK_XPATH_FAIL(STR("ceiling()"));
// ceiling with 1 argument
+ CHECK_XPATH_NUMBER(c, STR("ceiling(0)"), 0);
CHECK_XPATH_NUMBER(c, STR("ceiling(1.2)"), 2);
CHECK_XPATH_NUMBER(c, STR("ceiling(1)"), 1);
CHECK_XPATH_NUMBER(c, STR("ceiling(-1.2)"), -1);
@@ -99,6 +101,11 @@ TEST(xpath_number_ceiling)
// ceiling with 2 arguments
CHECK_XPATH_FAIL(STR("ceiling(1, 2)"));
+
+ // ceiling with argument in range (-1, -0] should result in minus zero
+ CHECK_XPATH_STRING(c, STR("string(1 div ceiling(0))"), STR("Infinity"));
+ CHECK_XPATH_STRING(c, STR("string(1 div ceiling(-0))"), STR("-Infinity"));
+ CHECK_XPATH_STRING(c, STR("string(1 div ceiling(-0.1))"), STR("-Infinity"));
}
TEST(xpath_number_round)
@@ -122,6 +129,15 @@ TEST(xpath_number_round)
// round with 2 arguments
CHECK_XPATH_FAIL(STR("round(1, 2)"));
+
+ // round with argument in range [-0.5, -0] should result in minus zero
+ CHECK_XPATH_STRING(c, STR("string(1 div round(0))"), STR("Infinity"));
+
+#if 0 // $$$ commented out temporarily because round is not compliant yet
+ CHECK_XPATH_STRING(c, STR("string(1 div round(-0.5))"), STR("-Infinity"));
+ CHECK_XPATH_STRING(c, STR("string(1 div round(-0))"), STR("-Infinity"));
+ CHECK_XPATH_STRING(c, STR("string(1 div round(-0.1))"), STR("-Infinity"));
+#endif
}
TEST_XML(xpath_boolean_boolean, "<node />")
@@ -239,7 +255,9 @@ TEST_XML(xpath_string_string, "<node>123<child id='1'>789</child><child><![CDATA
CHECK_XPATH_STRING(c, STR("string(0)"), STR("0"));
CHECK_XPATH_STRING(c, STR("string(-0)"), STR("0"));
CHECK_XPATH_STRING(c, STR("string(1 div 0)"), STR("Infinity"));
+ CHECK_XPATH_STRING(c, STR("string(-1 div -0)"), STR("Infinity"));
CHECK_XPATH_STRING(c, STR("string(-1 div 0)"), STR("-Infinity"));
+ CHECK_XPATH_STRING(c, STR("string(1 div -0)"), STR("-Infinity"));
CHECK_XPATH_STRING(c, STR("string(1234567)"), STR("1234567"));
CHECK_XPATH_STRING(c, STR("string(-1234567)"), STR("-1234567"));
CHECK_XPATH_STRING(c, STR("string(1234.5678)"), STR("1234.5678"));
@@ -281,6 +299,7 @@ TEST(xpath_string_concat)
CHECK_XPATH_STRING(c, STR("concat('a', 'b', 'c', 'd', 'e')"), STR("abcde"));
CHECK_XPATH_STRING(c, STR("concat('a', 'b', 'c', 'd', 'e', 'f')"), STR("abcdef"));
CHECK_XPATH_STRING(c, STR("concat('a', 'b', 'c', 'd', 'e', 'f', 'g')"), STR("abcdefg"));
+ CHECK_XPATH_STRING(c, STR("concat(1, 2, 3, 4, 5, 6, 7, 8)"), STR("12345678"));
}
TEST(xpath_string_starts_with)
@@ -405,6 +424,7 @@ TEST(xpath_string_substring)
CHECK_XPATH_STRING(c, STR("substring('abcd', 0 div 0)"), STR(""));
CHECK_XPATH_STRING(c, STR("substring('', 1)"), STR(""));
CHECK_XPATH_STRING(c, STR("substring('', 0)"), STR(""));
+ CHECK_XPATH_STRING(c, STR("substring(substring('internalexternalcorrect substring',9),9)"), STR("correct substring"));
// substring with 3 arguments
CHECK_XPATH_STRING(c, STR("substring('abcd', 2, 1)"), STR("b"));
diff --git a/tests/test_xpath_xalan_1.cpp b/tests/test_xpath_xalan_1.cpp
new file mode 100644
index 0000000..c1d2733
--- /dev/null
+++ b/tests/test_xpath_xalan_1.cpp
@@ -0,0 +1,398 @@
+#ifndef PUGIXML_NO_XPATH
+
+#include "common.hpp"
+
+TEST(xpath_xalan_boolean_1)
+{
+ xml_node c;
+
+ CHECK_XPATH_BOOLEAN(c, STR("true()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("true() and true()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("true() or true()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(true())"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("boolean('')"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("1>2"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("1>=2"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("false()"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("1=1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1=2"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("1 = 1.00"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("0 = -0"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1 = '001'"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("true()='0'"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("false()=''"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("true()=2"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("false()=0"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("false() and false()"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("'foo' and 'fop'"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("true() and false()"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("false() and true()"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("'1' and '0'"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("true() or false()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("false() or true()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("false() or false()"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("0 or ''"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("not(false())"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(false() = false())"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("not(true() = false())"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not('')"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not('0')"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("boolean('0')"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("boolean(0)"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("boolean(-0)"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("boolean(1)"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("boolean(1 div 0)"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("boolean(0 div 0)"), false);
+}
+
+TEST_XML(xpath_xalan_boolean_2, "<doc/>")
+{
+ CHECK_XPATH_BOOLEAN(doc, STR("boolean(doc)"), true);
+ CHECK_XPATH_BOOLEAN(doc, STR("boolean(foo)"), false);
+}
+
+TEST(xpath_xalan_boolean_3)
+{
+ xml_node c;
+
+ CHECK_XPATH_BOOLEAN(c, STR("1>1"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("2>1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1<2"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1<1"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("2<1"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("'2'>'1'"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("0 > -0"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("2>=2"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("2>=1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1<=2"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1<=1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("2<=1"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("false() and 1 div 0"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("true() or 1 div 0"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1!=1"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("1!=2"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1!=1.00"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("false()!=true()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("true()!=false()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("false()!=false()"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("'ace' != 'ace'"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("'ace' != 'abc'"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("'H' != ' H'"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("'H' != 'H '"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1.9999999 < 2.0"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("2.0000001 < 2.0"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("1.9999999 < 2"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("2 < 2.0"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("'001' = 1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("0=false()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("'0'=true()"), true);
+}
+
+TEST_XML(xpath_xalan_boolean_4, "<avj><a>foo</a><b>bar</b><c>foobar</c><d>foo</d></avj>")
+{
+ CHECK_XPATH_BOOLEAN(doc, STR("avj/*='foo'"), true);
+ CHECK_XPATH_BOOLEAN(doc, STR("not(avj/*='foo')"), false);
+ CHECK_XPATH_BOOLEAN(doc, STR("avj/*!='foo'"), true);
+ CHECK_XPATH_BOOLEAN(doc, STR("not(avj/*!='foo')"), false);
+
+ CHECK_XPATH_BOOLEAN(doc, STR("avj/k='foo'"), false);
+ CHECK_XPATH_BOOLEAN(doc, STR("not(avj/k='foo')"), true);
+ CHECK_XPATH_BOOLEAN(doc, STR("avj/k!='foo'"), false);
+ CHECK_XPATH_BOOLEAN(doc, STR("not(avj/k!='foo')"), true);
+}
+
+TEST_XML(xpath_xalan_boolean_5, "<doc><j l='12' w='33'>first</j><j l='17' w='45'>second</j><j l='16' w='78'>third</j><j l='12' w='33'>fourth</j></doc>")
+{
+ xml_node c = doc.child("doc");
+
+ CHECK_XPATH_BOOLEAN(c, STR("j[@l='12'] = j[@w='33']"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("j[@l='12'] = j[@l='17']"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("j[@l='12'] = j[.='first' or @w='45']"), true);
+
+ CHECK_XPATH_BOOLEAN(c, STR("j[@l='12'] != j[@w='33']"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("j[@l='12'] != j[@l='17']"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("j[@l='12'] != j[.='first' or @w='45']"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("j[@l='16'] != j[@w='78']"), false);
+}
+
+TEST_XML(xpath_xalan_boolean_6, "<doc><avj><good><b>12</b><c>34</c><d>56</d><e>78</e></good></avj></doc>")
+{
+ xml_node c = doc.child("doc");
+
+ CHECK_XPATH_BOOLEAN(c, STR("avj/good/*=34"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(avj/good/*=34)"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("avj/good/*!=34"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(avj/good/*!=34)"), false);
+
+ CHECK_XPATH_BOOLEAN(c, STR("34=avj/good/*"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(34=avj/good/*)"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("34!=avj/good/*"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(34!=avj/good/*)"), false);
+}
+
+TEST_XML(xpath_xalan_boolean_7, "<doc><avj><bool><b>true</b><c></c><d>false?</d><e>1</e><f>0</f></bool></avj></doc>")
+{
+ xml_node c = doc.child("doc");
+
+ CHECK_XPATH_BOOLEAN(c, STR("avj/bool/*=true()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(avj/bool/*=true())"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("avj/bool/*!=true()"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("not(avj/bool/*!=true())"), true);
+
+ CHECK_XPATH_BOOLEAN(c, STR("true()=avj/bool/*"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(true()=avj/bool/*)"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("true()!=avj/bool/*"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("not(true()!=avj/bool/*)"), true);
+
+ CHECK_XPATH_BOOLEAN(c, STR("avj/none/*=true()"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("not(avj/none/*=true())"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("avj/none/*!=true()"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(avj/none/*!=true())"), false);
+
+ CHECK_XPATH_BOOLEAN(c, STR("true()=avj/none/*"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("not(true()=avj/none/*)"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("true()!=avj/none/*"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("not(true()!=avj/none/*)"), false);
+}
+
+TEST_XML(xpath_xalan_conditional, "<letters>b</letters>")
+{
+ xml_node c;
+
+ CHECK_XPATH_BOOLEAN(c, STR("(round(3.7) > 3)"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("2 > 1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("9 mod 3 = 0"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("'a'='a'"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("2+2=4"), true);
+
+ xml_node b = doc.child("letters").first_child();
+
+ CHECK_XPATH_BOOLEAN(b, STR(".='b'"), true);
+ CHECK_XPATH_BOOLEAN(b, STR("name(..)='letters'"), true);
+}
+
+TEST_XML(xpath_xalan_math_1, "<a>3</a>")
+{
+ xml_node c;
+
+ CHECK_XPATH_NUMBER(c, STR("number('1')"), 1);
+ CHECK_XPATH_NUMBER(c, STR("floor(0.0)"), 0);
+ CHECK_XPATH_NUMBER(c, STR("ceiling(0.0)"), 0);
+ CHECK_XPATH_NUMBER(c, STR("round(0.0)"), 0);
+ CHECK_XPATH_NUMBER(c, STR("2*3"), 6);
+ CHECK_XPATH_NUMBER(c, STR("3+6"), 9);
+ CHECK_XPATH_NUMBER(c, STR("3-1"), 2);
+ CHECK_XPATH_NUMBER_NAN(doc, STR("a-1")); // a-1 is a name test, not arithmetic expression
+ CHECK_XPATH_NUMBER(doc, STR("a -1"), 2);
+ CHECK_XPATH_NUMBER(c, STR("6 div 2"), 3);
+ CHECK_XPATH_NUMBER(c, STR("5 mod 2"), 1);
+ CHECK_XPATH_NUMBER_NAN(c, STR("number(n)"));
+ CHECK_XPATH_NUMBER(c, STR("number(2)"), 2);
+ CHECK_XPATH_NUMBER(c, STR("number('3')"), 3);
+ CHECK_XPATH_NUMBER_NAN(c, STR("number('')"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("number('abc')"));
+ CHECK_XPATH_BOOLEAN(c, STR("number(string(1.0))=1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("number(true())=1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("number(false())=0"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("number('xxx')=number('xxx')"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("number('xxx')=0"), false);
+ CHECK_XPATH_NUMBER(doc, STR("floor(a)"), 3);
+ CHECK_XPATH_NUMBER(c, STR("floor(1.9)"), 1);
+ CHECK_XPATH_NUMBER(c, STR("floor(2.999999)"), 2);
+ CHECK_XPATH_NUMBER(c, STR("floor(-1.5)"), -2);
+ CHECK_XPATH_BOOLEAN(c, STR("floor(1)=1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("floor(1.9)=1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("floor(-1.5)=-2"), true);
+ CHECK_XPATH_NUMBER(doc, STR("ceiling(a)"), 3);
+ CHECK_XPATH_NUMBER(c, STR("ceiling(1.54)"), 2);
+ CHECK_XPATH_NUMBER(c, STR("ceiling(2.999999)"), 3);
+ CHECK_XPATH_NUMBER(c, STR("ceiling(3.000001)"), 4);
+ CHECK_XPATH_BOOLEAN(c, STR("ceiling(1)=1"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("ceiling(1.1)=2"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("ceiling(-1.5)=-1"), true);
+}
+
+TEST_XML(xpath_xalan_math_2, "<a>3</a>")
+{
+ xml_node c;
+
+ CHECK_XPATH_NUMBER(doc, STR("round(a)"), 3);
+ CHECK_XPATH_NUMBER(c, STR("round(1.24)"), 1);
+ CHECK_XPATH_NUMBER(c, STR("round(2.999999)"), 3);
+ CHECK_XPATH_NUMBER(c, STR("round(3.000001)"), 3);
+ CHECK_XPATH_NUMBER(c, STR("round(1.1)"), 1);
+ CHECK_XPATH_NUMBER(c, STR("round(-1.1)"), -1);
+ CHECK_XPATH_NUMBER(c, STR("round(1.9)"), 2);
+ CHECK_XPATH_NUMBER(c, STR("round(-1.9)"), -2);
+ CHECK_XPATH_NUMBER(c, STR("round(1.5)"), 2);
+ CHECK_XPATH_NUMBER(c, STR("round(-1.5)"), -1);
+ CHECK_XPATH_NUMBER(c, STR("round(1.4999999)"), 1);
+ CHECK_XPATH_NUMBER(c, STR("round(-1.4999999)"), -1);
+ CHECK_XPATH_NUMBER(c, STR("round(1.5000001)"), 2);
+ CHECK_XPATH_NUMBER(c, STR("round(-1.5000001)"), -2);
+}
+
+TEST_XML(xpath_xalan_math_3, "<doc><n v='1'/><n>2</n><n v='3'/><n>4</n><n v='5'>5</n><e>17</e><e>-5</e><e>8</e><e>-37</e></doc>")
+{
+ CHECK_XPATH_NUMBER(doc, STR("sum(doc/x)"), 0);
+ CHECK_XPATH_NUMBER_NAN(doc, STR("sum(doc/n)"));
+ CHECK_XPATH_NUMBER(doc, STR("sum(doc/n[text()])"), 11);
+ CHECK_XPATH_NUMBER(doc, STR("sum(doc/n/@v)"), 9);
+ CHECK_XPATH_NUMBER(doc, STR("sum(doc/e)"), -17);
+}
+
+TEST_XML(xpath_xalan_math_4, "<doc><n1 a='1'>2</n1><n2 a='2'>3</n2><n1-n2>123</n1-n2><n-1>72</n-1><n-2>12</n-2><div a='2'>5</div><mod a='5'>2</mod></doc>")
+{
+ xml_node c = doc.child("doc");
+
+ CHECK_XPATH_NUMBER(c, STR("n1*n2"), 6);
+ CHECK_XPATH_NUMBER(c, STR("n1/@a*n2/@a"), 2);
+ CHECK_XPATH_NUMBER(c, STR("(n1/@a)*(n2/@a)"), 2);
+ CHECK_XPATH_NUMBER(c, STR("n1+n2"), 5);
+ CHECK_XPATH_NUMBER(c, STR("n1/@a+n2/@a"), 3);
+ CHECK_XPATH_NUMBER(c, STR("(n1/@a)+(n2/@a)"), 3);
+ CHECK_XPATH_NUMBER(c, STR("1-2"), -1);
+ CHECK_XPATH_NUMBER(c, STR("n1 - n2"), -1);
+ CHECK_XPATH_NUMBER(c, STR("n1-n2"), 123);
+ CHECK_XPATH_NUMBER(c, STR("n-1 - n-2"), 60);
+ CHECK_XPATH_NUMBER(c, STR("n-1 -n-2"), 60);
+ CHECK_XPATH_NUMBER(c, STR("7+-3"), 4);
+ CHECK_XPATH_NUMBER(c, STR("n-1+-n-2"), 60);
+ CHECK_XPATH_NUMBER(c, STR("7 - -3"), 10);
+ CHECK_XPATH_NUMBER(c, STR("n-1 - -n-2"), 84);
+ CHECK_XPATH_NUMBER(c, STR("-7 --3"), -4);
+ CHECK_XPATH_NUMBER(c, STR("-n-1 --n-2"), -60);
+
+ CHECK_XPATH_FAIL(STR("+7"));
+ CHECK_XPATH_FAIL(STR("7++3"));
+ CHECK_XPATH_FAIL(STR("7-+3"));
+
+ CHECK_XPATH_NUMBER(c, STR("6 div -2"), -3);
+ CHECK_XPATH_NUMBER(c, STR("n1 div n2"), 2.0 / 3.0);
+ CHECK_XPATH_NUMBER(c, STR("div div mod"), 2.5);
+ CHECK_XPATH_NUMBER(c, STR("div/@a div mod/@a"), 0.4);
+
+ CHECK_XPATH_BOOLEAN(c, STR("1 div -0 = 2 div -0"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("1 div -0 = 1 div 0"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("1 div -0 = -1 div 0"), true);
+ CHECK_XPATH_BOOLEAN(c, STR("0 div 0 >= 0"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("0 div 0 < 0"), false);
+
+ CHECK_XPATH_NUMBER(c, STR("n1 mod n2"), 2);
+ CHECK_XPATH_NUMBER(c, STR("div mod mod"), 1);
+ CHECK_XPATH_NUMBER(c, STR("div/@a mod mod/@a"), 2);
+
+ CHECK_XPATH_BOOLEAN(c, STR("(5 mod 2 = 1) and (5 mod -2 = 1) and (-5 mod 2 = -1) and (-5 mod -2 = -1)"), true);
+}
+
+TEST(xpath_xalan_math_5)
+{
+ xml_node c;
+
+ CHECK_XPATH_NUMBER(c, STR("(((((('3'+5)*(3)+((('2')+2)*('1' - 6)))-('4' - '2'))+(-(4-6)))))"), 4);
+ CHECK_XPATH_NUMBER(c, STR("1*1*2*2*2*3*3*1*1*1*0.5*0.5"), 18);
+ CHECK_XPATH_NUMBER(c, STR("1440 div 2 div 2 div 6"), 60);
+ CHECK_XPATH_NUMBER(c, STR("1440 div 2 div 2 div 6 div 10"), 6);
+ CHECK_XPATH_NUMBER(c, STR("1440 div 2 div 2 div 6 div 10 div 3"), 2);
+ CHECK_XPATH_NUMBER(c, STR("(1*2*3*4*5*6)div 2 div 6 div 10 div 3"), 2);
+ CHECK_XPATH_NUMBER_NAN(c, STR("(2 + number('xxx'))"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("2 * -number('xxx')"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("2 - number('xxx')"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("number('xxx') - 3"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("2 div number('xxx')"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("number('xxx') div 3"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("2 mod number('xxx')"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("number('xxx') mod 3"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("floor(number('xxx'))"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("ceiling(number('xxx'))"));
+ CHECK_XPATH_NUMBER_NAN(c, STR("round(number('xxx'))"));
+ CHECK_XPATH_NUMBER(c, STR("10+5+25+20+15+50+35+40"), 200);
+ CHECK_XPATH_NUMBER(c, STR("100-9-7-4-17-18-5"), 40);
+ CHECK_XPATH_NUMBER(c, STR("3*2+5*4-4*2-1"), 17);
+ CHECK_XPATH_NUMBER(c, STR("6*5-8*2+5*2"), 24);
+ CHECK_XPATH_NUMBER(c, STR("10*5-4*2+6*1 -3*3"), 39);
+
+ CHECK_XPATH_NUMBER(c, STR("(24 div 3 +2) div (40 div 8 -3)"), 5);
+ CHECK_XPATH_NUMBER(c, STR("80 div 2 + 12 div 2 - 4 div 2"), 44);
+ CHECK_XPATH_NUMBER(c, STR("70 div 10 - 18 div 6 + 10 div 2"), 9);
+
+ CHECK_XPATH_NUMBER(c, STR("48 mod 17 - 2 mod 9 + 13 mod 5"), 15);
+ CHECK_XPATH_NUMBER(c, STR("56 mod round(5*2+1.444) - 6 mod 4 + 7 mod 4"), 2);
+ CHECK_XPATH_NUMBER(c, STR("(77 mod 10 + 5 mod 8) mod 10"), 2);
+}
+
+TEST_XML(xpath_xalan_math_6, "<doc><n1>3</n1><n2>7</n2><n3>x</n3></doc>")
+{
+ xml_node c = doc.child("doc");
+
+ CHECK_XPATH_NUMBER(c, STR("-(n1|n2)"), -3);
+ CHECK_XPATH_NUMBER(c, STR("-(n2|n1)"), -3);
+ CHECK_XPATH_BOOLEAN(c, STR("contains(number(n1), 'NaN')"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("contains(number(n3), 'NaN')"), true);
+}
+
+TEST_XML(xpath_xalan_math_7, "<doc><n1>3</n1><n2>7</n2><n3>x</n3></doc>")
+{
+ xml_node c = doc.child("doc");
+
+ CHECK_XPATH_NUMBER(c, STR("-(n1|n2)"), -3);
+ CHECK_XPATH_NUMBER(c, STR("-(n2|n1)"), -3);
+ CHECK_XPATH_BOOLEAN(c, STR("contains(number(n1), 'NaN')"), false);
+ CHECK_XPATH_BOOLEAN(c, STR("contains(number(n3), 'NaN')"), true);
+}
+
+TEST_XML(xpath_xalan_math_8, "<k>0.0004</k>")
+{
+ CHECK_XPATH_NUMBER(doc, STR("number(1.75)"), 1.75);
+ CHECK_XPATH_NUMBER(doc, STR("number(7 div 4)"), 1.75);
+ CHECK_XPATH_BOOLEAN(doc, STR("(number(1.75) = (7 div 4))"), true);
+ CHECK_XPATH_NUMBER(doc, STR("number(0.109375 * 16)"), 1.75);
+ CHECK_XPATH_BOOLEAN(doc, STR("(number(1.75) = (0.109375 * 16))"), true);
+ CHECK_XPATH_NUMBER(doc, STR("number(k)"), 0.0004);
+ CHECK_XPATH_NUMBER(doc, STR("number(4 div 10000)"), 0.0004);
+ CHECK_XPATH_BOOLEAN(doc, STR("(number(k) = (4 div 10000))"), true);
+ CHECK_XPATH_NUMBER(doc, STR("number(0.0001 * 4)"), 0.0004);
+ CHECK_XPATH_BOOLEAN(doc, STR("(number(k) = (0.0001 * 4))"), true);
+}
+
+TEST(xpath_xalan_math_9)
+{
+ xml_node c;
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.0'))"), STR("0"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.0'))"), STR("0"));
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.4'))"), STR("0.4"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.4'))"), STR("-0.4"));
+
+ CHECK_XPATH_STRING(c, STR("string(number('4.0'))"), STR("4"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('4.0'))"), STR("-4"));
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.04'))"), STR("0.04"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.04'))"), STR("-0.04"));
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.004'))"), STR("0.004"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.004'))"), STR("-0.004"));
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.0004'))"), STR("0.0004"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.0004'))"), STR("-0.0004"));
+
+#if 0 // $$$ commented out temporarily because number formatting is not compliant yet
+ CHECK_XPATH_STRING(c, STR("string(number('0.0000000000001'))"), STR("0.0000000000001"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.0000000000001'))"), STR("-0.0000000000001"));
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.0000000000000000000000000001'))"), STR("0.0000000000000000000000000001"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.0000000000000000000000000001'))"), STR("-0.0000000000000000000000000001"));
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.0000000000001000000000000001'))"), STR("0.0000000000001000000000000001"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.0000000000001000000000000001'))"), STR("-0.0000000000001000000000000001"));
+#endif
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.0012'))"), STR("0.0012"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.0012'))"), STR("-0.0012"));
+
+ CHECK_XPATH_STRING(c, STR("string(number('0.012'))"), STR("0.012"));
+ CHECK_XPATH_STRING(c, STR("string(-1 * number('0.012'))"), STR("-0.012"));
+}
+
+#endif