diff options
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test_dom_traverse.cpp | 234 | 
1 files changed, 234 insertions, 0 deletions
| diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp index 5b009a3..71c08c6 100644 --- a/tests/test_dom_traverse.cpp +++ b/tests/test_dom_traverse.cpp @@ -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);
 | 
