#include "unity/unity.h" #include #include #include #include /* Wrapper provided in the module for the static function */ extern int test_htmlParseLookupCommentEnd(htmlParserCtxtPtr ctxt); static htmlParserCtxtPtr makeCtxtFromString(const char *s) { htmlParserCtxtPtr ctxt = htmlNewParserCtxt(); TEST_ASSERT_NOT_NULL_MESSAGE(ctxt, "htmlNewParserCtxt failed"); xmlParserInputPtr in = xmlNewStringInputStream((xmlParserCtxtPtr)ctxt, (const xmlChar *)s); TEST_ASSERT_NOT_NULL_MESSAGE(in, "xmlNewStringInputStream failed"); int pushed = inputPush((xmlParserCtxtPtr)ctxt, in); TEST_ASSERT_TRUE_MESSAGE(pushed >= 1, "inputPush failed"); /* Start fresh for each test */ ctxt->checkIndex = 0; return ctxt; } void setUp(void) { /* No global init required here; contexts are created per-test */ } void tearDown(void) { /* No global teardown needed */ } /* Minimal valid comment end: */ void test_htmlParseLookupCommentEnd_simple_end_arrow(void) { const char *s = ""; htmlParserCtxtPtr ctxt = makeCtxtFromString(s); int ret = test_htmlParseLookupCommentEnd(ctxt); TEST_ASSERT_EQUAL_INT(2, ret); TEST_ASSERT_EQUAL_INT(0, ctxt->checkIndex); htmlFreeParserCtxt(ctxt); } /* Invalid: "; htmlParserCtxtPtr ctxt = makeCtxtFromString(s); int ret = test_htmlParseLookupCommentEnd(ctxt); TEST_ASSERT_EQUAL_INT(-1, ret); /* The function will have searched and not found a valid end */ htmlFreeParserCtxt(ctxt); } /* Invalid: "; htmlParserCtxtPtr ctxt = makeCtxtFromString(s); int ret = test_htmlParseLookupCommentEnd(ctxt); TEST_ASSERT_EQUAL_INT(-1, ret); htmlFreeParserCtxt(ctxt); } /* Valid: should terminate at the --!> (offset 4) */ void test_htmlParseLookupCommentEnd_dash_dash_bang_valid(void) { const char *s = ""; htmlParserCtxtPtr ctxt = makeCtxtFromString(s); int ret = test_htmlParseLookupCommentEnd(ctxt); TEST_ASSERT_EQUAL_INT(4, ret); TEST_ASSERT_EQUAL_INT(0, ctxt->checkIndex); htmlFreeParserCtxt(ctxt); } /* Incomplete buffer: "" is found: "" should return 6 */ void test_htmlParseLookupCommentEnd_skip_non_terminators_then_close(void) { const char *s = ""; htmlParserCtxtPtr ctxt = makeCtxtFromString(s); int ret = test_htmlParseLookupCommentEnd(ctxt); TEST_ASSERT_EQUAL_INT(6, ret); TEST_ASSERT_EQUAL_INT(0, ctxt->checkIndex); htmlFreeParserCtxt(ctxt); } /* Skip past a false '!'-sequence, then close: "" should return 6 */ void test_htmlParseLookupCommentEnd_skip_false_bang_then_close(void) { const char *s = ""; htmlParserCtxtPtr ctxt = makeCtxtFromString(s); int ret = test_htmlParseLookupCommentEnd(ctxt); TEST_ASSERT_EQUAL_INT(6, ret); TEST_ASSERT_EQUAL_INT(0, ctxt->checkIndex); htmlFreeParserCtxt(ctxt); } /* No "--" present at all: "" should return -1 */ void test_htmlParseLookupCommentEnd_no_hyphens(void) { const char *s = ""; htmlParserCtxtPtr ctxt = makeCtxtFromString(s); int ret = test_htmlParseLookupCommentEnd(ctxt); TEST_ASSERT_EQUAL_INT(-1, ret); htmlFreeParserCtxt(ctxt); } int main(void) { UNITY_BEGIN(); RUN_TEST(test_htmlParseLookupCommentEnd_simple_end_arrow); RUN_TEST(test_htmlParseLookupCommentEnd_bang_invalid); RUN_TEST(test_htmlParseLookupCommentEnd_dash_bang_invalid); RUN_TEST(test_htmlParseLookupCommentEnd_dash_dash_bang_valid); RUN_TEST(test_htmlParseLookupCommentEnd_incomplete_needs_more_offset2); RUN_TEST(test_htmlParseLookupCommentEnd_incomplete_after_bang); RUN_TEST(test_htmlParseLookupCommentEnd_skip_non_terminators_then_close); RUN_TEST(test_htmlParseLookupCommentEnd_skip_false_bang_then_close); RUN_TEST(test_htmlParseLookupCommentEnd_no_hyphens); return UNITY_END(); }