|
|
#include "unity/unity.h" |
|
|
#include <libxml/HTMLparser.h> |
|
|
|
|
|
#include <libxml/tree.h> |
|
|
#include <libxml/parser.h> |
|
|
#include <libxml/xmlmemory.h> |
|
|
#include <string.h> |
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
extern int test_areBlanks(htmlParserCtxtPtr ctxt, const xmlChar *str, int len); |
|
|
|
|
|
static htmlParserCtxtPtr make_ctx_with_input(const char *s) { |
|
|
return htmlCreateMemoryParserCtxt(s, (int)strlen(s)); |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
xmlInitParser(); |
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_non_whitespace_returns_minus1(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input(""); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
|
|
|
const xmlChar *str = BAD_CAST "a"; |
|
|
int res = test_areBlanks(ctxt, str, 1); |
|
|
TEST_ASSERT_EQUAL_INT(-1, res); |
|
|
|
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_empty_input_cur0_returns1(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input(""); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
|
|
|
const xmlChar *str = BAD_CAST " \t"; |
|
|
int res = test_areBlanks(ctxt, str, (int)xmlStrlen(str)); |
|
|
TEST_ASSERT_EQUAL_INT(1, res); |
|
|
|
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_cur_not_lt_returns0(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("x"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
|
|
|
const xmlChar *str = BAD_CAST " \n"; |
|
|
int res = test_areBlanks(ctxt, str, (int)xmlStrlen(str)); |
|
|
TEST_ASSERT_EQUAL_INT(0, res); |
|
|
|
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_cur_lt_name_null_returns1(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = NULL; |
|
|
|
|
|
const xmlChar *str = BAD_CAST " \t"; |
|
|
int res = test_areBlanks(ctxt, str, (int)xmlStrlen(str)); |
|
|
TEST_ASSERT_EQUAL_INT(1, res); |
|
|
|
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_name_html_returns1(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = BAD_CAST "html"; |
|
|
|
|
|
const xmlChar *str = BAD_CAST " "; |
|
|
int res = test_areBlanks(ctxt, str, (int)xmlStrlen(str)); |
|
|
TEST_ASSERT_EQUAL_INT(1, res); |
|
|
|
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_name_head_returns1(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = BAD_CAST "head"; |
|
|
|
|
|
const xmlChar *str = BAD_CAST "\n\t "; |
|
|
int res = test_areBlanks(ctxt, str, 3); |
|
|
TEST_ASSERT_EQUAL_INT(1, res); |
|
|
|
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_name_body_html401_dtd_returns1(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = BAD_CAST "body"; |
|
|
|
|
|
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
|
|
TEST_ASSERT_NOT_NULL(doc); |
|
|
xmlCreateIntSubset(doc, BAD_CAST "html", |
|
|
BAD_CAST "-//W3C//DTD HTML 4.01//EN", |
|
|
NULL); |
|
|
ctxt->myDoc = doc; |
|
|
|
|
|
const xmlChar *str = BAD_CAST " \t "; |
|
|
int res = test_areBlanks(ctxt, str, (int)xmlStrlen(str)); |
|
|
TEST_ASSERT_EQUAL_INT(1, res); |
|
|
|
|
|
xmlFreeDoc(doc); |
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_node_null_returns0(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = BAD_CAST "nothtml"; |
|
|
ctxt->myDoc = NULL; |
|
|
ctxt->node = NULL; |
|
|
|
|
|
const xmlChar *str = BAD_CAST " \n"; |
|
|
int res = test_areBlanks(ctxt, str, (int)xmlStrlen(str)); |
|
|
TEST_ASSERT_EQUAL_INT(0, res); |
|
|
|
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_lastChild_null_non_element_with_content_returns0(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = BAD_CAST "x_test_tag"; |
|
|
|
|
|
xmlNodePtr textNode = xmlNewText(BAD_CAST "abc"); |
|
|
TEST_ASSERT_NOT_NULL(textNode); |
|
|
ctxt->node = textNode; |
|
|
|
|
|
const xmlChar *str = BAD_CAST " "; |
|
|
int res = test_areBlanks(ctxt, str, (int)xmlStrlen(str)); |
|
|
TEST_ASSERT_EQUAL_INT(0, res); |
|
|
|
|
|
xmlFreeNode(textNode); |
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_lastChild_is_text_returns0(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = BAD_CAST "x_test_tag"; |
|
|
|
|
|
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
|
|
TEST_ASSERT_NOT_NULL(doc); |
|
|
xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "div"); |
|
|
TEST_ASSERT_NOT_NULL(root); |
|
|
xmlDocSetRootElement(doc, root); |
|
|
xmlAddChild(root, xmlNewText(BAD_CAST "hi")); |
|
|
ctxt->myDoc = doc; |
|
|
ctxt->node = root; |
|
|
|
|
|
const xmlChar *str = BAD_CAST " "; |
|
|
int res = test_areBlanks(ctxt, str, 1); |
|
|
TEST_ASSERT_EQUAL_INT(0, res); |
|
|
|
|
|
xmlFreeDoc(doc); |
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_comment_only_child_skipped_then_returns1(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = BAD_CAST "unlikely_tag_name_123"; |
|
|
|
|
|
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
|
|
TEST_ASSERT_NOT_NULL(doc); |
|
|
xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "container"); |
|
|
TEST_ASSERT_NOT_NULL(root); |
|
|
xmlDocSetRootElement(doc, root); |
|
|
|
|
|
xmlNodePtr comment = xmlNewComment(BAD_CAST "just a comment"); |
|
|
TEST_ASSERT_NOT_NULL(comment); |
|
|
xmlAddChild(root, comment); |
|
|
|
|
|
ctxt->myDoc = doc; |
|
|
ctxt->node = root; |
|
|
|
|
|
const xmlChar *str = BAD_CAST "\t "; |
|
|
int res = test_areBlanks(ctxt, str, 2); |
|
|
TEST_ASSERT_EQUAL_INT(1, res); |
|
|
|
|
|
xmlFreeDoc(doc); |
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
|
|
|
void test_areBlanks_lastChild_element_not_in_pcdata_returns1(void) { |
|
|
htmlParserCtxtPtr ctxt = make_ctx_with_input("<"); |
|
|
TEST_ASSERT_NOT_NULL(ctxt); |
|
|
ctxt->name = BAD_CAST "unlikely_parent_name_456"; |
|
|
|
|
|
xmlDocPtr doc = xmlNewDoc(BAD_CAST "1.0"); |
|
|
TEST_ASSERT_NOT_NULL(doc); |
|
|
xmlNodePtr root = xmlNewNode(NULL, BAD_CAST "rootx"); |
|
|
TEST_ASSERT_NOT_NULL(root); |
|
|
xmlDocSetRootElement(doc, root); |
|
|
|
|
|
xmlNodePtr child = xmlNewNode(NULL, BAD_CAST "zzz_not_pcdata"); |
|
|
TEST_ASSERT_NOT_NULL(child); |
|
|
xmlAddChild(root, child); |
|
|
|
|
|
ctxt->myDoc = doc; |
|
|
ctxt->node = root; |
|
|
|
|
|
const xmlChar *str = BAD_CAST " "; |
|
|
int res = test_areBlanks(ctxt, str, 1); |
|
|
TEST_ASSERT_EQUAL_INT(1, res); |
|
|
|
|
|
xmlFreeDoc(doc); |
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_areBlanks_non_whitespace_returns_minus1); |
|
|
RUN_TEST(test_areBlanks_empty_input_cur0_returns1); |
|
|
RUN_TEST(test_areBlanks_cur_not_lt_returns0); |
|
|
RUN_TEST(test_areBlanks_cur_lt_name_null_returns1); |
|
|
RUN_TEST(test_areBlanks_name_html_returns1); |
|
|
RUN_TEST(test_areBlanks_name_head_returns1); |
|
|
RUN_TEST(test_areBlanks_name_body_html401_dtd_returns1); |
|
|
RUN_TEST(test_areBlanks_node_null_returns0); |
|
|
RUN_TEST(test_areBlanks_lastChild_null_non_element_with_content_returns0); |
|
|
RUN_TEST(test_areBlanks_lastChild_is_text_returns0); |
|
|
RUN_TEST(test_areBlanks_comment_only_child_skipped_then_returns1); |
|
|
RUN_TEST(test_areBlanks_lastChild_element_not_in_pcdata_returns1); |
|
|
return UNITY_END(); |
|
|
} |