#include "common.hpp" #include static bool test_doctype_wf(const std::basic_string& decl) { xml_document doc; // standalone if (!doc.load(decl.c_str()) || (bool)doc.first_child()) return false; // pcdata pre/postfix if (!doc.load((STR("a") + decl).c_str()) || (bool)doc.first_child()) return false; if (!doc.load((decl + STR("b")).c_str()) || (bool)doc.first_child()) return false; if (!doc.load((STR("a") + decl + STR("b")).c_str()) || (bool)doc.first_child()) return false; // node pre/postfix if (!doc.load((STR("") + decl).c_str()) || !test_node(doc, STR(""), STR(""), format_raw)) return false; if (!doc.load((decl + STR("")).c_str()) || !test_node(doc, STR(""), STR(""), format_raw)) return false; if (!doc.load((STR("") + decl + STR("")).c_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 (!doc.load((STR("") + decl + STR("")).c_str()) || !test_node(doc, STR(""), STR(""), format_raw)) return false; return true; } static bool test_doctype_nwf(const std::basic_string& decl) { xml_document doc; // standalone if (doc.load(decl.c_str()).status != status_bad_doctype) return false; // pcdata postfix if (doc.load((decl + STR("b")).c_str()).status != status_bad_doctype) return false; // node postfix if (doc.load((decl + STR("")).c_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 :) TEST_DOCTYPE_WF(" &a%b&#c?>"); // not actually a doctype :) TEST_DOCTYPE_WF("]>"); } 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(" \"> ]>"); }