tests: Added more node tests
git-svn-id: http://pugixml.googlecode.com/svn/trunk@145 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
parent
b50199492b
commit
29e42bb25f
@ -1,6 +1,8 @@
|
||||
#include "common.hpp"
|
||||
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
#include <iterator>
|
||||
|
||||
template <typename I> I move_iter(I base, int n)
|
||||
{
|
||||
@ -451,6 +453,238 @@ TEST_XML(dom_node_find_child_by_attribute, "<node><child1 attr='value1'/><child2
|
||||
CHECK(node.find_child_by_attribute_w("att?", "val*[0123456789]") == node.child("child1"));
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_all_elements_by_name, "<node><child><child/><child/></child></node>")
|
||||
{
|
||||
std::vector<xml_node> v;
|
||||
|
||||
v.clear();
|
||||
xml_node().all_elements_by_name("node", std::back_inserter(v));
|
||||
CHECK(v.empty());
|
||||
|
||||
v.clear();
|
||||
xml_node().all_elements_by_name_w("*", std::back_inserter(v));
|
||||
CHECK(v.empty());
|
||||
|
||||
v.clear();
|
||||
doc.all_elements_by_name("node", std::back_inserter(v));
|
||||
CHECK(v.size() == 1 && v[0] == doc.child("node"));
|
||||
|
||||
v.clear();
|
||||
doc.all_elements_by_name("child", std::back_inserter(v));
|
||||
CHECK(v.size() == 3);
|
||||
CHECK(v[0] == doc.child("node").child("child"));
|
||||
CHECK(v[1] == doc.child("node").child("child").first_child());
|
||||
CHECK(v[2] == doc.child("node").child("child").last_child());
|
||||
|
||||
v.clear();
|
||||
doc.all_elements_by_name_w("*", std::back_inserter(v));
|
||||
CHECK(v.size() == 4);
|
||||
CHECK(v[0] == doc.child("node"));
|
||||
CHECK(v[1] == doc.child("node").child("child"));
|
||||
CHECK(v[2] == doc.child("node").child("child").first_child());
|
||||
CHECK(v[3] == doc.child("node").child("child").last_child());
|
||||
}
|
||||
|
||||
struct find_predicate_const
|
||||
{
|
||||
bool result;
|
||||
|
||||
find_predicate_const(bool result): result(result)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename T> bool operator()(const T&) const
|
||||
{
|
||||
return result;
|
||||
}
|
||||
};
|
||||
|
||||
struct find_predicate_prefix
|
||||
{
|
||||
const char* prefix;
|
||||
|
||||
find_predicate_prefix(const char* prefix): prefix(prefix)
|
||||
{
|
||||
}
|
||||
|
||||
template <typename T> bool operator()(const T& obj) const
|
||||
{
|
||||
return strncmp(obj.name(), prefix, strlen(prefix)) == 0;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_XML(dom_node_find_attribute, "<node attr1='0' attr2='1'/>")
|
||||
{
|
||||
CHECK(xml_node().find_attribute(find_predicate_const(true)) == xml_attribute());
|
||||
|
||||
xml_node node = doc.child("node");
|
||||
|
||||
CHECK(doc.find_attribute(find_predicate_const(true)) == xml_attribute());
|
||||
CHECK(node.find_attribute(find_predicate_const(true)) == node.first_attribute());
|
||||
CHECK(node.find_attribute(find_predicate_const(false)) == xml_attribute());
|
||||
CHECK(node.find_attribute(find_predicate_prefix("attr2")) == node.last_attribute());
|
||||
CHECK(node.find_attribute(find_predicate_prefix("attr")) == node.first_attribute());
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_find_child, "<node><child1/><child2/></node>")
|
||||
{
|
||||
CHECK(xml_node().find_child(find_predicate_const(true)) == xml_node());
|
||||
|
||||
xml_node node = doc.child("node");
|
||||
|
||||
CHECK(node.child("node").child("child1").find_child(find_predicate_const(true)) == xml_node());
|
||||
CHECK(node.find_child(find_predicate_const(true)) == node.first_child());
|
||||
CHECK(node.find_child(find_predicate_const(false)) == xml_node());
|
||||
CHECK(node.find_child(find_predicate_prefix("child2")) == node.last_child());
|
||||
CHECK(node.find_child(find_predicate_prefix("child")) == node.first_child());
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_find_node, "<node><child1/><child2/></node>")
|
||||
{
|
||||
CHECK(xml_node().find_node(find_predicate_const(true)) == xml_node());
|
||||
|
||||
xml_node node = doc.child("node");
|
||||
|
||||
CHECK(node.child("node").child("child1").find_node(find_predicate_const(true)) == xml_node());
|
||||
CHECK(node.find_node(find_predicate_const(true)) == node.first_child());
|
||||
CHECK(node.find_node(find_predicate_const(false)) == xml_node());
|
||||
CHECK(node.find_node(find_predicate_prefix("child2")) == node.last_child());
|
||||
CHECK(node.find_node(find_predicate_prefix("child")) == node.first_child());
|
||||
CHECK(doc.find_node(find_predicate_prefix("child")) == node.first_child());
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_path, "<node><child1>text<child2/></child1></node>")
|
||||
{
|
||||
CHECK(xml_node().path() == "");
|
||||
|
||||
CHECK(doc.path() == "");
|
||||
CHECK(doc.child("node").path() == "/node");
|
||||
CHECK(doc.child("node").child("child1").path() == "/node/child1");
|
||||
CHECK(doc.child("node").child("child1").child("child2").path() == "/node/child1/child2");
|
||||
CHECK(doc.child("node").child("child1").first_child().path() == "/node/child1/");
|
||||
|
||||
CHECK(doc.child("node").child("child1").path('\\') == "\\node\\child1");
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_first_element_by_path, "<node><child1>text<child2/></child1></node>")
|
||||
{
|
||||
CHECK(xml_node().first_element_by_path("/") == xml_node());
|
||||
|
||||
CHECK(doc.first_element_by_path("") == doc);
|
||||
CHECK(doc.first_element_by_path("/") == doc);
|
||||
|
||||
CHECK(doc.first_element_by_path("/node/") == doc.child("node"));
|
||||
CHECK(doc.first_element_by_path("node/") == doc.child("node"));
|
||||
CHECK(doc.first_element_by_path("node") == doc.child("node"));
|
||||
CHECK(doc.first_element_by_path("/node") == doc.child("node"));
|
||||
|
||||
CHECK(doc.first_element_by_path("/node/child1/child2").path() == "/node/child1/child2");
|
||||
CHECK(doc.first_element_by_path("/node/child2") == xml_node());
|
||||
|
||||
CHECK(doc.first_element_by_path("\\node\\child1", '\\') == doc.child("node").child("child1"));
|
||||
}
|
||||
|
||||
struct test_walker: xml_tree_walker
|
||||
{
|
||||
std::string log;
|
||||
unsigned int call_count;
|
||||
unsigned int stop_count;
|
||||
|
||||
test_walker(unsigned int stop_count = 0): call_count(0), stop_count(stop_count)
|
||||
{
|
||||
}
|
||||
|
||||
virtual bool begin(xml_node& node)
|
||||
{
|
||||
char buffer[32];
|
||||
sprintf(buffer, "|%d <%s=%s", depth(), node.name(), node.value());
|
||||
|
||||
log += buffer;
|
||||
|
||||
return ++call_count != stop_count;
|
||||
}
|
||||
|
||||
virtual bool for_each(xml_node& node)
|
||||
{
|
||||
char buffer[32];
|
||||
sprintf(buffer, "|%d !%s=%s", depth(), node.name(), node.value());
|
||||
|
||||
log += buffer;
|
||||
|
||||
return ++call_count != stop_count;
|
||||
}
|
||||
|
||||
virtual bool end(xml_node& node)
|
||||
{
|
||||
char buffer[32];
|
||||
sprintf(buffer, "|%d >%s=%s", depth(), node.name(), node.value());
|
||||
|
||||
log += buffer;
|
||||
|
||||
return ++call_count != stop_count;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_XML(dom_node_traverse, "<node><child>text</child></node>")
|
||||
{
|
||||
test_walker walker;
|
||||
|
||||
CHECK(doc.traverse(walker));
|
||||
|
||||
CHECK(walker.call_count == 5);
|
||||
CHECK(walker.log == "|-1 <=|0 !node=|1 !child=|2 !=text|-1 >=");
|
||||
}
|
||||
|
||||
TEST(dom_node_traverse_empty)
|
||||
{
|
||||
test_walker walker;
|
||||
|
||||
CHECK(xml_node().traverse(walker));
|
||||
|
||||
CHECK(walker.call_count == 2);
|
||||
CHECK(walker.log == "|-1 <=|-1 >=");
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_traverse_child, "<node><child>text</child></node>")
|
||||
{
|
||||
test_walker walker;
|
||||
|
||||
CHECK(doc.child("node").traverse(walker));
|
||||
|
||||
CHECK(walker.call_count == 4);
|
||||
CHECK(walker.log == "|-1 <node=|0 !child=|1 !=text|-1 >node=");
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_traverse_stop_begin, "<node><child>text</child></node>")
|
||||
{
|
||||
test_walker walker(1);
|
||||
|
||||
CHECK(!doc.traverse(walker));
|
||||
|
||||
CHECK(walker.call_count == 1);
|
||||
CHECK(walker.log == "|-1 <=");
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_traverse_stop_for_each, "<node><child>text</child></node>")
|
||||
{
|
||||
test_walker walker(3);
|
||||
|
||||
CHECK(!doc.traverse(walker));
|
||||
|
||||
CHECK(walker.call_count == 3);
|
||||
CHECK(walker.log == "|-1 <=|0 !node=|1 !child=");
|
||||
}
|
||||
|
||||
TEST_XML(dom_node_traverse_stop_end, "<node><child>text</child></node>")
|
||||
{
|
||||
test_walker walker(5);
|
||||
|
||||
CHECK(!doc.traverse(walker));
|
||||
|
||||
CHECK(walker.call_count == 5);
|
||||
CHECK(walker.log == "|-1 <=|0 !node=|1 !child=|2 !=text|-1 >=");
|
||||
}
|
||||
|
||||
TEST_XML_FLAGS(dom_offset_debug, "<?xml?><?pi?><!--comment--><node>pcdata<![CDATA[cdata]]></node>", parse_default | parse_pi | parse_comments | parse_declaration)
|
||||
{
|
||||
CHECK(xml_node().offset_debug() == -1);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user