From e11a81455afb36f59d2ec08ca7ccd4c56d0691a6 Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Sun, 11 Oct 2009 06:49:30 +0000 Subject: tests: Added more node/attribute tests git-svn-id: http://pugixml.googlecode.com/svn/trunk@142 99668b35-9821-0410-8761-19e4c4f06640 --- tests/test.hpp | 14 +++- tests/test_dom_traverse.cpp | 195 +++++++++++++++++++++++++++++++++++++++++++- tests/test_xpath.cpp | 19 +++++ 3 files changed, 222 insertions(+), 6 deletions(-) create mode 100644 tests/test_xpath.cpp diff --git a/tests/test.hpp b/tests/test.hpp index 6b8878e..fa4ef1d 100644 --- a/tests/test.hpp +++ b/tests/test.hpp @@ -2,12 +2,18 @@ #define HEADER_TEST_HPP #include +#include inline bool test_string_equal(const char* lhs, const char* rhs) { return (!lhs || !rhs) ? lhs == rhs : strcmp(lhs, rhs) == 0; } +template inline bool test_node_name_value(const Node& node, const char* name, const char* value) +{ + return test_string_equal(node.name(), name) && test_string_equal(node.value(), value); +} + struct test_runner { test_runner(const char* name) @@ -48,20 +54,24 @@ struct dummy_fixture {}; #define TEST(name) TEST_FIXTURE(name, dummy_fixture) -#define TEST_XML(name, xml) \ +#define TEST_XML_FLAGS(name, xml, flags) \ struct test_fixture_##name \ { \ pugi::xml_document doc; \ \ test_fixture_##name() \ { \ - CHECK(doc.load(xml)); \ + CHECK(doc.load(xml, flags)); \ } \ }; \ \ TEST_FIXTURE(name, test_fixture_##name) +#define TEST_XML(name, xml) TEST_XML_FLAGS(name, xml, pugi::parse_default) + #define CHECK(condition) if (condition) ; else throw #condition " is false" #define CHECK_STRING(value, expected) if (test_string_equal(value, expected)) ; else throw #value " is not equal to " #expected +#define CHECK_DOUBLE(value, expected) if (fabs(value - expected) < 1e-6) ; else throw #value " is not equal to " #expected +#define CHECK_NAME_VALUE(node, name, value) if (test_node_name_value(node, name, value)) ; else throw #node " name/value do not match " #name " and " #value #endif diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp index d48cf74..8a7f6eb 100644 --- a/tests/test_dom_traverse.cpp +++ b/tests/test_dom_traverse.cpp @@ -2,6 +2,12 @@ #include +template I move_iter(I base, int n) +{ + std::advance(base, n); + return base; +} + template void generic_bool_ops_test(const T& obj) { T null; @@ -118,11 +124,103 @@ TEST_XML(dom_attr_name_value, "") { xml_attribute attr = doc.child("node").attribute("attr"); - CHECK_STRING(attr.name(), "attr"); - CHECK_STRING(attr.value(), "1"); + CHECK_NAME_VALUE(attr, "attr", "1"); + CHECK_NAME_VALUE(xml_attribute(), "", ""); +} + +TEST_XML(dom_attr_as_int, "") +{ + xml_node node = doc.child("node"); + + CHECK(node.attribute("attr1").as_int() == 1); + CHECK(node.attribute("attr2").as_int() == -1); + CHECK(node.attribute("attr3").as_int() == -2147483647 - 1); + CHECK(node.attribute("attr4").as_int() == 2147483647); +} + +TEST_XML(dom_attr_as_uint, "") +{ + xml_node node = doc.child("node"); + + CHECK(node.attribute("attr1").as_int() == 0); + CHECK(node.attribute("attr2").as_int() == 1); + CHECK(node.attribute("attr3").as_int() == 2147483647); +} + +TEST_XML(dom_attr_as_float, "") +{ + xml_node node = doc.child("node"); + + CHECK_DOUBLE(node.attribute("attr1").as_float(), 0); + CHECK_DOUBLE(node.attribute("attr2").as_float(), 1); + CHECK_DOUBLE(node.attribute("attr3").as_float(), 0.12); + CHECK_DOUBLE(node.attribute("attr4").as_float(), -5.1); + CHECK_DOUBLE(node.attribute("attr5").as_float(), 3e-4); + CHECK_DOUBLE(node.attribute("attr6").as_float(), 3.14159265358979323846); +} + +TEST_XML(dom_attr_as_double, "") +{ + xml_node node = doc.child("node"); + + CHECK_DOUBLE(node.attribute("attr1").as_double(), 0); + CHECK_DOUBLE(node.attribute("attr2").as_double(), 1); + CHECK_DOUBLE(node.attribute("attr3").as_double(), 0.12); + CHECK_DOUBLE(node.attribute("attr4").as_double(), -5.1); + CHECK_DOUBLE(node.attribute("attr5").as_double(), 3e-4); + CHECK_DOUBLE(node.attribute("attr6").as_double(), 3.14159265358979323846); +} + +TEST_XML(dom_attr_as_bool, "") +{ + xml_node node = doc.child("node"); + + CHECK(!node.attribute("attr1").as_bool()); + CHECK(node.attribute("attr2").as_bool()); + CHECK(node.attribute("attr3").as_bool()); + CHECK(node.attribute("attr4").as_bool()); + CHECK(node.attribute("attr5").as_bool()); + CHECK(node.attribute("attr6").as_bool()); + CHECK(!node.attribute("attr7").as_bool()); +} + +TEST_XML(dom_attr_iterator, "") +{ + xml_node node1 = doc.child("node").child("node1"); + xml_node node2 = doc.child("node").child("node2"); + xml_node node3 = doc.child("node").child("node3"); + + CHECK(xml_node().attributes_begin() == xml_attribute_iterator()); + CHECK(xml_node().attributes_end() == xml_attribute_iterator()); + + CHECK(node1.attributes_begin() == xml_attribute_iterator(node1.attribute("attr1"))); + CHECK(move_iter(node1.attributes_begin(), 1) == node1.attributes_end()); + CHECK(move_iter(node1.attributes_end(), -1) == node1.attributes_begin()); + CHECK(*node1.attributes_begin() == node1.attribute("attr1")); + CHECK_STRING(node1.attributes_begin()->name(), "attr1"); + + CHECK(move_iter(node2.attributes_begin(), 2) == node2.attributes_end()); + CHECK(move_iter(node2.attributes_end(), -2) == node2.attributes_begin()); + + CHECK(node3.attributes_begin() == xml_attribute_iterator()); + CHECK(node3.attributes_begin() == node3.attributes_end()); + + xml_attribute_iterator it = node2.attribute("attr2"); + xml_attribute_iterator itt = it; + + CHECK(itt++ == it); + CHECK(itt == node2.attributes_end()); + + CHECK(itt-- == node2.attributes_end()); + CHECK(itt == it); + + CHECK(++itt == node2.attributes_end()); + CHECK(itt == node2.attributes_end()); - CHECK_STRING(xml_attribute().name(), ""); - CHECK_STRING(xml_attribute().value(), ""); + CHECK(--itt == it); + CHECK(itt == it); + + CHECK(++itt != it); } TEST_XML(dom_node_bool_ops, "") @@ -139,3 +237,92 @@ TEST_XML(dom_node_empty, "") { generic_empty_test(doc.child("node")); } + +TEST_XML(dom_node_iterator, "") +{ + xml_node node1 = doc.child("node").child("node1"); + xml_node node2 = doc.child("node").child("node2"); + xml_node node3 = doc.child("node").child("node3"); + + CHECK(xml_node().begin() == xml_node_iterator()); + CHECK(xml_node().end() == xml_node_iterator()); + + CHECK(node1.begin() == xml_node_iterator(node1.child("child1"))); + CHECK(move_iter(node1.begin(), 1) == node1.end()); + CHECK(move_iter(node1.end(), -1) == node1.begin()); + CHECK(*node1.begin() == node1.child("child1")); + CHECK_STRING(node1.begin()->name(), "child1"); + + CHECK(move_iter(node2.begin(), 2) == node2.end()); + CHECK(move_iter(node2.end(), -2) == node2.begin()); + + CHECK(node3.begin() == xml_node_iterator()); + CHECK(node3.begin() == node3.end()); + + xml_node_iterator it = node2.child("child2"); + xml_node_iterator itt = it; + + CHECK(itt++ == it); + CHECK(itt == node2.end()); + + CHECK(itt-- == node2.end()); + CHECK(itt == it); + + CHECK(++itt == node2.end()); + CHECK(itt == node2.end()); + + CHECK(--itt == it); + CHECK(itt == it); + + CHECK(++itt != it); +} + +TEST_XML(dom_node_parent, "") +{ + CHECK(xml_node().parent() == xml_node()); + CHECK(doc.child("node").child("child").parent() == doc.child("node")); + CHECK(doc.child("node").parent() == doc); +} + +TEST_XML(dom_node_root, "") +{ + CHECK(xml_node().root() == xml_node()); + CHECK(doc.child("node").child("child").root() == doc); + CHECK(doc.child("node").root() == doc); +} + +TEST_XML_FLAGS(dom_node_type, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration) +{ + CHECK(xml_node().type() == node_null); + CHECK(doc.type() == node_document); + + xml_node_iterator it = doc.begin(); + + CHECK((it++)->type() == node_declaration); + CHECK((it++)->type() == node_pi); + CHECK((it++)->type() == node_comment); + CHECK((it++)->type() == node_element); + + xml_node_iterator cit = doc.child("node").begin(); + + CHECK((cit++)->type() == node_pcdata); + CHECK((cit++)->type() == node_cdata); +} + +TEST_XML_FLAGS(dom_node_name_value, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration) +{ + CHECK_NAME_VALUE(xml_node(), "", ""); + CHECK_NAME_VALUE(doc, "", ""); + + xml_node_iterator it = doc.begin(); + + CHECK_NAME_VALUE(*it++, "xml", ""); + CHECK_NAME_VALUE(*it++, "pi", ""); + CHECK_NAME_VALUE(*it++, "", "comment"); + CHECK_NAME_VALUE(*it++, "node", ""); + + xml_node_iterator cit = doc.child("node").begin(); + + CHECK_NAME_VALUE(*cit++, "", "pcdata"); + CHECK_NAME_VALUE(*cit++, "", "cdata"); +} diff --git a/tests/test_xpath.cpp b/tests/test_xpath.cpp new file mode 100644 index 0000000..b3ace66 --- /dev/null +++ b/tests/test_xpath.cpp @@ -0,0 +1,19 @@ +#include "common.hpp" + +TEST_XML(xpath_document_order, "test") +{ + CHECK(xml_node().document_order() == 0); + CHECK(doc.child("node").document_order() == 0); + CHECK(doc.document_order() == 0); + + doc.precompute_document_order(); + + CHECK(doc.document_order() == 1); + CHECK(doc.child("node").document_order() == 2); + CHECK(doc.child("node").child("child1").document_order() == 3); + CHECK(doc.child("node").child("child1").attribute("attr1").document_order() == 4); + CHECK(doc.child("node").child("child1").attribute("attr2").document_order() == 5); + CHECK(doc.child("node").child("child2").document_order() == 6); + CHECK(doc.child("node").child("child2").attribute("attr1").document_order() == 7); + CHECK(doc.child("node").child("child2").first_child().document_order() == 8); +} -- cgit v1.2.3