From 135ff898e2fd74f016f758d22cce22d183498b80 Mon Sep 17 00:00:00 2001 From: d-led Date: Tue, 2 Oct 2012 19:34:47 +0200 Subject: [PATCH] normalization with .gitattributes --- .gitattributes | 22 + docs/samples/save_declaration.cpp | 54 +- docs/samples/text.cpp | 70 +-- docs/samples/traverse_rangefor.cpp | 64 +- docs/samples/xpath_variables.cpp | 76 +-- scripts/pugixml_airplay.mkf | 26 +- tests/data/truncation.xml | 38 +- tests/test_dom_text.cpp | 504 ++++++++-------- tests/test_header_string_iostream.cpp | 10 +- tests/test_version.cpp | 10 +- tests/test_xpath_variables.cpp | 804 +++++++++++++------------- 11 files changed, 850 insertions(+), 828 deletions(-) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..412eeda --- /dev/null +++ b/.gitattributes @@ -0,0 +1,22 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp +*.sln merge=union +*.csproj merge=union +*.vbproj merge=union +*.fsproj merge=union +*.dbproj merge=union + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/docs/samples/save_declaration.cpp b/docs/samples/save_declaration.cpp index 6c82061..aaed9b5 100644 --- a/docs/samples/save_declaration.cpp +++ b/docs/samples/save_declaration.cpp @@ -1,27 +1,27 @@ -#include "pugixml.hpp" - -#include - -int main() -{ - //[code_save_declaration - // get a test document - pugi::xml_document doc; - doc.load("hey"); - - // add a custom declaration node - pugi::xml_node decl = doc.prepend_child(pugi::node_declaration); - decl.append_attribute("version") = "1.0"; - decl.append_attribute("encoding") = "UTF-8"; - decl.append_attribute("standalone") = "no"; - - // - // - // hey - // - doc.save(std::cout); - std::cout << std::endl; - //] -} - -// vim:et +#include "pugixml.hpp" + +#include + +int main() +{ + //[code_save_declaration + // get a test document + pugi::xml_document doc; + doc.load("hey"); + + // add a custom declaration node + pugi::xml_node decl = doc.prepend_child(pugi::node_declaration); + decl.append_attribute("version") = "1.0"; + decl.append_attribute("encoding") = "UTF-8"; + decl.append_attribute("standalone") = "no"; + + // + // + // hey + // + doc.save(std::cout); + std::cout << std::endl; + //] +} + +// vim:et diff --git a/docs/samples/text.cpp b/docs/samples/text.cpp index 9b1cf69..7e03709 100644 --- a/docs/samples/text.cpp +++ b/docs/samples/text.cpp @@ -1,35 +1,35 @@ -#include "pugixml.hpp" - -#include - -int main() -{ - pugi::xml_document doc; - - // get a test document - doc.load("test1.1yes"); - - pugi::xml_node project = doc.child("project"); - - //[code_text_access - std::cout << "Project name: " << project.child("name").text().get() << std::endl; - std::cout << "Project version: " << project.child("version").text().as_double() << std::endl; - std::cout << "Project visibility: " << (project.child("public").text().as_bool(/* def= */ true) ? "public" : "private") << std::endl; - std::cout << "Project description: " << project.child("description").text().get() << std::endl; - //] - - std::cout << std::endl; - - //[code_text_modify - // change project version - project.child("version").text() = 1.2; - - // add description element and set the contents - // note that we do not have to explicitly add the node_pcdata child - project.append_child("description").text().set("a test project"); - //] - - doc.save(std::cout); -} - -// vim:et +#include "pugixml.hpp" + +#include + +int main() +{ + pugi::xml_document doc; + + // get a test document + doc.load("test1.1yes"); + + pugi::xml_node project = doc.child("project"); + + //[code_text_access + std::cout << "Project name: " << project.child("name").text().get() << std::endl; + std::cout << "Project version: " << project.child("version").text().as_double() << std::endl; + std::cout << "Project visibility: " << (project.child("public").text().as_bool(/* def= */ true) ? "public" : "private") << std::endl; + std::cout << "Project description: " << project.child("description").text().get() << std::endl; + //] + + std::cout << std::endl; + + //[code_text_modify + // change project version + project.child("version").text() = 1.2; + + // add description element and set the contents + // note that we do not have to explicitly add the node_pcdata child + project.append_child("description").text().set("a test project"); + //] + + doc.save(std::cout); +} + +// vim:et diff --git a/docs/samples/traverse_rangefor.cpp b/docs/samples/traverse_rangefor.cpp index 1f7212e..a284b9e 100644 --- a/docs/samples/traverse_rangefor.cpp +++ b/docs/samples/traverse_rangefor.cpp @@ -1,32 +1,32 @@ -#include "pugixml.hpp" - -#include - -int main() -{ - pugi::xml_document doc; - if (!doc.load_file("xgconsole.xml")) return -1; - - pugi::xml_node tools = doc.child("Profile").child("Tools"); - - //[code_traverse_rangefor - for (pugi::xml_node tool: tools.children("Tool")) - { - std::cout << "Tool:"; - - for (pugi::xml_attribute attr: tool.attributes()) - { - std::cout << " " << attr.name() << "=" << attr.value(); - } - - for (pugi::xml_node child: tool.children()) - { - std::cout << ", child " << child.name(); - } - - std::cout << std::endl; - } - //] -} - -// vim:et +#include "pugixml.hpp" + +#include + +int main() +{ + pugi::xml_document doc; + if (!doc.load_file("xgconsole.xml")) return -1; + + pugi::xml_node tools = doc.child("Profile").child("Tools"); + + //[code_traverse_rangefor + for (pugi::xml_node tool: tools.children("Tool")) + { + std::cout << "Tool:"; + + for (pugi::xml_attribute attr: tool.attributes()) + { + std::cout << " " << attr.name() << "=" << attr.value(); + } + + for (pugi::xml_node child: tool.children()) + { + std::cout << ", child " << child.name(); + } + + std::cout << std::endl; + } + //] +} + +// vim:et diff --git a/docs/samples/xpath_variables.cpp b/docs/samples/xpath_variables.cpp index 5404c0b..c6e9c51 100644 --- a/docs/samples/xpath_variables.cpp +++ b/docs/samples/xpath_variables.cpp @@ -1,38 +1,38 @@ -#include "pugixml.hpp" - -#include -#include - -int main() -{ - pugi::xml_document doc; - if (!doc.load_file("xgconsole.xml")) return -1; - -//[code_xpath_variables - // Select nodes via compiled query - pugi::xpath_variable_set vars; - vars.add("remote", pugi::xpath_type_boolean); - - pugi::xpath_query query_remote_tools("/Profile/Tools/Tool[@AllowRemote = string($remote)]", &vars); - - vars.set("remote", true); - pugi::xpath_node_set tools_remote = query_remote_tools.evaluate_node_set(doc); - - vars.set("remote", false); - pugi::xpath_node_set tools_local = query_remote_tools.evaluate_node_set(doc); - - std::cout << "Remote tool: "; - tools_remote[2].node().print(std::cout); - - std::cout << "Local tool: "; - tools_local[0].node().print(std::cout); - - // You can pass the context directly to select_nodes/select_single_node - pugi::xpath_node_set tools_local_imm = doc.select_nodes("/Profile/Tools/Tool[@AllowRemote = string($remote)]", &vars); - - std::cout << "Local tool imm: "; - tools_local_imm[0].node().print(std::cout); -//] -} - -// vim:et +#include "pugixml.hpp" + +#include +#include + +int main() +{ + pugi::xml_document doc; + if (!doc.load_file("xgconsole.xml")) return -1; + +//[code_xpath_variables + // Select nodes via compiled query + pugi::xpath_variable_set vars; + vars.add("remote", pugi::xpath_type_boolean); + + pugi::xpath_query query_remote_tools("/Profile/Tools/Tool[@AllowRemote = string($remote)]", &vars); + + vars.set("remote", true); + pugi::xpath_node_set tools_remote = query_remote_tools.evaluate_node_set(doc); + + vars.set("remote", false); + pugi::xpath_node_set tools_local = query_remote_tools.evaluate_node_set(doc); + + std::cout << "Remote tool: "; + tools_remote[2].node().print(std::cout); + + std::cout << "Local tool: "; + tools_local[0].node().print(std::cout); + + // You can pass the context directly to select_nodes/select_single_node + pugi::xpath_node_set tools_local_imm = doc.select_nodes("/Profile/Tools/Tool[@AllowRemote = string($remote)]", &vars); + + std::cout << "Local tool imm: "; + tools_local_imm[0].node().print(std::cout); +//] +} + +// vim:et diff --git a/scripts/pugixml_airplay.mkf b/scripts/pugixml_airplay.mkf index 0ca5c23..477f54a 100644 --- a/scripts/pugixml_airplay.mkf +++ b/scripts/pugixml_airplay.mkf @@ -1,13 +1,13 @@ -includepaths -{ -"../src" -} - -files -{ -("../src") -pugiconfig.hpp -pugixml.cpp -pugixml.hpp -} - +includepaths +{ +"../src" +} + +files +{ +("../src") +pugiconfig.hpp +pugixml.cpp +pugixml.hpp +} + diff --git a/tests/data/truncation.xml b/tests/data/truncation.xml index 9cdbe13..266bc60 100644 --- a/tests/data/truncation.xml +++ b/tests/data/truncation.xml @@ -1,19 +1,19 @@ - - - - - - some text - - some more text - - - <æ+%è¯- å__å--="name" ä>·å__="value">ä¸-ç_æ_%å__å¤_è¯-è¨_ð¤-¢ - - - <æ°_å__> - <æ°_>å++ç"° - <å__>太é__ - - - + + + + + + some text + + some more text + + + <æ+%è¯- å__å--="name" ä>·å__="value">ä¸-ç_æ_%å__å¤_è¯-è¨_ð¤-¢ + + + <æ°_å__> + <æ°_>å++ç"° + <å__>太é__ + + + diff --git a/tests/test_dom_text.cpp b/tests/test_dom_text.cpp index 153c372..49f9744 100644 --- a/tests/test_dom_text.cpp +++ b/tests/test_dom_text.cpp @@ -1,252 +1,252 @@ -#include "common.hpp" - -#include "helpers.hpp" - -TEST_XML_FLAGS(dom_text_empty, "foo", parse_default | parse_pi) -{ - xml_node node = doc.child(STR("node")); - - CHECK(node.child(STR("a")).text()); - CHECK(node.child(STR("b")).text()); - CHECK(!node.child(STR("c")).text()); - CHECK(!node.child(STR("d")).text()); - CHECK(!xml_node().text()); - CHECK(!xml_text()); - - generic_empty_test(node.child(STR("a")).text()); -} - -TEST_XML(dom_text_bool_ops, "foo") -{ - generic_bool_ops_test(doc.child(STR("node")).text()); -} - -TEST_XML_FLAGS(dom_text_get, "foo", parse_default | parse_pi) -{ - xml_node node = doc.child(STR("node")); - - CHECK_STRING(node.child(STR("a")).text().get(), STR("foo")); - CHECK_STRING(node.child(STR("a")).first_child().text().get(), STR("foo")); - - CHECK_STRING(node.child(STR("b")).text().get(), STR("bar")); - CHECK_STRING(node.child(STR("b")).last_child().text().get(), STR("bar")); - - CHECK_STRING(node.child(STR("c")).text().get(), STR("")); - CHECK_STRING(node.child(STR("c")).first_child().text().get(), STR("")); - - CHECK_STRING(node.child(STR("d")).text().get(), STR("")); - - CHECK_STRING(xml_node().text().get(), STR("")); -} - -TEST_XML_FLAGS(dom_text_as_string, "foo", parse_default | parse_pi) -{ - xml_node node = doc.child(STR("node")); - - CHECK_STRING(node.child(STR("a")).text().as_string(), STR("foo")); - CHECK_STRING(node.child(STR("a")).first_child().text().as_string(), STR("foo")); - - CHECK_STRING(node.child(STR("b")).text().as_string(), STR("bar")); - CHECK_STRING(node.child(STR("b")).last_child().text().as_string(), STR("bar")); - - CHECK_STRING(node.child(STR("c")).text().as_string(), STR("")); - CHECK_STRING(node.child(STR("c")).first_child().text().as_string(), STR("")); - - CHECK_STRING(node.child(STR("d")).text().as_string(), STR("")); - - CHECK_STRING(xml_node().text().as_string(), STR("")); -} - -TEST_XML(dom_text_as_int, "1-1-21474836482147483647") -{ - xml_node node = doc.child(STR("node")); - - CHECK(xml_text().as_int() == 0); - CHECK(node.child(STR("text1")).text().as_int() == 1); - CHECK(node.child(STR("text2")).text().as_int() == -1); - CHECK(node.child(STR("text3")).text().as_int() == -2147483647 - 1); - CHECK(node.child(STR("text4")).text().as_int() == 2147483647); -} - -TEST_XML(dom_text_as_uint, "0121474836474294967295") -{ - xml_node node = doc.child(STR("node")); - - CHECK(xml_text().as_uint() == 0); - CHECK(node.child(STR("text1")).text().as_uint() == 0); - CHECK(node.child(STR("text2")).text().as_uint() == 1); - CHECK(node.child(STR("text3")).text().as_uint() == 2147483647); - CHECK(node.child(STR("text4")).text().as_uint() == 4294967295u); -} - -TEST_XML(dom_text_as_float, "010.12-5.13e-43.14159265358979323846") -{ - xml_node node = doc.child(STR("node")); - - CHECK(xml_text().as_float() == 0); - CHECK_DOUBLE(node.child(STR("text1")).text().as_float(), 0); - CHECK_DOUBLE(node.child(STR("text2")).text().as_float(), 1); - CHECK_DOUBLE(node.child(STR("text3")).text().as_float(), 0.12); - CHECK_DOUBLE(node.child(STR("text4")).text().as_float(), -5.1); - CHECK_DOUBLE(node.child(STR("text5")).text().as_float(), 3e-4); - CHECK_DOUBLE(node.child(STR("text6")).text().as_float(), 3.14159265358979323846); -} - -TEST_XML(dom_text_as_double, "010.12-5.13e-43.14159265358979323846") -{ - xml_node node = doc.child(STR("node")); - - CHECK(xml_text().as_double() == 0); - CHECK_DOUBLE(node.child(STR("text1")).text().as_double(), 0); - CHECK_DOUBLE(node.child(STR("text2")).text().as_double(), 1); - CHECK_DOUBLE(node.child(STR("text3")).text().as_double(), 0.12); - CHECK_DOUBLE(node.child(STR("text4")).text().as_double(), -5.1); - CHECK_DOUBLE(node.child(STR("text5")).text().as_double(), 3e-4); - CHECK_DOUBLE(node.child(STR("text6")).text().as_double(), 3.14159265358979323846); -} - -TEST_XML(dom_text_as_bool, "01trueTrueYesyesfalse") -{ - xml_node node = doc.child(STR("node")); - - CHECK(!xml_text().as_bool()); - CHECK(!node.child(STR("text1")).text().as_bool()); - CHECK(node.child(STR("text2")).text().as_bool()); - CHECK(node.child(STR("text3")).text().as_bool()); - CHECK(node.child(STR("text4")).text().as_bool()); - CHECK(node.child(STR("text5")).text().as_bool()); - CHECK(node.child(STR("text6")).text().as_bool()); - CHECK(!node.child(STR("text7")).text().as_bool()); -} - -TEST_XML(dom_text_get_no_state, "") -{ - xml_node node = doc.child(STR("node")); - xml_text t = node.text(); - - CHECK(!t); - CHECK(t.get() && *t.get() == 0); - CHECK(!node.first_child()); - - node.append_child(node_pcdata); - - CHECK(t); - CHECK_STRING(t.get(), STR("")); - - node.first_child().set_value(STR("test")); - - CHECK(t); - CHECK_STRING(t.get(), STR("test")); -} - -TEST_XML(dom_text_set, "") -{ - xml_node node = doc.child(STR("node")); - xml_text t = node.text(); - - t.set(STR("")); - CHECK(node.first_child().type() == node_pcdata); - CHECK_NODE(node, STR("")); - - t.set(STR("boo")); - CHECK(node.first_child().type() == node_pcdata); - CHECK(node.first_child() == node.last_child()); - CHECK_NODE(node, STR("boo")); - - t.set(STR("foobarfoobar")); - CHECK(node.first_child().type() == node_pcdata); - CHECK(node.first_child() == node.last_child()); - CHECK_NODE(node, STR("foobarfoobar")); -} - -TEST_XML(dom_text_assign, "") -{ - xml_node node = doc.child(STR("node")); - - node.append_child(STR("text1")).text() = STR("v1"); - xml_text() = STR("v1"); - - node.append_child(STR("text2")).text() = -2147483647; - node.append_child(STR("text3")).text() = -2147483647 - 1; - xml_text() = -2147483647 - 1; - - node.append_child(STR("text4")).text() = 4294967295u; - node.append_child(STR("text5")).text() = 4294967294u; - xml_text() = 2147483647; - - node.append_child(STR("text6")).text() = 0.5; - xml_text() = 0.5; - - node.append_child(STR("text7")).text() = true; - xml_text() = true; - - CHECK_NODE(node, STR("v1-2147483647-2147483648429496729542949672940.5true")); -} - -TEST_XML(dom_text_set_value, "") -{ - xml_node node = doc.child(STR("node")); - - CHECK(node.append_child(STR("text1")).text().set(STR("v1"))); - CHECK(!xml_text().set(STR("v1"))); - - CHECK(node.append_child(STR("text2")).text().set(-2147483647)); - CHECK(node.append_child(STR("text3")).text().set(-2147483647 - 1)); - CHECK(!xml_text().set(-2147483647 - 1)); - - CHECK(node.append_child(STR("text4")).text().set(4294967295u)); - CHECK(node.append_child(STR("text5")).text().set(4294967294u)); - CHECK(!xml_text().set(2147483647)); - - CHECK(node.append_child(STR("text6")).text().set(0.5)); - CHECK(!xml_text().set(0.5)); - - CHECK(node.append_child(STR("text7")).text().set(true)); - CHECK(!xml_text().set(true)); - - CHECK_NODE(node, STR("v1-2147483647-2147483648429496729542949672940.5true")); -} - -TEST_XML(dom_text_middle, "notthisonetext") -{ - xml_node node = doc.child(STR("node")); - xml_text t = node.text(); - - CHECK_STRING(t.get(), STR("text")); - t.set(STR("notext")); - - CHECK_NODE(node, STR("notthisonenotext")); - CHECK(node.remove_child(t.data())); - - CHECK(!t); - CHECK_NODE(node, STR("notthisone")); - - t.set(STR("yestext")); - - CHECK(t); - CHECK_NODE(node, STR("notthisoneyestext")); - CHECK(t.data() == node.last_child()); -} - -TEST_XML_FLAGS(dom_text_data, "foo", parse_default | parse_pi) -{ - xml_node node = doc.child(STR("node")); - - CHECK(node.child(STR("a")).text().data() == node.child(STR("a")).first_child()); - CHECK(node.child(STR("b")).text().data() == node.child(STR("b")).first_child()); - CHECK(!node.child(STR("c")).text().data()); - CHECK(!node.child(STR("d")).text().data()); - CHECK(!xml_text().data()); -} - -TEST(dom_text_defaults) -{ - xml_text text; - - CHECK_STRING(text.as_string(STR("foo")), STR("foo")); - CHECK(text.as_int(42) == 42); - CHECK(text.as_uint(42) == 42); - CHECK(text.as_double(42) == 42); - CHECK(text.as_float(42) == 42); - CHECK(text.as_bool(true) == true); -} +#include "common.hpp" + +#include "helpers.hpp" + +TEST_XML_FLAGS(dom_text_empty, "foo", parse_default | parse_pi) +{ + xml_node node = doc.child(STR("node")); + + CHECK(node.child(STR("a")).text()); + CHECK(node.child(STR("b")).text()); + CHECK(!node.child(STR("c")).text()); + CHECK(!node.child(STR("d")).text()); + CHECK(!xml_node().text()); + CHECK(!xml_text()); + + generic_empty_test(node.child(STR("a")).text()); +} + +TEST_XML(dom_text_bool_ops, "foo") +{ + generic_bool_ops_test(doc.child(STR("node")).text()); +} + +TEST_XML_FLAGS(dom_text_get, "foo", parse_default | parse_pi) +{ + xml_node node = doc.child(STR("node")); + + CHECK_STRING(node.child(STR("a")).text().get(), STR("foo")); + CHECK_STRING(node.child(STR("a")).first_child().text().get(), STR("foo")); + + CHECK_STRING(node.child(STR("b")).text().get(), STR("bar")); + CHECK_STRING(node.child(STR("b")).last_child().text().get(), STR("bar")); + + CHECK_STRING(node.child(STR("c")).text().get(), STR("")); + CHECK_STRING(node.child(STR("c")).first_child().text().get(), STR("")); + + CHECK_STRING(node.child(STR("d")).text().get(), STR("")); + + CHECK_STRING(xml_node().text().get(), STR("")); +} + +TEST_XML_FLAGS(dom_text_as_string, "foo", parse_default | parse_pi) +{ + xml_node node = doc.child(STR("node")); + + CHECK_STRING(node.child(STR("a")).text().as_string(), STR("foo")); + CHECK_STRING(node.child(STR("a")).first_child().text().as_string(), STR("foo")); + + CHECK_STRING(node.child(STR("b")).text().as_string(), STR("bar")); + CHECK_STRING(node.child(STR("b")).last_child().text().as_string(), STR("bar")); + + CHECK_STRING(node.child(STR("c")).text().as_string(), STR("")); + CHECK_STRING(node.child(STR("c")).first_child().text().as_string(), STR("")); + + CHECK_STRING(node.child(STR("d")).text().as_string(), STR("")); + + CHECK_STRING(xml_node().text().as_string(), STR("")); +} + +TEST_XML(dom_text_as_int, "1-1-21474836482147483647") +{ + xml_node node = doc.child(STR("node")); + + CHECK(xml_text().as_int() == 0); + CHECK(node.child(STR("text1")).text().as_int() == 1); + CHECK(node.child(STR("text2")).text().as_int() == -1); + CHECK(node.child(STR("text3")).text().as_int() == -2147483647 - 1); + CHECK(node.child(STR("text4")).text().as_int() == 2147483647); +} + +TEST_XML(dom_text_as_uint, "0121474836474294967295") +{ + xml_node node = doc.child(STR("node")); + + CHECK(xml_text().as_uint() == 0); + CHECK(node.child(STR("text1")).text().as_uint() == 0); + CHECK(node.child(STR("text2")).text().as_uint() == 1); + CHECK(node.child(STR("text3")).text().as_uint() == 2147483647); + CHECK(node.child(STR("text4")).text().as_uint() == 4294967295u); +} + +TEST_XML(dom_text_as_float, "010.12-5.13e-43.14159265358979323846") +{ + xml_node node = doc.child(STR("node")); + + CHECK(xml_text().as_float() == 0); + CHECK_DOUBLE(node.child(STR("text1")).text().as_float(), 0); + CHECK_DOUBLE(node.child(STR("text2")).text().as_float(), 1); + CHECK_DOUBLE(node.child(STR("text3")).text().as_float(), 0.12); + CHECK_DOUBLE(node.child(STR("text4")).text().as_float(), -5.1); + CHECK_DOUBLE(node.child(STR("text5")).text().as_float(), 3e-4); + CHECK_DOUBLE(node.child(STR("text6")).text().as_float(), 3.14159265358979323846); +} + +TEST_XML(dom_text_as_double, "010.12-5.13e-43.14159265358979323846") +{ + xml_node node = doc.child(STR("node")); + + CHECK(xml_text().as_double() == 0); + CHECK_DOUBLE(node.child(STR("text1")).text().as_double(), 0); + CHECK_DOUBLE(node.child(STR("text2")).text().as_double(), 1); + CHECK_DOUBLE(node.child(STR("text3")).text().as_double(), 0.12); + CHECK_DOUBLE(node.child(STR("text4")).text().as_double(), -5.1); + CHECK_DOUBLE(node.child(STR("text5")).text().as_double(), 3e-4); + CHECK_DOUBLE(node.child(STR("text6")).text().as_double(), 3.14159265358979323846); +} + +TEST_XML(dom_text_as_bool, "01trueTrueYesyesfalse") +{ + xml_node node = doc.child(STR("node")); + + CHECK(!xml_text().as_bool()); + CHECK(!node.child(STR("text1")).text().as_bool()); + CHECK(node.child(STR("text2")).text().as_bool()); + CHECK(node.child(STR("text3")).text().as_bool()); + CHECK(node.child(STR("text4")).text().as_bool()); + CHECK(node.child(STR("text5")).text().as_bool()); + CHECK(node.child(STR("text6")).text().as_bool()); + CHECK(!node.child(STR("text7")).text().as_bool()); +} + +TEST_XML(dom_text_get_no_state, "") +{ + xml_node node = doc.child(STR("node")); + xml_text t = node.text(); + + CHECK(!t); + CHECK(t.get() && *t.get() == 0); + CHECK(!node.first_child()); + + node.append_child(node_pcdata); + + CHECK(t); + CHECK_STRING(t.get(), STR("")); + + node.first_child().set_value(STR("test")); + + CHECK(t); + CHECK_STRING(t.get(), STR("test")); +} + +TEST_XML(dom_text_set, "") +{ + xml_node node = doc.child(STR("node")); + xml_text t = node.text(); + + t.set(STR("")); + CHECK(node.first_child().type() == node_pcdata); + CHECK_NODE(node, STR("")); + + t.set(STR("boo")); + CHECK(node.first_child().type() == node_pcdata); + CHECK(node.first_child() == node.last_child()); + CHECK_NODE(node, STR("boo")); + + t.set(STR("foobarfoobar")); + CHECK(node.first_child().type() == node_pcdata); + CHECK(node.first_child() == node.last_child()); + CHECK_NODE(node, STR("foobarfoobar")); +} + +TEST_XML(dom_text_assign, "") +{ + xml_node node = doc.child(STR("node")); + + node.append_child(STR("text1")).text() = STR("v1"); + xml_text() = STR("v1"); + + node.append_child(STR("text2")).text() = -2147483647; + node.append_child(STR("text3")).text() = -2147483647 - 1; + xml_text() = -2147483647 - 1; + + node.append_child(STR("text4")).text() = 4294967295u; + node.append_child(STR("text5")).text() = 4294967294u; + xml_text() = 2147483647; + + node.append_child(STR("text6")).text() = 0.5; + xml_text() = 0.5; + + node.append_child(STR("text7")).text() = true; + xml_text() = true; + + CHECK_NODE(node, STR("v1-2147483647-2147483648429496729542949672940.5true")); +} + +TEST_XML(dom_text_set_value, "") +{ + xml_node node = doc.child(STR("node")); + + CHECK(node.append_child(STR("text1")).text().set(STR("v1"))); + CHECK(!xml_text().set(STR("v1"))); + + CHECK(node.append_child(STR("text2")).text().set(-2147483647)); + CHECK(node.append_child(STR("text3")).text().set(-2147483647 - 1)); + CHECK(!xml_text().set(-2147483647 - 1)); + + CHECK(node.append_child(STR("text4")).text().set(4294967295u)); + CHECK(node.append_child(STR("text5")).text().set(4294967294u)); + CHECK(!xml_text().set(2147483647)); + + CHECK(node.append_child(STR("text6")).text().set(0.5)); + CHECK(!xml_text().set(0.5)); + + CHECK(node.append_child(STR("text7")).text().set(true)); + CHECK(!xml_text().set(true)); + + CHECK_NODE(node, STR("v1-2147483647-2147483648429496729542949672940.5true")); +} + +TEST_XML(dom_text_middle, "notthisonetext") +{ + xml_node node = doc.child(STR("node")); + xml_text t = node.text(); + + CHECK_STRING(t.get(), STR("text")); + t.set(STR("notext")); + + CHECK_NODE(node, STR("notthisonenotext")); + CHECK(node.remove_child(t.data())); + + CHECK(!t); + CHECK_NODE(node, STR("notthisone")); + + t.set(STR("yestext")); + + CHECK(t); + CHECK_NODE(node, STR("notthisoneyestext")); + CHECK(t.data() == node.last_child()); +} + +TEST_XML_FLAGS(dom_text_data, "foo", parse_default | parse_pi) +{ + xml_node node = doc.child(STR("node")); + + CHECK(node.child(STR("a")).text().data() == node.child(STR("a")).first_child()); + CHECK(node.child(STR("b")).text().data() == node.child(STR("b")).first_child()); + CHECK(!node.child(STR("c")).text().data()); + CHECK(!node.child(STR("d")).text().data()); + CHECK(!xml_text().data()); +} + +TEST(dom_text_defaults) +{ + xml_text text; + + CHECK_STRING(text.as_string(STR("foo")), STR("foo")); + CHECK(text.as_int(42) == 42); + CHECK(text.as_uint(42) == 42); + CHECK(text.as_double(42) == 42); + CHECK(text.as_float(42) == 42); + CHECK(text.as_bool(true) == true); +} diff --git a/tests/test_header_string_iostream.cpp b/tests/test_header_string_iostream.cpp index 1105626..3210080 100644 --- a/tests/test_header_string_iostream.cpp +++ b/tests/test_header_string_iostream.cpp @@ -1,5 +1,5 @@ -// Tests compatibility with string/iostream -#include -#include "../src/pugixml.hpp" -#include -#include +// Tests compatibility with string/iostream +#include +#include "../src/pugixml.hpp" +#include +#include diff --git a/tests/test_version.cpp b/tests/test_version.cpp index 6fbfe1b..4b8b99a 100644 --- a/tests/test_version.cpp +++ b/tests/test_version.cpp @@ -1,5 +1,5 @@ -#include "../src/pugixml.hpp" - -#if PUGIXML_VERSION != 120 -#error Unexpected pugixml version -#endif +#include "../src/pugixml.hpp" + +#if PUGIXML_VERSION != 120 +#error Unexpected pugixml version +#endif diff --git a/tests/test_xpath_variables.cpp b/tests/test_xpath_variables.cpp index 785a504..5480d0c 100644 --- a/tests/test_xpath_variables.cpp +++ b/tests/test_xpath_variables.cpp @@ -1,402 +1,402 @@ -#ifndef PUGIXML_NO_XPATH - -#include "common.hpp" - -#include - -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_variables_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"))); -} - -TEST_XML(xpath_variables_evaluate, "") -{ - xpath_variable_set set; - set.set(STR("var1"), true); - set.set(STR("var2"), 0.5); - set.set(STR("var3"), STR("value")); - set.set(STR("var4"), doc.select_nodes(STR("*"))); - - CHECK_XPATH_BOOLEAN_VAR(doc, STR("$var1"), &set, true); - CHECK_XPATH_NUMBER_VAR(doc, STR("$var2"), &set, 0.5); - CHECK_XPATH_STRING_VAR(doc, STR("$var3"), &set, STR("value")); - CHECK_XPATH_NODESET_VAR(doc, STR("$var4"), &set) % 2; -} - -TEST_XML(xpath_variables_evaluate_conversion, "3") -{ - xpath_variable_set set; - set.set(STR("var"), doc.select_nodes(STR("*"))); - - CHECK_XPATH_BOOLEAN_VAR(doc, STR("$var"), &set, true); - CHECK_XPATH_NUMBER_VAR(doc, STR("$var"), &set, 3); - CHECK_XPATH_STRING_VAR(doc, STR("$var"), &set, STR("3")); - CHECK_XPATH_NODESET_VAR(doc, STR("$var"), &set) % 2; -} - -TEST(xpath_variables_evaluate_node_set_fail) -{ - xpath_variable_set set; - set.set(STR("var"), false); - - xpath_query q(STR("$var"), &set); - -#ifdef PUGIXML_NO_EXCEPTIONS - CHECK(q.evaluate_node_set(xml_node()).empty()); -#else - try - { - q.evaluate_node_set(xml_node()); - - CHECK_FORCE_FAIL("Expected exception"); - } - catch (const xpath_exception&) - { - } -#endif -} - -TEST(xpath_variables_multiple_documents) -{ - xml_document doc; - doc.append_child().set_name(STR("node")); - - xml_document doc1; - doc1.append_child().set_name(STR("node")); - - xml_document doc2; - doc2.append_child().set_name(STR("node")); - - xpath_variable_set set; - set.set(STR("var1"), doc1.select_nodes(STR("*"))); - set.set(STR("var2"), doc2.select_nodes(STR("*"))); - - xpath_node_set ns = doc.select_nodes(STR("$var1 | $var2 | node"), &set); - ns.sort(); - - CHECK(ns.size() == 3); - CHECK(ns[0] != ns[1] && ns[0] != ns[2]); - - xml_node n0 = doc.child(STR("node")), n1 = doc1.child(STR("node")), n2 = doc2.child(STR("node")); - - CHECK(n0 == ns[0].node() || n0 == ns[1].node() || n0 == ns[2].node()); - CHECK(n1 == ns[0].node() || n1 == ns[1].node() || n1 == ns[2].node()); - CHECK(n2 == ns[0].node() || n2 == ns[1].node() || n2 == ns[2].node()); -} - -TEST(xpath_variables_long_name) -{ - xpath_variable_set set; - set.set(STR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), true); - - CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &set, true); -} - -TEST_XML(xpath_variables_select, "") -{ - xpath_variable_set set; - set.set(STR("one"), 1.0); - - xpath_node_set ns = doc.select_nodes(STR("node[@attr=$one+1]"), &set); - CHECK(ns.size() == 1 && ns[0].node() == doc.last_child()); - - xpath_node n = doc.select_single_node(STR("node[@attr=$one+1]"), &set); - CHECK(n == ns[0]); -} - -TEST(xpath_variables_empty_name) -{ - xpath_variable_set set; - CHECK(!set.add(STR(""), xpath_type_number)); -} - -TEST_XML(xpath_variables_inside_filter, "") -{ - xpath_variable_set set; - set.set(STR("one"), 1.0); - - xpath_node_set ns = doc.select_nodes(STR("(node[@key = $one])[@value = $one]"), &set); - CHECK(ns.size() == 1 && ns[0].node() == doc.last_child()); -} - -TEST_XML(xpath_variables_step, "") -{ - xpath_variable_set set; - set.set(STR("root"), doc.select_nodes(STR("node"))); - - CHECK_XPATH_NODESET_VAR(xml_node(), STR("$root/child"), &set) % 3 % 4 % 5; - CHECK_XPATH_NODESET_VAR(xml_node(), STR("$root//child"), &set) % 3 % 4 % 5 % 6; -} - -TEST_XML(xpath_variables_index, "") -{ - xpath_variable_set set; - set.set(STR("index"), 2.0); - - CHECK_XPATH_NODESET_VAR(doc, STR("node/child[$index]"), &set) % 4; - CHECK_XPATH_NODESET_VAR(doc, STR("node/child[position()=$index]"), &set) % 4; -} - -TEST(xpath_variables_qname) -{ - xpath_variable_set set; - set.set(STR("foo:bar"), true); - - CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$foo:bar"), &set, true); -} - -TEST(xpath_variables_name_error) -{ - xpath_variable_set set; - set.set(STR("foo:"), true); - set.set(STR(":bar"), true); - set.set(STR("foo:*"), true); - set.set(STR("foo"), true); - set.set(STR("3"), true); - - CHECK_XPATH_FAIL_VAR(STR("$foo:"), &set); - CHECK_XPATH_FAIL_VAR(STR("$:bar"), &set); - CHECK_XPATH_FAIL_VAR(STR("$foo:*"), &set); - CHECK_XPATH_FAIL_VAR(STR("$foo:bar:baz"), &set); - CHECK_XPATH_FAIL_VAR(STR("$ foo"), &set); - - CHECK_XPATH_FAIL_VAR(STR("$3"), &set); -} - -TEST(xpath_variables_empty_string) -{ - xpath_variable_set set; - set.add(STR("empty"), xpath_type_string); - - CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$empty = substring-before('a', 'z')"), &set, true); -} - -TEST(xpath_variables_name_underscore) -{ - xpath_variable_set set; - set.set(STR("_foo_bar"), true); - - CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$_foo_bar"), &set, true); -} - -TEST(xpath_variables_name_case) -{ - xpath_variable_set set; - set.set(STR("i"), 5.0); - set.set(STR("I"), 2.0); - - CHECK_XPATH_NUMBER_VAR(xml_node(), STR("$i div $I"), &set, 2.5); -} - -TEST(xpath_variables_name_unicode) -{ -#ifdef PUGIXML_WCHAR_MODE - #ifdef U_LITERALS - const char_t* name = L"\u0400\u203D"; - #else - const char_t* name = L"\x0400\x203D"; - #endif -#else - const char_t* name = "\xd0\x80\xe2\x80\xbd"; -#endif - - xpath_variable_set set; - set.set(name, STR("value")); - - std::basic_string var = STR("$"); - var += name; - - CHECK_XPATH_STRING_VAR(xml_node(), var.c_str(), &set, STR("value")); -} - -TEST_XML(xpath_variables_count_sum, "122334") -{ - xpath_variable_set set; - set.set(STR("c12"), doc.select_nodes(STR("node/c1 | node/c2"))); - set.set(STR("c3"), doc.select_nodes(STR("node/c3"))); - set.set(STR("c"), doc.select_nodes(STR("node/*"))); - - CHECK_XPATH_NUMBER_VAR(xml_node(), STR("sum($c12) * count($c) - sum($c3)"), &set, 71); -} -#endif +#ifndef PUGIXML_NO_XPATH + +#include "common.hpp" + +#include + +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_variables_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"))); +} + +TEST_XML(xpath_variables_evaluate, "") +{ + xpath_variable_set set; + set.set(STR("var1"), true); + set.set(STR("var2"), 0.5); + set.set(STR("var3"), STR("value")); + set.set(STR("var4"), doc.select_nodes(STR("*"))); + + CHECK_XPATH_BOOLEAN_VAR(doc, STR("$var1"), &set, true); + CHECK_XPATH_NUMBER_VAR(doc, STR("$var2"), &set, 0.5); + CHECK_XPATH_STRING_VAR(doc, STR("$var3"), &set, STR("value")); + CHECK_XPATH_NODESET_VAR(doc, STR("$var4"), &set) % 2; +} + +TEST_XML(xpath_variables_evaluate_conversion, "3") +{ + xpath_variable_set set; + set.set(STR("var"), doc.select_nodes(STR("*"))); + + CHECK_XPATH_BOOLEAN_VAR(doc, STR("$var"), &set, true); + CHECK_XPATH_NUMBER_VAR(doc, STR("$var"), &set, 3); + CHECK_XPATH_STRING_VAR(doc, STR("$var"), &set, STR("3")); + CHECK_XPATH_NODESET_VAR(doc, STR("$var"), &set) % 2; +} + +TEST(xpath_variables_evaluate_node_set_fail) +{ + xpath_variable_set set; + set.set(STR("var"), false); + + xpath_query q(STR("$var"), &set); + +#ifdef PUGIXML_NO_EXCEPTIONS + CHECK(q.evaluate_node_set(xml_node()).empty()); +#else + try + { + q.evaluate_node_set(xml_node()); + + CHECK_FORCE_FAIL("Expected exception"); + } + catch (const xpath_exception&) + { + } +#endif +} + +TEST(xpath_variables_multiple_documents) +{ + xml_document doc; + doc.append_child().set_name(STR("node")); + + xml_document doc1; + doc1.append_child().set_name(STR("node")); + + xml_document doc2; + doc2.append_child().set_name(STR("node")); + + xpath_variable_set set; + set.set(STR("var1"), doc1.select_nodes(STR("*"))); + set.set(STR("var2"), doc2.select_nodes(STR("*"))); + + xpath_node_set ns = doc.select_nodes(STR("$var1 | $var2 | node"), &set); + ns.sort(); + + CHECK(ns.size() == 3); + CHECK(ns[0] != ns[1] && ns[0] != ns[2]); + + xml_node n0 = doc.child(STR("node")), n1 = doc1.child(STR("node")), n2 = doc2.child(STR("node")); + + CHECK(n0 == ns[0].node() || n0 == ns[1].node() || n0 == ns[2].node()); + CHECK(n1 == ns[0].node() || n1 == ns[1].node() || n1 == ns[2].node()); + CHECK(n2 == ns[0].node() || n2 == ns[1].node() || n2 == ns[2].node()); +} + +TEST(xpath_variables_long_name) +{ + xpath_variable_set set; + set.set(STR("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), true); + + CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"), &set, true); +} + +TEST_XML(xpath_variables_select, "") +{ + xpath_variable_set set; + set.set(STR("one"), 1.0); + + xpath_node_set ns = doc.select_nodes(STR("node[@attr=$one+1]"), &set); + CHECK(ns.size() == 1 && ns[0].node() == doc.last_child()); + + xpath_node n = doc.select_single_node(STR("node[@attr=$one+1]"), &set); + CHECK(n == ns[0]); +} + +TEST(xpath_variables_empty_name) +{ + xpath_variable_set set; + CHECK(!set.add(STR(""), xpath_type_number)); +} + +TEST_XML(xpath_variables_inside_filter, "") +{ + xpath_variable_set set; + set.set(STR("one"), 1.0); + + xpath_node_set ns = doc.select_nodes(STR("(node[@key = $one])[@value = $one]"), &set); + CHECK(ns.size() == 1 && ns[0].node() == doc.last_child()); +} + +TEST_XML(xpath_variables_step, "") +{ + xpath_variable_set set; + set.set(STR("root"), doc.select_nodes(STR("node"))); + + CHECK_XPATH_NODESET_VAR(xml_node(), STR("$root/child"), &set) % 3 % 4 % 5; + CHECK_XPATH_NODESET_VAR(xml_node(), STR("$root//child"), &set) % 3 % 4 % 5 % 6; +} + +TEST_XML(xpath_variables_index, "") +{ + xpath_variable_set set; + set.set(STR("index"), 2.0); + + CHECK_XPATH_NODESET_VAR(doc, STR("node/child[$index]"), &set) % 4; + CHECK_XPATH_NODESET_VAR(doc, STR("node/child[position()=$index]"), &set) % 4; +} + +TEST(xpath_variables_qname) +{ + xpath_variable_set set; + set.set(STR("foo:bar"), true); + + CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$foo:bar"), &set, true); +} + +TEST(xpath_variables_name_error) +{ + xpath_variable_set set; + set.set(STR("foo:"), true); + set.set(STR(":bar"), true); + set.set(STR("foo:*"), true); + set.set(STR("foo"), true); + set.set(STR("3"), true); + + CHECK_XPATH_FAIL_VAR(STR("$foo:"), &set); + CHECK_XPATH_FAIL_VAR(STR("$:bar"), &set); + CHECK_XPATH_FAIL_VAR(STR("$foo:*"), &set); + CHECK_XPATH_FAIL_VAR(STR("$foo:bar:baz"), &set); + CHECK_XPATH_FAIL_VAR(STR("$ foo"), &set); + + CHECK_XPATH_FAIL_VAR(STR("$3"), &set); +} + +TEST(xpath_variables_empty_string) +{ + xpath_variable_set set; + set.add(STR("empty"), xpath_type_string); + + CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$empty = substring-before('a', 'z')"), &set, true); +} + +TEST(xpath_variables_name_underscore) +{ + xpath_variable_set set; + set.set(STR("_foo_bar"), true); + + CHECK_XPATH_BOOLEAN_VAR(xml_node(), STR("$_foo_bar"), &set, true); +} + +TEST(xpath_variables_name_case) +{ + xpath_variable_set set; + set.set(STR("i"), 5.0); + set.set(STR("I"), 2.0); + + CHECK_XPATH_NUMBER_VAR(xml_node(), STR("$i div $I"), &set, 2.5); +} + +TEST(xpath_variables_name_unicode) +{ +#ifdef PUGIXML_WCHAR_MODE + #ifdef U_LITERALS + const char_t* name = L"\u0400\u203D"; + #else + const char_t* name = L"\x0400\x203D"; + #endif +#else + const char_t* name = "\xd0\x80\xe2\x80\xbd"; +#endif + + xpath_variable_set set; + set.set(name, STR("value")); + + std::basic_string var = STR("$"); + var += name; + + CHECK_XPATH_STRING_VAR(xml_node(), var.c_str(), &set, STR("value")); +} + +TEST_XML(xpath_variables_count_sum, "122334") +{ + xpath_variable_set set; + set.set(STR("c12"), doc.select_nodes(STR("node/c1 | node/c2"))); + set.set(STR("c3"), doc.select_nodes(STR("node/c3"))); + set.set(STR("c"), doc.select_nodes(STR("node/*"))); + + CHECK_XPATH_NUMBER_VAR(xml_node(), STR("sum($c12) * count($c) - sum($c3)"), &set, 71); +} +#endif