Skip to content
Snippets Groups Projects
test_parse.cpp 43.9 KiB
Newer Older
#include "writer_string.hpp"

TEST(parse_pi_skip)
{
	xml_document doc;

	unsigned int flag_sets[] = {parse_fragment, parse_fragment | parse_declaration};

	for (unsigned int i = 0; i < sizeof(flag_sets) / sizeof(flag_sets[0]); ++i)
	{
		unsigned int flags = flag_sets[i];

		CHECK(doc.load_string(STR("<?pi?><?pi value?>"), flags));
		CHECK(!doc.first_child());

		CHECK(doc.load_string(STR("<?pi <tag/> value?>"), flags));
		CHECK(!doc.first_child());
	}
}

TEST(parse_pi_parse)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<?pi1?><?pi2 value?>"), parse_fragment | parse_pi));

	xml_node pi1 = doc.first_child();
	xml_node pi2 = doc.last_child();

	CHECK(pi1 != pi2);
	CHECK(pi1.type() == node_pi);
	CHECK_STRING(pi1.name(), STR("pi1"));
	CHECK_STRING(pi1.value(), STR(""));
	CHECK(pi2.type() == node_pi);
	CHECK_STRING(pi2.name(), STR("pi2"));
	CHECK_STRING(pi2.value(), STR("value"));
}

TEST(parse_pi_parse_spaces)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<?target  \r\n\t  value ?>"), parse_fragment | parse_pi));

	xml_node pi = doc.first_child();

	CHECK(pi.type() == node_pi);
	CHECK_STRING(pi.name(), STR("target"));
	CHECK_STRING(pi.value(), STR("value "));
}

TEST(parse_pi_error)
{
	xml_document doc;

	unsigned int flag_sets[] = {parse_fragment, parse_fragment | parse_pi};

	for (unsigned int i = 0; i < sizeof(flag_sets) / sizeof(flag_sets[0]); ++i)
	{
		unsigned int flags = flag_sets[i];

		CHECK(doc.load_string(STR("<?"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<??"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?>"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?#?>"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name>"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name ?"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name?"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name? "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name?  "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name  "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name   "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name value"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name value "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name value  "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name value  ?"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name value  ? "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name value  ? >"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name value  ? > "), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name&"), flags).status == status_bad_pi);
		CHECK(doc.load_string(STR("<?name&?"), flags).status == status_bad_pi);
	CHECK(doc.load_string(STR("<?xx#?>"), parse_fragment | parse_pi).status == status_bad_pi);
	CHECK(doc.load_string(STR("<?name&?>"), parse_fragment | parse_pi).status == status_bad_pi);
	CHECK(doc.load_string(STR("<?name& x?>"), parse_fragment | parse_pi).status == status_bad_pi);
}

TEST(parse_comments_skip)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<!----><!--value-->"), parse_fragment));
	CHECK(!doc.first_child());
}

TEST(parse_comments_parse)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<!----><!--value-->"), parse_fragment | parse_comments));

	xml_node c1 = doc.first_child();
	xml_node c2 = doc.last_child();

	CHECK(c1 != c2);
	CHECK(c1.type() == node_comment);
	CHECK_STRING(c1.name(), STR(""));
	CHECK_STRING(c1.value(), STR(""));
	CHECK(c2.type() == node_comment);
	CHECK_STRING(c2.name(), STR(""));
	CHECK_STRING(c2.value(), STR("value"));
}

TEST(parse_comments_parse_no_eol)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<!--\r\rval1\rval2\r\nval3\nval4\r\r-->"), parse_fragment | parse_comments));

	xml_node c = doc.first_child();
	CHECK(c.type() == node_comment);
	CHECK_STRING(c.value(), STR("\r\rval1\rval2\r\nval3\nval4\r\r"));
}

TEST(parse_comments_parse_eol)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<!--\r\rval1\rval2\r\nval3\nval4\r\r-->"), parse_fragment | parse_comments | parse_eol));

	xml_node c = doc.first_child();
	CHECK(c.type() == node_comment);
	CHECK_STRING(c.value(), STR("\n\nval1\nval2\nval3\nval4\n\n"));
}

TEST(parse_comments_error)
{
	xml_document doc;

	unsigned int flag_sets[] = {parse_fragment, parse_fragment | parse_comments, parse_fragment | parse_comments | parse_eol};

	for (unsigned int i = 0; i < sizeof(flag_sets) / sizeof(flag_sets[0]); ++i)
	{
		unsigned int flags = flag_sets[i];

		CHECK(doc.load_string(STR("<!-"), flags).status == status_bad_comment);
		CHECK(doc.load_string(STR("<!--"), flags).status == status_bad_comment);
		CHECK(doc.load_string(STR("<!--v"), flags).status == status_bad_comment);
		CHECK(doc.load_string(STR("<!-->"), flags).status == status_bad_comment);
		CHECK(doc.load_string(STR("<!--->"), flags).status == status_bad_comment);
		CHECK(doc.load_string(STR("<!-- <!-- --><!- -->"), flags).status == status_bad_comment);
	}
}

TEST(parse_cdata_skip)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<![CDATA[]]><![CDATA[value]]>"), parse_fragment));
TEST(parse_cdata_skip_contents)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<node><![CDATA[]]>hello<![CDATA[value]]>, world!</node>"), parse_fragment));
	CHECK_NODE(doc, STR("<node>hello, world!</node>"));
}

TEST(parse_cdata_parse)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<![CDATA[]]><![CDATA[value]]>"), parse_fragment | parse_cdata));

	xml_node c1 = doc.first_child();
	xml_node c2 = doc.last_child();

	CHECK(c1 != c2);
	CHECK(c1.type() == node_cdata);
	CHECK_STRING(c1.name(), STR(""));
	CHECK_STRING(c1.value(), STR(""));
	CHECK(c2.type() == node_cdata);
	CHECK_STRING(c2.name(), STR(""));
	CHECK_STRING(c2.value(), STR("value"));
}

TEST(parse_cdata_parse_no_eol)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<![CDATA[\r\rval1\rval2\r\nval3\nval4\r\r]]>"), parse_fragment | parse_cdata));

	xml_node c = doc.first_child();
	CHECK(c.type() == node_cdata);
	CHECK_STRING(c.value(), STR("\r\rval1\rval2\r\nval3\nval4\r\r"));
}

TEST(parse_cdata_parse_eol)
{
	xml_document doc;
	CHECK(doc.load_string(STR("<![CDATA[\r\rval1\rval2\r\nval3\nval4\r\r]]>"), parse_fragment | parse_cdata | parse_eol));

	xml_node c = doc.first_child();
Loading
Loading full blame...