| | #include "unity/unity.h" |
| | #include <libxml/HTMLparser.h> |
| | #include <stdlib.h> |
| | #include <string.h> |
| |
|
| | |
| | int htmlAutoCloseTag(xmlDoc *doc, const xmlChar *name, xmlNode *elem); |
| |
|
| | static xmlDocPtr make_doc_with_root(const char *rootName, xmlNodePtr *outRoot) { |
| | xmlDocPtr doc = xmlNewDoc((const xmlChar *)"1.0"); |
| | TEST_ASSERT_NOT_NULL_MESSAGE(doc, "xmlNewDoc failed"); |
| |
|
| | xmlNodePtr root = xmlNewNode(NULL, (const xmlChar *)rootName); |
| | TEST_ASSERT_NOT_NULL_MESSAGE(root, "xmlNewNode failed for root"); |
| |
|
| | xmlDocSetRootElement(doc, root); |
| | if (outRoot) *outRoot = root; |
| | return doc; |
| | } |
| |
|
| | void setUp(void) { |
| | |
| | } |
| |
|
| | void tearDown(void) { |
| | |
| | } |
| |
|
| | |
| | void test_htmlAutoCloseTag_null_elem_returns_1(void) { |
| | int ret = htmlAutoCloseTag(NULL, (const xmlChar *)"li", NULL); |
| | TEST_ASSERT_EQUAL_INT(1, ret); |
| | } |
| |
|
| | |
| | void test_htmlAutoCloseTag_equal_name_returns_0(void) { |
| | xmlNodePtr root = NULL; |
| | xmlDocPtr doc = make_doc_with_root("p", &root); |
| |
|
| | int ret = htmlAutoCloseTag(doc, (const xmlChar *)"p", root); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| |
|
| | xmlFreeDoc(doc); |
| | } |
| |
|
| | |
| | void test_htmlAutoCloseTag_direct_autoclose_dd_by_dt_returns_1(void) { |
| | xmlNodePtr root = NULL; |
| | xmlDocPtr doc = make_doc_with_root("dd", &root); |
| |
|
| | int ret = htmlAutoCloseTag(doc, (const xmlChar *)"dt", root); |
| | TEST_ASSERT_EQUAL_INT(1, ret); |
| |
|
| | xmlFreeDoc(doc); |
| | } |
| |
|
| | |
| | void test_htmlAutoCloseTag_no_autoclose_div_vs_span_returns_0(void) { |
| | xmlNodePtr root = NULL; |
| | xmlDocPtr doc = make_doc_with_root("div", &root); |
| |
|
| | int ret = htmlAutoCloseTag(doc, (const xmlChar *)"span", root); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| |
|
| | xmlFreeDoc(doc); |
| | } |
| |
|
| | |
| | void test_htmlAutoCloseTag_descendant_dd_autoclosed_by_dt_returns_1(void) { |
| | xmlNodePtr root = NULL; |
| | xmlDocPtr doc = make_doc_with_root("div", &root); |
| |
|
| | xmlNodePtr child = xmlNewNode(NULL, (const xmlChar *)"dd"); |
| | TEST_ASSERT_NOT_NULL(child); |
| | xmlAddChild(root, child); |
| |
|
| | int ret = htmlAutoCloseTag(doc, (const xmlChar *)"dt", root); |
| | TEST_ASSERT_EQUAL_INT(1, ret); |
| |
|
| | xmlFreeDoc(doc); |
| | } |
| |
|
| | |
| | void test_htmlAutoCloseTag_sibling_second_child_matches_returns_1(void) { |
| | xmlNodePtr root = NULL; |
| | xmlDocPtr doc = make_doc_with_root("div", &root); |
| |
|
| | xmlNodePtr child1 = xmlNewNode(NULL, (const xmlChar *)"span"); |
| | xmlNodePtr child2 = xmlNewNode(NULL, (const xmlChar *)"dd"); |
| | TEST_ASSERT_NOT_NULL(child1); |
| | TEST_ASSERT_NOT_NULL(child2); |
| | xmlAddChild(root, child1); |
| | xmlAddChild(root, child2); |
| |
|
| | int ret = htmlAutoCloseTag(doc, (const xmlChar *)"dt", root); |
| | TEST_ASSERT_EQUAL_INT(1, ret); |
| |
|
| | xmlFreeDoc(doc); |
| | } |
| |
|
| | |
| | void test_htmlAutoCloseTag_top_equal_name_short_circuits_returns_0(void) { |
| | xmlNodePtr root = NULL; |
| | xmlDocPtr doc = make_doc_with_root("p", &root); |
| |
|
| | |
| | xmlNodePtr child = xmlNewNode(NULL, (const xmlChar *)"dd"); |
| | TEST_ASSERT_NOT_NULL(child); |
| | xmlAddChild(root, child); |
| |
|
| | int ret = htmlAutoCloseTag(doc, (const xmlChar *)"p", root); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| |
|
| | xmlFreeDoc(doc); |
| | } |
| |
|
| | |
| | void test_htmlAutoCloseTag_no_descendant_match_returns_0(void) { |
| | xmlNodePtr root = NULL; |
| | xmlDocPtr doc = make_doc_with_root("div", &root); |
| |
|
| | xmlNodePtr c1 = xmlNewNode(NULL, (const xmlChar *)"span"); |
| | xmlNodePtr c2 = xmlNewNode(NULL, (const xmlChar *)"em"); |
| | TEST_ASSERT_NOT_NULL(c1); |
| | TEST_ASSERT_NOT_NULL(c2); |
| | xmlAddChild(root, c1); |
| | xmlAddChild(root, c2); |
| |
|
| | int ret = htmlAutoCloseTag(doc, (const xmlChar *)"span", root); |
| | TEST_ASSERT_EQUAL_INT(0, ret); |
| |
|
| | xmlFreeDoc(doc); |
| | } |
| |
|
| | int main(void) { |
| | UNITY_BEGIN(); |
| |
|
| | RUN_TEST(test_htmlAutoCloseTag_null_elem_returns_1); |
| | RUN_TEST(test_htmlAutoCloseTag_equal_name_returns_0); |
| | RUN_TEST(test_htmlAutoCloseTag_direct_autoclose_dd_by_dt_returns_1); |
| | RUN_TEST(test_htmlAutoCloseTag_no_autoclose_div_vs_span_returns_0); |
| | RUN_TEST(test_htmlAutoCloseTag_descendant_dd_autoclosed_by_dt_returns_1); |
| | RUN_TEST(test_htmlAutoCloseTag_sibling_second_child_matches_returns_1); |
| | RUN_TEST(test_htmlAutoCloseTag_top_equal_name_short_circuits_returns_0); |
| | RUN_TEST(test_htmlAutoCloseTag_no_descendant_match_returns_0); |
| |
|
| | return UNITY_END(); |
| | } |