From 7bda2cb529550fae678224102e1c5d0697dacf04 Mon Sep 17 00:00:00 2001 From: "arseny.kapoulkine" Date: Mon, 10 May 2010 19:15:44 +0000 Subject: Implemented better DOCTYPE parsing, added more DOCTYPE tests git-svn-id: http://pugixml.googlecode.com/svn/trunk@409 99668b35-9821-0410-8761-19e4c4f06640 --- tests/test_parse.cpp | 29 -------------- tests/test_parse_doctype.cpp | 92 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+), 29 deletions(-) create mode 100644 tests/test_parse_doctype.cpp (limited to 'tests') diff --git a/tests/test_parse.cpp b/tests/test_parse.cpp index 0719e5d..fb0dd23 100644 --- a/tests/test_parse.cpp +++ b/tests/test_parse.cpp @@ -497,35 +497,6 @@ TEST(parse_declaration_error) CHECK(doc.load(STR(""), parse_minimal | parse_declaration).status == status_bad_attribute); } -TEST(parse_doctype_skip) -{ - xml_document doc; - CHECK(doc.load(STR("")) && !doc.first_child()); - CHECK(doc.load(STR("")) && !doc.first_child()); - CHECK(doc.load(STR("")) && !doc.first_child()); - CHECK(doc.load(STR("")) && !doc.first_child()); - CHECK(doc.load(STR("")) && !doc.first_child()); - CHECK(doc.load(STR("]>")) && !doc.first_child()); - - CHECK(doc.load(STR("]>"))); - CHECK_NODE(doc, STR("")); -} - -TEST(parse_doctype_error) -{ - xml_document doc; - CHECK(doc.load(STR("")).status == status_bad_doctype); - CHECK(doc.load(STR("]")).status == status_bad_doctype); - CHECK(doc.load(STR("] ")).status == status_bad_doctype); -} - TEST(parse_empty) { xml_document doc; diff --git a/tests/test_parse_doctype.cpp b/tests/test_parse_doctype.cpp new file mode 100644 index 0000000..35015ff --- /dev/null +++ b/tests/test_parse_doctype.cpp @@ -0,0 +1,92 @@ +#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("