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