| #include "unity/unity.h" |
| #include <libxml/HTMLtree.h> |
|
|
| #include <libxml/tree.h> |
| #include <libxml/xmlIO.h> |
| #include <libxml/parser.h> |
| #include <string.h> |
| #include <stdlib.h> |
|
|
| |
| extern void test_htmlDtdDumpOutput(xmlOutputBufferPtr buf, xmlDocPtr doc, const char *encoding); |
|
|
| static char* run_dump_and_get_string(xmlDocPtr doc) { |
| xmlBufferPtr xbuf = xmlBufferCreate(); |
| TEST_ASSERT_NOT_NULL_MESSAGE(xbuf, "Failed to create xmlBuffer"); |
|
|
| xmlOutputBufferPtr out = xmlOutputBufferCreateBuffer(xbuf, NULL); |
| TEST_ASSERT_NOT_NULL_MESSAGE(out, "Failed to create xmlOutputBuffer"); |
|
|
| test_htmlDtdDumpOutput(out, doc, "utf-8"); |
|
|
| |
| xmlOutputBufferFlush(out); |
|
|
| const xmlChar *content = xmlBufferContent(xbuf); |
| int len = xmlBufferLength(xbuf); |
| if (len < 0) len = 0; |
|
|
| char *ret = (char *)malloc((size_t)len + 1); |
| TEST_ASSERT_NOT_NULL_MESSAGE(ret, "malloc failed"); |
| if (len > 0 && content != NULL) { |
| memcpy(ret, content, (size_t)len); |
| } |
| ret[len] = '\0'; |
|
|
| xmlOutputBufferClose(out); |
| xmlBufferFree(xbuf); |
|
|
| return ret; |
| } |
|
|
| void setUp(void) { |
| xmlInitParser(); |
| } |
|
|
| void tearDown(void) { |
| xmlCleanupParser(); |
| } |
|
|
| static xmlDocPtr make_doc(void) { |
| xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
| TEST_ASSERT_NOT_NULL_MESSAGE(doc, "xmlNewDoc failed"); |
| return doc; |
| } |
|
|
| void test_htmlDtdDumpOutput_no_subset_outputs_nothing(void) { |
| xmlDocPtr doc = make_doc(); |
|
|
| char *out = run_dump_and_get_string(doc); |
| TEST_ASSERT_NOT_NULL(out); |
| TEST_ASSERT_EQUAL_STRING("", out); |
|
|
| free(out); |
| xmlFreeDoc(doc); |
| } |
|
|
| void test_htmlDtdDumpOutput_name_only(void) { |
| xmlDocPtr doc = make_doc(); |
| xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", NULL, NULL); |
| TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
| char *out = run_dump_and_get_string(doc); |
| TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html>\n", out); |
|
|
| free(out); |
| xmlFreeDoc(doc); |
| } |
|
|
| void test_htmlDtdDumpOutput_public_only(void) { |
| xmlDocPtr doc = make_doc(); |
| xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", |
| BAD_CAST "PUBLIC_ID", |
| NULL); |
| TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
| char *out = run_dump_and_get_string(doc); |
| TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html PUBLIC \"PUBLIC_ID\">\n", out); |
|
|
| free(out); |
| xmlFreeDoc(doc); |
| } |
|
|
| void test_htmlDtdDumpOutput_system_only_non_legacy(void) { |
| xmlDocPtr doc = make_doc(); |
| xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", |
| NULL, |
| BAD_CAST "http://example.com/sys.dtd"); |
| TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
| char *out = run_dump_and_get_string(doc); |
| TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html SYSTEM \"http://example.com/sys.dtd\">\n", out); |
|
|
| free(out); |
| xmlFreeDoc(doc); |
| } |
|
|
| void test_htmlDtdDumpOutput_system_only_legacy_compat_suppressed(void) { |
| xmlDocPtr doc = make_doc(); |
| xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", |
| NULL, |
| BAD_CAST "about:legacy-compat"); |
| TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
| char *out = run_dump_and_get_string(doc); |
| |
| TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html>\n", out); |
|
|
| free(out); |
| xmlFreeDoc(doc); |
| } |
|
|
| void test_htmlDtdDumpOutput_public_and_system(void) { |
| xmlDocPtr doc = make_doc(); |
| xmlDtdPtr dtd = xmlCreateIntSubset(doc, BAD_CAST "html", |
| BAD_CAST "-//W3C//DTD HTML 4.01//EN", |
| BAD_CAST "http://www.w3.org/TR/html4/strict.dtd"); |
| TEST_ASSERT_NOT_NULL_MESSAGE(dtd, "xmlCreateIntSubset failed"); |
|
|
| char *out = run_dump_and_get_string(doc); |
| TEST_ASSERT_EQUAL_STRING("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n", out); |
|
|
| free(out); |
| xmlFreeDoc(doc); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
|
|
| RUN_TEST(test_htmlDtdDumpOutput_no_subset_outputs_nothing); |
| RUN_TEST(test_htmlDtdDumpOutput_name_only); |
| RUN_TEST(test_htmlDtdDumpOutput_public_only); |
| RUN_TEST(test_htmlDtdDumpOutput_system_only_non_legacy); |
| RUN_TEST(test_htmlDtdDumpOutput_system_only_legacy_compat_suppressed); |
| RUN_TEST(test_htmlDtdDumpOutput_public_and_system); |
|
|
| return UNITY_END(); |
| } |