From f481f038d64a3d0a1db1a3ae9a13be6a4bb18a7d Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Sun, 29 Aug 2010 15:37:29 +0000 Subject: tests: Added XPath variable and variable set tests git-svn-id: http://pugixml.googlecode.com/svn/trunk@679 99668b35-9821-0410-8761-19e4c4f06640 --- tests/test.cpp | 17 ++-- tests/test.hpp | 2 + tests/test_xpath_variables.cpp | 191 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 203 insertions(+), 7 deletions(-) create mode 100644 tests/test_xpath_variables.cpp (limited to 'tests') diff --git a/tests/test.cpp b/tests/test.cpp index 43c6b22..9091f14 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -60,6 +60,15 @@ bool test_node(const pugi::xml_node& node, const pugi::char_t* contents, const p return writer.as_string() == contents; } +bool test_double_nan(double value) +{ +#if defined(_MSC_VER) || defined(__BORLANDC__) + return _isnan(value) != 0; +#else + return value != value; +#endif +} + #ifndef PUGIXML_NO_XPATH bool test_xpath_string(const pugi::xpath_node& node, const pugi::char_t* query, const pugi::char_t* expected) { @@ -99,13 +108,7 @@ bool test_xpath_number_nan(const pugi::xpath_node& node, const pugi::char_t* que { pugi::xpath_query q(query); - double r = q.evaluate_number(node); - -#if defined(_MSC_VER) || defined(__BORLANDC__) - return _isnan(r) != 0; -#else - return r != r; -#endif + return test_double_nan(q.evaluate_number(node)); } bool test_xpath_fail_compile(const pugi::char_t* query) diff --git a/tests/test.hpp b/tests/test.hpp index 4127697..37f78c8 100644 --- a/tests/test.hpp +++ b/tests/test.hpp @@ -35,6 +35,7 @@ template inline bool test_node_name_value(const Node& node, cons } bool test_node(const pugi::xml_node& node, const pugi::char_t* contents, const pugi::char_t* indent, unsigned int flags); +bool test_double_nan(double value); #ifndef PUGIXML_NO_XPATH bool test_xpath_string(const pugi::xpath_node& node, const pugi::char_t* query, const pugi::char_t* expected); @@ -116,6 +117,7 @@ struct dummy_fixture {}; #define CHECK(condition) CHECK_TEXT(condition, STRINGIZE(condition) " is false") #define CHECK_STRING(value, expected) CHECK_TEXT(test_string_equal(value, expected), STRINGIZE(value) " is not equal to " STRINGIZE(expected)) #define CHECK_DOUBLE(value, expected) CHECK_TEXT((value > expected ? value - expected : expected - value) < 1e-6, STRINGIZE(value) " is not equal to " STRINGIZE(expected)) +#define CHECK_DOUBLE_NAN(value) CHECK_TEXT(test_double_nan(value), STRINGIZE(value) " is not equal to NaN") #define CHECK_NAME_VALUE(node, name, value) CHECK_TEXT(test_node_name_value(node, name, value), STRINGIZE(node) " name/value do not match " STRINGIZE(name) " and " STRINGIZE(value)) #define CHECK_NODE_EX(node, expected, indent, flags) CHECK_TEXT(test_node(node, expected, indent, flags), STRINGIZE(node) " contents does not match " STRINGIZE(expected)) #define CHECK_NODE(node, expected) CHECK_NODE_EX(node, expected, PUGIXML_TEXT(""), pugi::format_raw) diff --git a/tests/test_xpath_variables.cpp b/tests/test_xpath_variables.cpp new file mode 100644 index 0000000..77ca53f --- /dev/null +++ b/tests/test_xpath_variables.cpp @@ -0,0 +1,191 @@ +#ifndef PUGIXML_NO_XPATH + +#include "common.hpp" + +TEST(xpath_variables_type_none) +{ + xpath_variable_set set; + + xpath_variable* var = set.add(STR("target"), xpath_type_none); + CHECK(!var); +} + +TEST(xpath_variables_type_boolean) +{ + xpath_variable_set set; + + xpath_variable* var = set.add(STR("target"), xpath_type_boolean); + CHECK(var); + + CHECK(var->type() == xpath_type_boolean); + CHECK_STRING(var->name(), STR("target")); + + CHECK(var->get_boolean() == false); + CHECK_DOUBLE_NAN(var->get_number()); + CHECK_STRING(var->get_string(), STR("")); + CHECK(var->get_node_set().empty()); + + CHECK(var->set(true)); + CHECK(!var->set(1.0)); + CHECK(!var->set(STR("abc"))); + CHECK(!var->set(xpath_node_set())); + + CHECK(var->get_boolean() == true); + CHECK_DOUBLE_NAN(var->get_number()); + CHECK_STRING(var->get_string(), STR("")); + CHECK(var->get_node_set().empty()); +} + +TEST(xpath_variables_type_number) +{ + xpath_variable_set set; + + xpath_variable* var = set.add(STR("target"), xpath_type_number); + CHECK(var); + + CHECK(var->type() == xpath_type_number); + CHECK_STRING(var->name(), STR("target")); + + CHECK(var->get_boolean() == false); + CHECK_DOUBLE(var->get_number(), 0); + CHECK_STRING(var->get_string(), STR("")); + CHECK(var->get_node_set().empty()); + + CHECK(!var->set(true)); + CHECK(var->set(1.0)); + CHECK(!var->set(STR("abc"))); + CHECK(!var->set(xpath_node_set())); + + CHECK(var->get_boolean() == false); + CHECK_DOUBLE(var->get_number(), 1); + CHECK_STRING(var->get_string(), STR("")); + CHECK(var->get_node_set().empty()); +} + +TEST(xpath_variables_type_string) +{ + xpath_variable_set set; + + xpath_variable* var = set.add(STR("target"), xpath_type_string); + CHECK(var); + + CHECK(var->type() == xpath_type_string); + CHECK_STRING(var->name(), STR("target")); + + CHECK(var->get_boolean() == false); + CHECK_DOUBLE_NAN(var->get_number()); + CHECK_STRING(var->get_string(), STR("")); + CHECK(var->get_node_set().empty()); + + CHECK(!var->set(true)); + CHECK(!var->set(1.0)); + CHECK(var->set(STR("abc"))); + CHECK(!var->set(xpath_node_set())); + + CHECK(var->get_boolean() == false); + CHECK_DOUBLE_NAN(var->get_number()); + CHECK_STRING(var->get_string(), STR("abc")); + CHECK(var->get_node_set().empty()); +} + +TEST_XML(xpath_variables_type_node_set, "") +{ + xpath_variable_set set; + + xpath_variable* var = set.add(STR("target"), xpath_type_node_set); + CHECK(var); + + CHECK(var->type() == xpath_type_node_set); + CHECK_STRING(var->name(), STR("target")); + + CHECK(var->get_boolean() == false); + CHECK_DOUBLE_NAN(var->get_number()); + CHECK_STRING(var->get_string(), STR("")); + CHECK(var->get_node_set().empty()); + + CHECK(!var->set(true)); + CHECK(!var->set(1.0)); + CHECK(!var->set(STR("abc"))); + CHECK(var->set(doc.select_nodes(STR("*")))); + + CHECK(var->get_boolean() == false); + CHECK_DOUBLE_NAN(var->get_number()); + CHECK_STRING(var->get_string(), STR("")); + CHECK(var->get_node_set().size() == 1 && var->get_node_set()[0] == doc.first_child()); +} + +TEST(xpath_variables_set_operations) +{ + xpath_variable_set set; + + xpath_variable* v1 = set.add(STR("var1"), xpath_type_number); + CHECK(v1); + + xpath_variable* v2 = set.add(STR("var2"), xpath_type_string); + CHECK(v2); + + CHECK(v1 != v2); + + CHECK(set.add(STR("var1"), xpath_type_number) == v1); + CHECK(set.add(STR("var2"), xpath_type_string) == v2); + CHECK(set.add(STR("var2"), xpath_type_node_set) == 0); + + CHECK(set.get(STR("var1")) == v1); + CHECK(set.get(STR("var2")) == v2); + CHECK(set.get(STR("var")) == 0); + CHECK(set.get(STR("var11")) == 0); + + CHECK(static_cast(set).get(STR("var1")) == v1); + CHECK(static_cast(set).get(STR("var3")) == 0); +} + +TEST_XML(xpath_variables_set_operations_set, "") +{ + xpath_variable_set set; + + xpath_variable* v1 = set.add(STR("var1"), xpath_type_number); + CHECK(v1); + + xpath_variable* v2 = set.add(STR("var2"), xpath_type_string); + CHECK(v2); + + CHECK(set.set(STR("var1"), 1.0)); + CHECK_DOUBLE(v1->get_number(), 1.0); + + CHECK(set.set(STR("var2"), STR("value"))); + CHECK_STRING(v2->get_string(), STR("value")); + + CHECK(!set.set(STR("var1"), true)); + + CHECK(set.set(STR("var3"), doc.select_nodes(STR("*")))); + + xpath_variable* v3 = set.get(STR("var3")); + + CHECK(v3); + CHECK(v3->type() == xpath_type_node_set); + CHECK(v3->get_node_set().size() == 1); +} + +TEST(xpath_variables_set_out_of_memory) +{ + test_runner::_memory_fail_threshold = 1; + + xpath_variable_set set; + + xpath_variable* var = set.add(STR("target"), xpath_type_number); + CHECK(!var); +} + +TEST(xpath_variable_out_of_memory) +{ + test_runner::_memory_fail_threshold = 64; + + xpath_variable_set set; + + xpath_variable* var = set.add(STR("target"), xpath_type_string); + CHECK(var); + + CHECK(!var->set(STR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"))); +} + +#endif -- cgit v1.2.3