|
|
#include "unity/unity.h" |
|
|
#include <libxml/HTMLparser.h> |
|
|
#include <libxml/xmlerror.h> |
|
|
#include <string.h> |
|
|
#include <stdlib.h> |
|
|
|
|
|
|
|
|
extern void test_htmlParseErr(xmlParserCtxtPtr ctxt, xmlParserErrors error, |
|
|
const char *msg, const xmlChar *str1, const xmlChar *str2); |
|
|
|
|
|
static htmlParserCtxtPtr new_ctx(void) { |
|
|
htmlParserCtxtPtr ctxt = htmlNewParserCtxt(); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(ctxt, "Failed to create HTML parser context"); |
|
|
return ctxt; |
|
|
} |
|
|
|
|
|
static void free_ctx(htmlParserCtxtPtr ctxt) { |
|
|
if (ctxt) |
|
|
htmlFreeParserCtxt(ctxt); |
|
|
} |
|
|
|
|
|
void setUp(void) { |
|
|
|
|
|
} |
|
|
|
|
|
void tearDown(void) { |
|
|
|
|
|
} |
|
|
|
|
|
void test_htmlParseErr_sets_error_fields_basic(void) { |
|
|
htmlParserCtxtPtr ctxt = new_ctx(); |
|
|
|
|
|
const char *msg = "Simple error"; |
|
|
const xmlChar *s1 = (const xmlChar *)"s1"; |
|
|
const xmlChar *s2 = (const xmlChar *)"s2"; |
|
|
xmlParserErrors code = XML_ERR_INTERNAL_ERROR; |
|
|
|
|
|
test_htmlParseErr(ctxt, code, msg, s1, s2); |
|
|
|
|
|
const xmlErrorPtr err = xmlCtxtGetLastError((xmlParserCtxtPtr)ctxt); |
|
|
TEST_ASSERT_NOT_NULL(err); |
|
|
TEST_ASSERT_EQUAL_INT(XML_FROM_HTML, err->domain); |
|
|
TEST_ASSERT_EQUAL_INT(code, err->code); |
|
|
TEST_ASSERT_EQUAL_INT(XML_ERR_ERROR, err->level); |
|
|
TEST_ASSERT_EQUAL_PTR(s1, err->str1); |
|
|
TEST_ASSERT_EQUAL_PTR(s2, err->str2); |
|
|
TEST_ASSERT_NOT_NULL(err->message); |
|
|
|
|
|
TEST_ASSERT_EQUAL_INT_MESSAGE(0, strncmp(err->message, msg, strlen(msg)), |
|
|
"Error message prefix mismatch"); |
|
|
TEST_ASSERT_EQUAL_INT(0, err->int2); |
|
|
|
|
|
free_ctx(ctxt); |
|
|
} |
|
|
|
|
|
void test_htmlParseErr_handles_null_strings(void) { |
|
|
htmlParserCtxtPtr ctxt = new_ctx(); |
|
|
|
|
|
const char *msg = "No args"; |
|
|
test_htmlParseErr(ctxt, XML_ERR_DOCUMENT_EMPTY, msg, NULL, NULL); |
|
|
|
|
|
const xmlErrorPtr err = xmlCtxtGetLastError((xmlParserCtxtPtr)ctxt); |
|
|
TEST_ASSERT_NOT_NULL(err); |
|
|
TEST_ASSERT_EQUAL_INT(XML_FROM_HTML, err->domain); |
|
|
TEST_ASSERT_EQUAL_INT(XML_ERR_DOCUMENT_EMPTY, err->code); |
|
|
TEST_ASSERT_EQUAL_INT(XML_ERR_ERROR, err->level); |
|
|
TEST_ASSERT_NULL(err->str1); |
|
|
TEST_ASSERT_NULL(err->str2); |
|
|
TEST_ASSERT_NOT_NULL(err->message); |
|
|
TEST_ASSERT_EQUAL_INT(0, strncmp(err->message, msg, strlen(msg))); |
|
|
TEST_ASSERT_EQUAL_INT(0, err->int2); |
|
|
|
|
|
free_ctx(ctxt); |
|
|
} |
|
|
|
|
|
void test_htmlParseErr_formats_message_with_strs(void) { |
|
|
htmlParserCtxtPtr ctxt = new_ctx(); |
|
|
|
|
|
const char *msg = "Fmt: %s-%s"; |
|
|
const xmlChar *s1 = (const xmlChar *)"A"; |
|
|
const xmlChar *s2 = (const xmlChar *)"B"; |
|
|
|
|
|
test_htmlParseErr(ctxt, XML_ERR_ENTITYREF_SEMICOL_MISSING, msg, s1, s2); |
|
|
|
|
|
const xmlErrorPtr err = xmlCtxtGetLastError((xmlParserCtxtPtr)ctxt); |
|
|
TEST_ASSERT_NOT_NULL(err); |
|
|
TEST_ASSERT_EQUAL_INT(XML_FROM_HTML, err->domain); |
|
|
TEST_ASSERT_EQUAL_INT(XML_ERR_ENTITYREF_SEMICOL_MISSING, err->code); |
|
|
TEST_ASSERT_EQUAL_INT(XML_ERR_ERROR, err->level); |
|
|
TEST_ASSERT_EQUAL_PTR(s1, err->str1); |
|
|
TEST_ASSERT_EQUAL_PTR(s2, err->str2); |
|
|
TEST_ASSERT_NOT_NULL(err->message); |
|
|
TEST_ASSERT_NOT_NULL_MESSAGE(strstr(err->message, "Fmt: A-B"), |
|
|
"Formatted message not found"); |
|
|
TEST_ASSERT_EQUAL_INT(0, err->int2); |
|
|
|
|
|
free_ctx(ctxt); |
|
|
} |
|
|
|
|
|
void test_htmlParseErr_null_context_does_not_crash(void) { |
|
|
|
|
|
test_htmlParseErr(NULL, XML_ERR_INTERNAL_ERROR, "Should not crash", NULL, NULL); |
|
|
TEST_PASS_MESSAGE("Calling with NULL context did not crash"); |
|
|
} |
|
|
|
|
|
int main(void) { |
|
|
UNITY_BEGIN(); |
|
|
RUN_TEST(test_htmlParseErr_sets_error_fields_basic); |
|
|
RUN_TEST(test_htmlParseErr_handles_null_strings); |
|
|
RUN_TEST(test_htmlParseErr_formats_message_with_strs); |
|
|
RUN_TEST(test_htmlParseErr_null_context_does_not_crash); |
|
|
return UNITY_END(); |
|
|
} |