summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/test_document.cpp32
-rw-r--r--tests/test_dom_traverse.cpp2
-rw-r--r--tests/test_parse.cpp74
3 files changed, 102 insertions, 6 deletions
diff --git a/tests/test_document.cpp b/tests/test_document.cpp
index 4a915df..ced06a8 100644
--- a/tests/test_document.cpp
+++ b/tests/test_document.cpp
@@ -126,6 +126,28 @@ TEST(document_load_stream_exceptions)
}
}
#endif
+
+TEST(document_load_stream_error_previous)
+{
+ pugi::xml_document doc;
+ CHECK(doc.load("<node/>"));
+ CHECK(doc.first_child());
+
+ std::ifstream fs1("filedoesnotexist");
+ CHECK(doc.load(fs1).status == status_io_error);
+ CHECK(!doc.first_child());
+}
+
+TEST(document_load_stream_wide_error_previous)
+{
+ pugi::xml_document doc;
+ CHECK(doc.load("<node/>"));
+ CHECK(doc.first_child());
+
+ std::basic_ifstream<wchar_t> fs1("filedoesnotexist");
+ CHECK(doc.load(fs1).status == status_io_error);
+ CHECK(!doc.first_child());
+}
#endif
TEST(document_load_string)
@@ -182,6 +204,16 @@ TEST(document_load_file_error)
CHECK(doc.load_file("tests/data/small.xml").status == status_out_of_memory);
}
+TEST(document_load_file_error_previous)
+{
+ pugi::xml_document doc;
+ CHECK(doc.load("<node/>"));
+ CHECK(doc.first_child());
+
+ CHECK(doc.load_file("filedoesnotexist").status == status_file_not_found);
+ CHECK(!doc.first_child());
+}
+
TEST_XML(document_save, "<node/>")
{
xml_writer_string writer;
diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp
index fa6c6ef..cbf873b 100644
--- a/tests/test_dom_traverse.cpp
+++ b/tests/test_dom_traverse.cpp
@@ -471,7 +471,7 @@ TEST_XML(dom_node_first_last_child, "<node><child1/><child2/></node>")
CHECK(doc.last_child() == node);
}
-TEST_XML(dom_node_find_child_by_attribute, "<node><child1 attr='value1'/><child2 attr='value2'/><child2 attr='value3'/></node>")
+TEST_XML(dom_node_find_child_by_attribute, "<node><stub attr='value3' /><child1 attr='value1'/><child2 attr='value2'/><child2 attr='value3'/></node>")
{
CHECK(xml_node().find_child_by_attribute(STR("name"), STR("attr"), STR("value")) == xml_node());
CHECK(xml_node().find_child_by_attribute(STR("attr"), STR("value")) == xml_node());
diff --git a/tests/test_parse.cpp b/tests/test_parse.cpp
index c7e3ae3..5b3cf3f 100644
--- a/tests/test_parse.cpp
+++ b/tests/test_parse.cpp
@@ -144,6 +144,13 @@ TEST(parse_cdata_skip)
CHECK(!doc.first_child());
}
+TEST(parse_cdata_skip_contents)
+{
+ xml_document doc;
+ CHECK(doc.load(STR("<node><![CDATA[]]>hello<![CDATA[value]]>, world!</node>"), parse_minimal));
+ CHECK_NODE(doc, STR("<node>hello, world!</node>"));
+}
+
TEST(parse_cdata_parse)
{
xml_document doc;
@@ -377,6 +384,25 @@ TEST(parse_escapes_code_invalid)
CHECK_STRING(doc.child_value(STR("node")), STR("&#;&#x;&;&#x-;&#-;"));
}
+TEST(parse_escapes_attribute)
+{
+ xml_document doc;
+
+ for (int wnorm = 0; wnorm < 2; ++wnorm)
+ for (int eol = 0; eol < 2; ++eol)
+ for (int wconv = 0; wconv < 2; ++wconv)
+ {
+ unsigned int flags = parse_escapes;
+
+ flags |= (wnorm ? parse_wnorm_attribute : 0);
+ flags |= (eol ? parse_eol : 0);
+ flags |= (wconv ? parse_wconv_attribute : 0);
+
+ CHECK(doc.load(STR("<node id='&quot;'/>"), flags));
+ CHECK_STRING(doc.child(STR("node")).attribute(STR("id")).value(), STR("\""));
+ }
+}
+
TEST(parse_attribute_spaces)
{
xml_document doc;
@@ -447,11 +473,11 @@ TEST(parse_attribute_variations)
for (int escapes = 0; escapes < 2; ++escapes)
{
unsigned int flags = parse_minimal;
-
- flags |= (wnorm ? parse_wnorm_attribute : 0);
- flags |= (eol ? parse_eol : 0);
- flags |= (wconv ? parse_wconv_attribute : 0);
- flags |= (escapes ? parse_escapes : 0);
+
+ flags |= (wnorm ? parse_wnorm_attribute : 0);
+ flags |= (eol ? parse_eol : 0);
+ flags |= (wconv ? parse_wconv_attribute : 0);
+ flags |= (escapes ? parse_escapes : 0);
CHECK(doc.load(STR("<node id='1'/>"), flags));
CHECK_STRING(doc.child(STR("node")).attribute(STR("id")).value(), STR("1"));
@@ -482,6 +508,44 @@ TEST(parse_attribute_error)
CHECK(doc.load(STR("<node &='1'/>"), parse_minimal).status == status_bad_start_element);
}
+TEST(parse_attribute_termination_error)
+{
+ xml_document doc;
+
+ for (int wnorm = 0; wnorm < 2; ++wnorm)
+ for (int eol = 0; eol < 2; ++eol)
+ for (int wconv = 0; wconv < 2; ++wconv)
+ {
+ unsigned int flags = parse_minimal;
+
+ flags |= (wnorm ? parse_wnorm_attribute : 0);
+ flags |= (eol ? parse_eol : 0);
+ flags |= (wconv ? parse_wconv_attribute : 0);
+
+ CHECK(doc.load(STR("<node id='value"), flags).status == status_bad_attribute);
+ }
+}
+
+TEST(parse_attribute_quot_inside)
+{
+ xml_document doc;
+
+ for (int wnorm = 0; wnorm < 2; ++wnorm)
+ for (int eol = 0; eol < 2; ++eol)
+ for (int wconv = 0; wconv < 2; ++wconv)
+ {
+ unsigned int flags = parse_escapes;
+
+ flags |= (wnorm ? parse_wnorm_attribute : 0);
+ flags |= (eol ? parse_eol : 0);
+ flags |= (wconv ? parse_wconv_attribute : 0);
+
+ CHECK(doc.load(STR("<node id1='\"' id2=\"'\"/>"), flags));
+ CHECK_STRING(doc.child(STR("node")).attribute(STR("id1")).value(), STR("\""));
+ CHECK_STRING(doc.child(STR("node")).attribute(STR("id2")).value(), STR("'"));
+ }
+}
+
TEST(parse_tag_single)
{
xml_document doc;