#define _CRT_SECURE_NO_WARNINGS #include "test.hpp" #include #include #include using namespace pugi; static xml_parse_result load_concat(xml_document& doc, const char_t* a, const char_t* b = STR(""), const char_t* c = STR("")) { char_t buffer[768]; #ifdef PUGIXML_WCHAR_MODE wcscpy(buffer, a); wcscat(buffer, b); wcscat(buffer, c); #else strcpy(buffer, a); strcat(buffer, b); strcat(buffer, c); #endif return doc.load_string(buffer, parse_fragment); } static bool test_doctype_wf(const char_t* decl) { xml_document doc; // standalone if (!load_concat(doc, decl) || !doc.first_child().empty()) return false; // pcdata pre/postfix if (!load_concat(doc, STR("a"), decl) || !test_node(doc, STR("a"), STR(""), format_raw)) return false; if (!load_concat(doc, decl, STR("b")) || !test_node(doc, STR("b"), STR(""), format_raw)) return false; if (!load_concat(doc, STR("a"), decl, STR("b")) || !test_node(doc, STR("ab"), STR(""), format_raw)) return false; // node pre/postfix if (!load_concat(doc, STR(""), decl) || !test_node(doc, STR(""), STR(""), format_raw)) return false; 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; // check load-store contents preservation CHECK(doc.load_string(decl, parse_doctype | parse_fragment)); CHECK_NODE(doc, decl); return true; } static bool test_doctype_nwf(const char_t* decl) { xml_document doc; // standalone if (load_concat(doc, decl).status != status_bad_doctype) return false; // pcdata postfix if (load_concat(doc, decl, STR("b")).status != status_bad_doctype) return false; // node postfix if (load_concat(doc, decl, STR("")).status != status_bad_doctype) return false; return true; } #define TEST_DOCTYPE_WF(contents) CHECK(test_doctype_wf(STR(contents))) #define TEST_DOCTYPE_NWF(contents) CHECK(test_doctype_nwf(STR(contents))) TEST(parse_doctype_skip) { TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF("]>"); } TEST(parse_doctype_error) { TEST_DOCTYPE_NWF(""); TEST_DOCTYPE_NWF("]"); TEST_DOCTYPE_NWF("] "); } // Examples from W3C recommendations TEST(parse_doctype_w3c_wf) { TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]]> ]]>]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); } TEST(parse_doctype_w3c_nwf) { TEST_DOCTYPE_NWF(""); TEST_DOCTYPE_NWF(" ]"); TEST_DOCTYPE_NWF(""); TEST_DOCTYPE_NWF(" ]"); TEST_DOCTYPE_NWF(""); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" %e; ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" \"> ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" %pe; %intpe; ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF("]]> ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_NWF(" \"> \"> "); TEST_DOCTYPE_WF(" ]>"); } TEST(parse_doctype_xmlconf_eduni_2) { TEST_DOCTYPE_WF("\"> %pe; ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); } TEST(parse_doctype_xmlconf_eduni_3) { TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF("\"> ]>"); } TEST(parse_doctype_xmlconf_eduni_4) { TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); } TEST(parse_doctype_xmlconf_eduni_5) { TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); } TEST(parse_doctype_xmlconf_ibm_1) { TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" %pe1; ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" \"> %pe3; ]>"); TEST_DOCTYPE_WF(" '> %pe1; ]>"); } TEST(parse_doctype_xmlconf_ibm_2) { TEST_DOCTYPE_WF(" \"> ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" &generalE; \"> %parameterE; ] animal>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_NWF(" \"> ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]]> ]>"); TEST_DOCTYPE_WF(" ]]> ]>"); TEST_DOCTYPE_NWF(" ]]> ]>"); TEST_DOCTYPE_WF(" ]]> ]>"); TEST_DOCTYPE_WF(" ]]> ]>"); TEST_DOCTYPE_WF(" [INCLUDE ]]> ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_WF(" %paaa; \"> ]>"); TEST_DOCTYPE_WF(" \"> %paaa; ]>"); TEST_DOCTYPE_NWF(" \" %paaa; ]>"); TEST_DOCTYPE_WF(" ]>"); } TEST(parse_doctype_xmlconf_ibm_3) { TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(""); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_WF(" IN PI ?> ]>"); TEST_DOCTYPE_WF(" \"> \"> \"> %make_leopard_element; %make_small; \"> %make_big; %make_attlist; ]>"); TEST_DOCTYPE_WF("\"> ]]> %rootElement; \"> %make_tiger_element; ]]> ]>"); TEST_DOCTYPE_WF(" General entity reference in element content\"> ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF("'. These must be balanced ]>"); TEST_DOCTYPE_WF("'. These must be balanced ]]> ]]> ]>"); TEST_DOCTYPE_WF("'. These must be balanced ]]> nesting ]]> nesting again ]]> end ]]> ]>"); TEST_DOCTYPE_WF(" \"> %pe1; ]> ]>"); } TEST(parse_doctype_xmlconf_oasis_1) { TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF("\"> ]]> %rootel; ]]> ]>"); TEST_DOCTYPE_WF(" ]]>]]> ]>"); TEST_DOCTYPE_WF(" ]]>]]> ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_WF(" ]]> ]>"); TEST_DOCTYPE_NWF(" ]>"); TEST_DOCTYPE_WF(" '. These must be balanced, but it is no section keyword is required: ] ]> ]] > ]]> ]]> ]>"); TEST_DOCTYPE_WF(" ?>/\''\"> ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF("]>"); // not actually a doctype :) xml_document doc; CHECK(doc.load_string(STR(" "), parse_full | parse_fragment) && doc.first_child().type() == node_comment && doc.last_child().type() == node_comment && doc.first_child().next_sibling() == doc.last_child()); CHECK(doc.load_string(STR(" &a%b&#c?>"), parse_full | parse_fragment) && doc.first_child().type() == node_pi && doc.first_child() == doc.last_child()); } TEST(parse_doctype_xmlconf_xmltest_1) { TEST_DOCTYPE_NWF(" ]> ]>"); TEST_DOCTYPE_NWF(" "); TEST_DOCTYPE_NWF(" "); TEST_DOCTYPE_WF(" %e; -->"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF(" ]>"); TEST_DOCTYPE_WF("\"> ]>"); TEST_DOCTYPE_WF(" \"> ]>"); } TEST_XML_FLAGS(parse_doctype_value, " \"> ]>", parse_fragment | 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_string(STR("")).status == status_bad_doctype); CHECK(doc.load_string(STR(""), parse_doctype).status == status_bad_doctype); } TEST(parse_doctype_error_ignore) { xml_document doc; CHECK(doc.load_string(STR(" str; int count = 100000; str += STR(""); str += STR(">"); xml_document doc; CHECK(doc.load_string(str.c_str(), parse_fragment)); } TEST(parse_doctype_stackless_ignore) { std::basic_string str; int count = 100000; str += STR(""); str += STR(">"); xml_document doc; CHECK(doc.load_string(str.c_str(), parse_fragment)); }