summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarseny.kapoulkine@gmail.com <arseny.kapoulkine@gmail.com@99668b35-9821-0410-8761-19e4c4f06640>2012-09-29 06:36:29 +0000
committerarseny.kapoulkine@gmail.com <arseny.kapoulkine@gmail.com@99668b35-9821-0410-8761-19e4c4f06640>2012-09-29 06:36:29 +0000
commit2876af6773881158ae82b7031e3af9b95e243c14 (patch)
treee7bfbd33d39c3cd6c53067e804541d8fc259dcb2
parentff715f672f37d3f3c40d986e95d23dd8997ab53c (diff)
Fix find_child_by_attribute assertion for attributes with null name/value.
git-svn-id: http://pugixml.googlecode.com/svn/trunk@920 99668b35-9821-0410-8761-19e4c4f06640
-rw-r--r--src/pugixml.cpp4
-rw-r--r--tests/test_dom_traverse.cpp25
2 files changed, 27 insertions, 2 deletions
diff --git a/src/pugixml.cpp b/src/pugixml.cpp
index 4035ab1..03a4b9f 100644
--- a/src/pugixml.cpp
+++ b/src/pugixml.cpp
@@ -4507,7 +4507,7 @@ namespace pugi
if (i->name && impl::strequal(name_, i->name))
{
for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute)
- if (impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value))
+ if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value : PUGIXML_TEXT("")))
return xml_node(i);
}
@@ -4520,7 +4520,7 @@ namespace pugi
for (xml_node_struct* i = _root->first_child; i; i = i->next_sibling)
for (xml_attribute_struct* a = i->first_attribute; a; a = a->next_attribute)
- if (impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value))
+ if (a->name && impl::strequal(attr_name, a->name) && impl::strequal(attr_value, a->value ? a->value : PUGIXML_TEXT("")))
return xml_node(i);
return xml_node();
diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp
index 738b53d..1af8572 100644
--- a/tests/test_dom_traverse.cpp
+++ b/tests/test_dom_traverse.cpp
@@ -537,6 +537,31 @@ TEST_XML(dom_node_find_child_by_attribute, "<node><stub attr='value3' /><child1
CHECK(node.find_child_by_attribute(STR("attr3"), STR("value")) == xml_node());
}
+TEST(dom_node_find_child_by_attribute_null)
+{
+ xml_document doc;
+ xml_node node0 = doc.append_child();
+ xml_node node1 = doc.append_child(STR("a"));
+ xml_node node2 = doc.append_child(STR("a"));
+ xml_node node3 = doc.append_child(STR("a"));
+
+ // this adds an attribute with null name and/or value in the internal representation
+ node1.append_attribute(STR(""));
+ node2.append_attribute(STR("id"));
+ node3.append_attribute(STR("id")) = STR("1");
+
+ // make sure find_child_by_attribute works if name/value is null
+ CHECK(doc.find_child_by_attribute(STR("unknown"), STR("wrong")) == xml_node());
+ CHECK(doc.find_child_by_attribute(STR("id"), STR("wrong")) == xml_node());
+ CHECK(doc.find_child_by_attribute(STR("id"), STR("")) == node2);
+ CHECK(doc.find_child_by_attribute(STR("id"), STR("1")) == node3);
+
+ CHECK(doc.find_child_by_attribute(STR("a"), STR("unknown"), STR("wrong")) == xml_node());
+ CHECK(doc.find_child_by_attribute(STR("a"), STR("id"), STR("wrong")) == xml_node());
+ CHECK(doc.find_child_by_attribute(STR("a"), STR("id"), STR("")) == node2);
+ CHECK(doc.find_child_by_attribute(STR("a"), STR("id"), STR("1")) == node3);
+}
+
struct find_predicate_const
{
bool result;