From 83183769c1125b3aa489205dd880bf94830831bd Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Wed, 28 Oct 2009 07:40:15 +0000 Subject: tests: Added function arguments tests, added arithmetic operators tests git-svn-id: http://pugixml.googlecode.com/svn/trunk@181 99668b35-9821-0410-8761-19e4c4f06640 --- tests/test_xpath_functions.cpp | 32 ++++++++++++++++++--- tests/test_xpath_operators.cpp | 65 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 4 deletions(-) create mode 100644 tests/test_xpath_operators.cpp (limited to 'tests') diff --git a/tests/test_xpath_functions.cpp b/tests/test_xpath_functions.cpp index 67aa949..0a2b605 100644 --- a/tests/test_xpath_functions.cpp +++ b/tests/test_xpath_functions.cpp @@ -116,10 +116,6 @@ TEST(xpath_number_round) // round with 2 arguments CHECK_XPATH_FAIL("round(1, 2)"); - - // round with negative zero results - // $$ CHECK_XPATH_NUMBER(c, "round(-0.3)", -0) - // $$ CHECK_XPATH_NUMBER(c, "round(-0)", -0) } TEST_XML(xpath_boolean_boolean, "") @@ -498,3 +494,31 @@ TEST(xpath_string_translate) // translate with 4 arguments CHECK_XPATH_FAIL("translate('a', 'b', 'c', 'd')"); } + +TEST(xpath_function_arguments) +{ + xml_node c; + + // conversion to string + CHECK_XPATH_NUMBER(c, "string-length(12)", 2); + + // conversion to number + CHECK_XPATH_NUMBER(c, "round('1.2')", 1); + CHECK_XPATH_NUMBER(c, "round('1.7')", 2); + + // conversion to boolean + CHECK_XPATH_BOOLEAN(c, "not('1')", false); + CHECK_XPATH_BOOLEAN(c, "not('')", true); + + // conversion to node set + CHECK_XPATH_FAIL("sum(1)"); + + // expression evaluation + CHECK_XPATH_NUMBER(c, "round((2 + 2 * 2) div 4)", 2); + + // empty expressions + CHECK_XPATH_FAIL("round(,)"); + CHECK_XPATH_FAIL("substring(,)"); + CHECK_XPATH_FAIL("substring('a',)"); + CHECK_XPATH_FAIL("substring(,'a')"); +} 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, "1023") +{ + 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); +} -- cgit v1.2.3