Skip to content
Snippets Groups Projects
test_parse.cpp 38.6 KiB
Newer Older
		{ encoding_utf16_be, "\xfe\xff", 2, STR("") },
		{ encoding_utf16_be, "\xfe\xff\x00t\x00o\x00s\x00t", 10, STR("tost") },
		{ encoding_utf16_le, "\xff\xfe", 2, STR("") },
		{ encoding_utf16_le, "\xff\xfet\x00o\x00s\x00t\x00", 10, STR("tost") },
		{ encoding_utf32_be, "\x00\x00\xfe\xff", 4, STR("") },
		{ encoding_utf32_be, "\x00\x00\xfe\xff\x00\x00\x00t\x00\x00\x00o\x00\x00\x00s\x00\x00\x00t", 20, STR("tost") },
		{ encoding_utf32_le, "\xff\xfe\x00\x00", 4, STR("") },
		{ encoding_utf32_le, "\xff\xfe\x00\x00t\x00\x00\x00o\x00\x00\x00s\x00\x00\x00t\x00\x00\x00", 20, STR("tost") },
	};

	for (size_t i = 0; i < sizeof(data) / sizeof(data[0]); ++i)
	{
		xml_document doc;
		CHECK(doc.load_buffer(data[i].data, data[i].size, parse_fragment, data[i].encoding));
		CHECK_STRING(doc.text().get(), data[i].text);
		CHECK(save_narrow(doc, format_no_declaration | format_raw | format_write_bom, data[i].encoding) == std::string(data[i].data, data[i].size));
	}
}

TEST(parse_bom_fragment_invalid_utf8)
{
	xml_document doc;

	CHECK(doc.load_buffer("\xef\xbb\xbb", 3, parse_fragment, encoding_utf8));

	const char_t* value = doc.text().get();

#ifdef PUGIXML_WCHAR_MODE
	CHECK(value[0] == wchar_cast(0xfefb) && value[1] == 0);
#else
	CHECK_STRING(value, "\xef\xbb\xbb");
#endif
}

TEST(parse_bom_fragment_invalid_utf16)
{
	xml_document doc;

	CHECK(doc.load_buffer("\xff\xfe", 2, parse_fragment, encoding_utf16_be));

	const char_t* value = doc.text().get();

#ifdef PUGIXML_WCHAR_MODE
	CHECK(value[0] == wchar_cast(0xfffe) && value[1] == 0);
#else
	CHECK_STRING(value, "\xef\xbf\xbe");
#endif
}

TEST(parse_bom_fragment_invalid_utf32)
{
	xml_document doc;

	CHECK(doc.load_buffer("\xff\xff\x00\x00", 4, parse_fragment, encoding_utf32_le));

	const char_t* value = doc.text().get();

#ifdef PUGIXML_WCHAR_MODE
	CHECK(value[0] == wchar_cast(0xffff) && value[1] == 0);
#else
	CHECK_STRING(value, "\xef\xbf\xbf");
#endif
}

TEST(parse_pcdata_gap_fragment)
{
	xml_document doc;
	CHECK(doc.load(STR("a&amp;b"), parse_fragment | parse_escapes));
	CHECK_STRING(doc.text().get(), STR("a&b"));
Arseny Kapoulkine's avatar
Arseny Kapoulkine committed
}

TEST(parse_name_end_eof)
{
	char_t test[] = STR("<node>");

	xml_document doc;
	CHECK(doc.load_buffer_inplace(test, 6 * sizeof(char_t)).status == status_end_element_mismatch);
	CHECK_STRING(doc.first_child().name(), STR("node"));
}

TEST(parse_close_tag_eof)
{
	char_t test1[] = STR("<node></node");
	char_t test2[] = STR("<node></nodx");

	xml_document doc;
	CHECK(doc.load_buffer_inplace(test1, 12 * sizeof(char_t)).status == status_bad_end_element);
	CHECK_STRING(doc.first_child().name(), STR("node"));

	CHECK(doc.load_buffer_inplace(test2, 12 * sizeof(char_t)).status == status_end_element_mismatch);
	CHECK_STRING(doc.first_child().name(), STR("node"));
}