|
|
#include "unity/unity.h" |
|
|
#include <libxml/HTMLtree.h> |
|
|
|
|
|
#include <libxml/tree.h> |
|
|
#include <libxml/parser.h> |
|
|
#include <libxml/xmlstring.h> |
|
|
#include <string.h> |
|
|
#include <stdint.h> |
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
#include "private/buf.h" |
|
|
|
|
|
|
|
|
extern size_t test_htmlBufNodeDumpFormat(xmlBufPtr buf, xmlDocPtr doc, xmlNodePtr cur, int format); |
|
|
|
|
|
static xmlBufPtr make_buf(void) { |
|
|
xmlBufPtr buf = xmlBufCreate(); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(buf, "Failed to create xmlBuf"); |
|
|
return buf; |
|
|
} |
|
|
|
|
|
static void assert_buf_equals(xmlBufPtr buf, const char *expected) { |
|
|
size_t expected_len = strlen(expected); |
|
|
const xmlChar *content = xmlBufContent(buf); |
|
|
size_t used = xmlBufUse(buf); |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)expected_len, (uint64_t)used); |
|
|
TEST_ASSERT_NOT_NULL(content); |
|
|
TEST_ASSERT_EQUAL_INT(0, memcmp((const char *)content, expected, expected_len)); |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
xmlInitParser(); |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
xmlCleanupParser(); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_htmlBufNodeDumpFormat_null_cur_returns_minus_one(void) { |
|
|
xmlBufPtr buf = make_buf(); |
|
|
size_t ret = test_htmlBufNodeDumpFormat(buf, NULL, NULL, 0); |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)(size_t)-1, (uint64_t)ret); |
|
|
xmlBufFree(buf); |
|
|
} |
|
|
|
|
|
void test_htmlBufNodeDumpFormat_null_buf_returns_minus_one(void) { |
|
|
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "div"); |
|
|
TEST_ASSERT_NOT_NULL(node); |
|
|
size_t ret = test_htmlBufNodeDumpFormat(NULL, NULL, node, 0); |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)(size_t)-1, (uint64_t)ret); |
|
|
xmlFreeNode(node); |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void test_htmlBufNodeDumpFormat_empty_html_empty_elem_br(void) { |
|
|
xmlBufPtr buf = make_buf(); |
|
|
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "br"); |
|
|
TEST_ASSERT_NOT_NULL(node); |
|
|
|
|
|
size_t ret = test_htmlBufNodeDumpFormat(buf, NULL, node, 0); |
|
|
const char *expected = "<br>"; |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)strlen(expected), (uint64_t)ret); |
|
|
assert_buf_equals(buf, expected); |
|
|
|
|
|
xmlFreeNode(node); |
|
|
xmlBufFree(buf); |
|
|
} |
|
|
|
|
|
void test_htmlBufNodeDumpFormat_non_empty_without_children_div(void) { |
|
|
xmlBufPtr buf = make_buf(); |
|
|
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "div"); |
|
|
TEST_ASSERT_NOT_NULL(node); |
|
|
|
|
|
size_t ret = test_htmlBufNodeDumpFormat(buf, NULL, node, 0); |
|
|
const char *expected = "<div></div>"; |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)strlen(expected), (uint64_t)ret); |
|
|
assert_buf_equals(buf, expected); |
|
|
|
|
|
xmlFreeNode(node); |
|
|
xmlBufFree(buf); |
|
|
} |
|
|
|
|
|
void test_htmlBufNodeDumpFormat_text_child_with_escaping(void) { |
|
|
xmlBufPtr buf = make_buf(); |
|
|
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "div"); |
|
|
TEST_ASSERT_NOT_NULL(node); |
|
|
xmlNodePtr text = xmlNewText(BAD_CAST "5 < 6 & 7"); |
|
|
TEST_ASSERT_NOT_NULL(text); |
|
|
xmlAddChild(node, text); |
|
|
|
|
|
size_t ret = test_htmlBufNodeDumpFormat(buf, NULL, node, 0); |
|
|
const char *expected = "<div>5 < 6 & 7</div>"; |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)strlen(expected), (uint64_t)ret); |
|
|
assert_buf_equals(buf, expected); |
|
|
|
|
|
xmlFreeNode(node); |
|
|
xmlBufFree(buf); |
|
|
} |
|
|
|
|
|
void test_htmlBufNodeDumpFormat_namespace_prefix_and_declaration(void) { |
|
|
xmlBufPtr buf = make_buf(); |
|
|
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "span"); |
|
|
TEST_ASSERT_NOT_NULL(node); |
|
|
|
|
|
|
|
|
xmlNsPtr ns = xmlNewNs(node, BAD_CAST "urn:test", BAD_CAST "x"); |
|
|
TEST_ASSERT_NOT_NULL(ns); |
|
|
xmlSetNs(node, ns); |
|
|
|
|
|
size_t ret = test_htmlBufNodeDumpFormat(buf, NULL, node, 0); |
|
|
const char *expected = "<x:span xmlns:x=\"urn:test\"></x:span>"; |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)strlen(expected), (uint64_t)ret); |
|
|
assert_buf_equals(buf, expected); |
|
|
|
|
|
xmlFreeNode(node); |
|
|
xmlBufFree(buf); |
|
|
} |
|
|
|
|
|
void test_htmlBufNodeDumpFormat_multiple_calls_append_and_return_increment(void) { |
|
|
xmlBufPtr buf = make_buf(); |
|
|
xmlNodePtr node = xmlNewNode(NULL, BAD_CAST "div"); |
|
|
TEST_ASSERT_NOT_NULL(node); |
|
|
|
|
|
const char *once = "<div></div>"; |
|
|
|
|
|
size_t ret1 = test_htmlBufNodeDumpFormat(buf, NULL, node, 0); |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)strlen(once), (uint64_t)ret1); |
|
|
assert_buf_equals(buf, once); |
|
|
|
|
|
size_t before = xmlBufUse(buf); |
|
|
size_t ret2 = test_htmlBufNodeDumpFormat(buf, NULL, node, 0); |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)strlen(once), (uint64_t)ret2); |
|
|
size_t after = xmlBufUse(buf); |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)(before + strlen(once)), (uint64_t)after); |
|
|
|
|
|
const xmlChar *content = xmlBufContent(buf); |
|
|
TEST_ASSERT_NOT_NULL(content); |
|
|
TEST_ASSERT_EQUAL_INT(0, memcmp((const char *)content, once, strlen(once))); |
|
|
TEST_ASSERT_EQUAL_INT(0, memcmp((const char *)content + strlen(once), once, strlen(once))); |
|
|
|
|
|
xmlFreeNode(node); |
|
|
xmlBufFree(buf); |
|
|
} |
|
|
|
|
|
void test_htmlBufNodeDumpFormat_formatting_newlines_with_block_children(void) { |
|
|
xmlBufPtr buf = make_buf(); |
|
|
|
|
|
|
|
|
xmlNodePtr div = xmlNewNode(NULL, BAD_CAST "div"); |
|
|
TEST_ASSERT_NOT_NULL(div); |
|
|
xmlNodePtr span1 = xmlNewNode(NULL, BAD_CAST "span"); |
|
|
xmlAddChild(span1, xmlNewText(BAD_CAST "1")); |
|
|
xmlAddChild(div, span1); |
|
|
xmlNodePtr span2 = xmlNewNode(NULL, BAD_CAST "span"); |
|
|
xmlAddChild(span2, xmlNewText(BAD_CAST "2")); |
|
|
xmlAddChild(div, span2); |
|
|
|
|
|
size_t ret = test_htmlBufNodeDumpFormat(buf, NULL, div, 1); |
|
|
|
|
|
|
|
|
const char *expected = "<div>\n<span>1</span><span>2</span>\n</div>"; |
|
|
TEST_ASSERT_EQUAL_UINT64((uint64_t)strlen(expected), (uint64_t)ret); |
|
|
assert_buf_equals(buf, expected); |
|
|
|
|
|
xmlFreeNode(div); |
|
|
xmlBufFree(buf); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_htmlBufNodeDumpFormat_null_cur_returns_minus_one); |
|
|
RUN_TEST(test_htmlBufNodeDumpFormat_null_buf_returns_minus_one); |
|
|
RUN_TEST(test_htmlBufNodeDumpFormat_empty_html_empty_elem_br); |
|
|
RUN_TEST(test_htmlBufNodeDumpFormat_non_empty_without_children_div); |
|
|
RUN_TEST(test_htmlBufNodeDumpFormat_text_child_with_escaping); |
|
|
RUN_TEST(test_htmlBufNodeDumpFormat_namespace_prefix_and_declaration); |
|
|
RUN_TEST(test_htmlBufNodeDumpFormat_multiple_calls_append_and_return_increment); |
|
|
RUN_TEST(test_htmlBufNodeDumpFormat_formatting_newlines_with_block_children); |
|
|
return UNITY_END(); |
|
|
} |