diff --git a/tests/test_dom_modify.cpp b/tests/test_dom_modify.cpp
index 46b0543..eefda58 100644
--- a/tests/test_dom_modify.cpp
+++ b/tests/test_dom_modify.cpp
@@ -514,13 +514,16 @@ TEST_XML(dom_node_copy_crossdoc, "")
CHECK_NODE(newdoc, STR(""));
}
-TEST_XML_FLAGS(dom_node_copy_types, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration)
+TEST_XML_FLAGS(dom_node_copy_types, "pcdata", parse_full)
{
doc.append_copy(doc.child(STR("root")));
- CHECK_NODE(doc, STR("pcdatapcdata"));
+ CHECK_NODE(doc, STR("pcdatapcdata"));
doc.insert_copy_before(doc.first_child(), doc.first_child());
- CHECK_NODE(doc, STR("pcdatapcdata"));
+ CHECK_NODE(doc, STR("pcdatapcdata"));
+
+ doc.insert_copy_after(doc.first_child().next_sibling().next_sibling(), doc.first_child());
+ CHECK_NODE(doc, STR("pcdatapcdata"));
}
TEST_XML(dom_attr_assign_large_number, "")
@@ -549,6 +552,16 @@ TEST(dom_node_declaration_name)
CHECK_NODE(doc, STR(""));
}
+TEST(dom_node_declaration_attributes)
+{
+ xml_document doc;
+ xml_node node = doc.append_child(node_declaration);
+ node.append_attribute(STR("version")) = STR("1.0");
+ node.append_attribute(STR("encoding")) = STR("utf-8");
+
+ CHECK_NODE(doc, STR(""));
+}
+
TEST(dom_node_declaration_top_level)
{
xml_document doc;
@@ -677,3 +690,49 @@ TEST(dom_node_memory_limit)
CHECK(doc.remove_child(doc.first_child()));
}
}
+
+TEST(dom_node_doctype_top_level)
+{
+ xml_document doc;
+ doc.append_child().set_name(STR("node"));
+
+ xml_node node = doc.first_child();
+ node.append_child(node_pcdata).set_value(STR("text"));
+
+ CHECK(node.insert_child_before(node_doctype, node.first_child()) == xml_node());
+ CHECK(node.insert_child_after(node_doctype, node.first_child()) == xml_node());
+ CHECK(node.append_child(node_doctype) == xml_node());
+
+ CHECK_NODE(doc, STR("text"));
+
+ CHECK(doc.insert_child_before(node_doctype, node));
+ CHECK(doc.insert_child_after(node_doctype, node));
+ CHECK(doc.append_child(node_doctype));
+
+ CHECK_NODE(doc, STR("text"));
+}
+
+TEST(dom_node_doctype_copy)
+{
+ xml_document doc;
+ doc.append_child(node_doctype);
+
+ doc.append_child().set_name(STR("node"));
+
+ doc.last_child().append_copy(doc.first_child());
+
+ CHECK_NODE(doc, STR(""));
+}
+
+TEST(dom_node_doctype_value)
+{
+ xml_document doc;
+ xml_node node = doc.append_child(node_doctype);
+
+ CHECK(node.type() == node_doctype);
+ CHECK_STRING(node.value(), STR(""));
+ CHECK_NODE(node, STR(""));
+
+ CHECK(node.set_value(STR("id [ foo ]")));
+ CHECK_NODE(node, STR(""));
+}
diff --git a/tests/test_dom_traverse.cpp b/tests/test_dom_traverse.cpp
index 09055f0..865b90a 100644
--- a/tests/test_dom_traverse.cpp
+++ b/tests/test_dom_traverse.cpp
@@ -347,7 +347,7 @@ TEST_XML(dom_node_root, "")
CHECK(doc.child(STR("node")).root() == doc);
}
-TEST_XML_FLAGS(dom_node_type, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration)
+TEST_XML_FLAGS(dom_node_type, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype)
{
CHECK(xml_node().type() == node_null);
CHECK(doc.type() == node_document);
@@ -355,6 +355,7 @@ TEST_XML_FLAGS(dom_node_type, "pcdatatype() == node_declaration);
+ CHECK((it++)->type() == node_doctype);
CHECK((it++)->type() == node_pi);
CHECK((it++)->type() == node_comment);
CHECK((it++)->type() == node_element);
@@ -365,7 +366,7 @@ TEST_XML_FLAGS(dom_node_type, "pcdatatype() == node_cdata);
}
-TEST_XML_FLAGS(dom_node_name_value, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration)
+TEST_XML_FLAGS(dom_node_name_value, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype)
{
CHECK_NAME_VALUE(xml_node(), STR(""), STR(""));
CHECK_NAME_VALUE(doc, STR(""), STR(""));
@@ -373,6 +374,7 @@ TEST_XML_FLAGS(dom_node_name_value, "pcdatatext")
CHECK(walker.log == STR("|-1 <=|0 !node=|1 !child=|2 !=text|-1 >="));
}
-TEST_XML_FLAGS(dom_offset_debug, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration)
+TEST_XML_FLAGS(dom_offset_debug, "pcdata", parse_default | parse_pi | parse_comments | parse_declaration | parse_doctype)
{
CHECK(xml_node().offset_debug() == -1);
CHECK(doc.offset_debug() == 0);
@@ -748,14 +750,15 @@ TEST_XML_FLAGS(dom_offset_debug, "pcdataoffset_debug() == 2);
- CHECK((it++)->offset_debug() == 9);
- CHECK((it++)->offset_debug() == 17);
- CHECK((it++)->offset_debug() == 28);
+ CHECK((it++)->offset_debug() == 16);
+ CHECK((it++)->offset_debug() == 19);
+ CHECK((it++)->offset_debug() == 27);
+ CHECK((it++)->offset_debug() == 38);
xml_node_iterator cit = doc.child(STR("node")).begin();
- CHECK((cit++)->offset_debug() == 33);
- CHECK((cit++)->offset_debug() == 48);
+ CHECK((cit++)->offset_debug() == 43);
+ CHECK((cit++)->offset_debug() == 58);
}
TEST_XML(dom_internal_object, "value")
diff --git a/tests/test_parse_doctype.cpp b/tests/test_parse_doctype.cpp
index c633467..2a092d9 100644
--- a/tests/test_parse_doctype.cpp
+++ b/tests/test_parse_doctype.cpp
@@ -40,8 +40,9 @@ static bool test_doctype_wf(const char_t* decl)
if (!load_concat(doc, decl, STR("")) || !test_node(doc, STR(""), STR(""), format_raw)) return false;
if (!load_concat(doc, STR(""), decl, STR("")) || !test_node(doc, STR(""), STR(""), format_raw)) return false;
- // wrap in node to check that doctype is parsed fully (does not leave any "pcdata")
- if (!load_concat(doc, STR(""), decl, STR("")) || !test_node(doc, STR(""), STR(""), format_raw)) return false;
+ // check load-store contents preservation
+ CHECK(doc.load(decl, parse_doctype));
+ CHECK_NODE(doc, decl);
return true;
}
@@ -276,9 +277,12 @@ TEST(parse_doctype_xmlconf_oasis_1)
TEST_DOCTYPE_WF(" ?>/\''\"> ]>");
TEST_DOCTYPE_WF(" ]>");
TEST_DOCTYPE_WF(" ]>");
- TEST_DOCTYPE_WF(" "); // not actually a doctype :)
- TEST_DOCTYPE_WF(" &a%bc?>"); // not actually a doctype :)
TEST_DOCTYPE_WF("]>");
+
+ // not actually a doctype :)
+ xml_document doc;
+ CHECK(doc.load(STR(" "), parse_full) && doc.first_child().type() == node_comment && doc.last_child().type() == node_comment && doc.first_child().next_sibling() == doc.last_child());
+ CHECK(doc.load(STR(" &a%bc?>"), parse_full) && doc.first_child().type() == node_pi && doc.first_child() == doc.last_child());
}
TEST(parse_doctype_xmlconf_xmltest_1)
@@ -294,3 +298,18 @@ TEST(parse_doctype_xmlconf_xmltest_1)
TEST_DOCTYPE_WF("\"> ]>");
TEST_DOCTYPE_WF(" \"> ]>");
}
+
+TEST_XML_FLAGS(parse_doctype_value, " \"> ]>", parse_minimal | parse_doctype)
+{
+ xml_node n = doc.first_child();
+
+ CHECK(n.type() == node_doctype);
+ CHECK_STRING(n.value(), STR("doc [ \"> ]"));
+}
+
+TEST(parse_doctype_error_toplevel)
+{
+ xml_document doc;
+ CHECK(doc.load(STR("")).status == status_bad_doctype);
+ CHECK(doc.load(STR(""), parse_doctype).status == status_bad_doctype);
+}
diff --git a/tests/test_write.cpp b/tests/test_write.cpp
index 4237739..0904b21 100644
--- a/tests/test_write.cpp
+++ b/tests/test_write.cpp
@@ -63,6 +63,12 @@ TEST_XML_FLAGS(write_declaration, "", parse_default | parse
CHECK_NODE_EX(doc, STR("\n"), STR(""), 0);
}
+TEST_XML_FLAGS(write_doctype, "", parse_default | parse_doctype)
+{
+ CHECK_NODE(doc, STR(""));
+ CHECK_NODE_EX(doc, STR("\n"), STR(""), 0);
+}
+
TEST_XML(write_escape, "text")
{
doc.child(STR("node")).attribute(STR("attr")) = STR("<>'\"&\x04\r\n\t");