From 7d24b9b5655d584b6dc8b89df7cbd58d2e940a81 Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Mon, 19 Jul 2010 09:57:32 +0000 Subject: Set svn:eol-style to native for all text files git-svn-id: http://pugixml.googlecode.com/svn/trunk@607 99668b35-9821-0410-8761-19e4c4f06640 --- tests/test_xpath_xalan_1.cpp | 814 +++++++++++++++++++++---------------------- 1 file changed, 407 insertions(+), 407 deletions(-) (limited to 'tests/test_xpath_xalan_1.cpp') diff --git a/tests/test_xpath_xalan_1.cpp b/tests/test_xpath_xalan_1.cpp index 7be711f..b862b1e 100644 --- a/tests/test_xpath_xalan_1.cpp +++ b/tests/test_xpath_xalan_1.cpp @@ -1,407 +1,407 @@ -#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, "") -{ - 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, "foobarfoobarfoo") -{ - 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, "firstsecondthirdfourth") -{ - xml_node c = doc.child(STR("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, "12345678") -{ - xml_node c = doc.child(STR("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, "truefalse?10") -{ - xml_node c = doc.child(STR("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, "b") -{ - 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(STR("letters")).first_child(); - - CHECK_XPATH_BOOLEAN(b, STR(".='b'"), true); - CHECK_XPATH_BOOLEAN(b, STR("name(..)='letters'"), true); -} - -TEST_XML(xpath_xalan_math_1, "3") -{ - 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); - -#ifndef MSVC6_NAN_BUG - CHECK_XPATH_BOOLEAN(c, STR("number('xxx')=number('xxx')"), false); - CHECK_XPATH_BOOLEAN(c, STR("number('xxx')=0"), false); -#endif - - 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, "3") -{ - 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, "24517-58-37") -{ - 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, "231237212
5
2
") -{ - xml_node c = doc.child(STR("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); - -#ifndef MSVC6_NAN_BUG - CHECK_XPATH_BOOLEAN(c, STR("0 div 0 >= 0"), false); - CHECK_XPATH_BOOLEAN(c, STR("0 div 0 < 0"), false); -#endif - - 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")); - -#ifndef __BORLANDC__ // BCC fmod does not propagate NaN correctly - CHECK_XPATH_NUMBER_NAN(c, STR("2 mod number('xxx')")); - CHECK_XPATH_NUMBER_NAN(c, STR("number('xxx') mod 3")); -#endif - - 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, "37x") -{ - xml_node c = doc.child(STR("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, "37x") -{ - xml_node c = doc.child(STR("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, "0.0004") -{ - 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")); - - 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")); - - 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 +#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, "") +{ + 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, "foobarfoobarfoo") +{ + 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, "firstsecondthirdfourth") +{ + xml_node c = doc.child(STR("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, "12345678") +{ + xml_node c = doc.child(STR("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, "truefalse?10") +{ + xml_node c = doc.child(STR("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, "b") +{ + 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(STR("letters")).first_child(); + + CHECK_XPATH_BOOLEAN(b, STR(".='b'"), true); + CHECK_XPATH_BOOLEAN(b, STR("name(..)='letters'"), true); +} + +TEST_XML(xpath_xalan_math_1, "3") +{ + 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); + +#ifndef MSVC6_NAN_BUG + CHECK_XPATH_BOOLEAN(c, STR("number('xxx')=number('xxx')"), false); + CHECK_XPATH_BOOLEAN(c, STR("number('xxx')=0"), false); +#endif + + 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, "3") +{ + 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, "24517-58-37") +{ + 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, "231237212
5
2
") +{ + xml_node c = doc.child(STR("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); + +#ifndef MSVC6_NAN_BUG + CHECK_XPATH_BOOLEAN(c, STR("0 div 0 >= 0"), false); + CHECK_XPATH_BOOLEAN(c, STR("0 div 0 < 0"), false); +#endif + + 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")); + +#ifndef __BORLANDC__ // BCC fmod does not propagate NaN correctly + CHECK_XPATH_NUMBER_NAN(c, STR("2 mod number('xxx')")); + CHECK_XPATH_NUMBER_NAN(c, STR("number('xxx') mod 3")); +#endif + + 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, "37x") +{ + xml_node c = doc.child(STR("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, "37x") +{ + xml_node c = doc.child(STR("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, "0.0004") +{ + 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")); + + 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")); + + 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 -- cgit v1.2.3