| #include "unity/unity.h" |
| #include <libxml/HTMLparser.h> |
|
|
| #include <libxml/parser.h> |
| #include <libxml/parserInternals.h> |
| #include <string.h> |
| #include <stdlib.h> |
|
|
| |
| extern int test_htmlParseLookupString(xmlParserCtxtPtr ctxt, size_t startDelta, |
| const char *str, size_t strLen, size_t extraLen); |
|
|
| static xmlParserCtxtPtr make_ctxt(const char *buf) { |
| |
| size_t len = strlen(buf); |
| xmlParserCtxtPtr ctxt = xmlCreateMemoryParserCtxt(buf, (int)len); |
| return ctxt; |
| } |
|
|
| void setUp(void) { |
| xmlInitParser(); |
| } |
|
|
| void tearDown(void) { |
| |
| xmlCleanupParser(); |
| } |
|
|
| |
| void test_htmlParseLookupString_basic_found(void) { |
| const char *buf = "zzabcYYY"; |
| xmlParserCtxtPtr ctxt = make_ctxt(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| int ret = test_htmlParseLookupString(ctxt, 2, "abc", 3, 0); |
| TEST_ASSERT_EQUAL_INT(2, ret); |
| TEST_ASSERT_EQUAL_INT(0, ctxt->checkIndex); |
|
|
| xmlFreeParserCtxt(ctxt); |
| } |
|
|
| |
| void test_htmlParseLookupString_not_found_sets_checkIndex_rescan(void) { |
| const char *buf = "abcdef"; |
| xmlParserCtxtPtr ctxt = make_ctxt(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| |
| int ret = test_htmlParseLookupString(ctxt, 0, "xyz", 3, 2); |
| TEST_ASSERT_EQUAL_INT(-1, ret); |
| TEST_ASSERT_EQUAL_INT(2, ctxt->checkIndex); |
|
|
| xmlFreeParserCtxt(ctxt); |
| } |
|
|
| |
| void test_htmlParseLookupString_found_but_too_close_to_end_treated_as_not_found(void) { |
| const char *buf = "abXY"; |
| xmlParserCtxtPtr ctxt = make_ctxt(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| |
| |
| int ret = test_htmlParseLookupString(ctxt, 0, "XY", 2, 2); |
| TEST_ASSERT_EQUAL_INT(-1, ret); |
| TEST_ASSERT_EQUAL_INT(1, ctxt->checkIndex); |
|
|
| xmlFreeParserCtxt(ctxt); |
| } |
|
|
| |
| void test_htmlParseLookupString_uses_checkIndex_over_startDelta_and_resets_on_success(void) { |
| const char *buf = "1234567abc"; |
| xmlParserCtxtPtr ctxt = make_ctxt(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| |
| |
| int ret1 = test_htmlParseLookupString(ctxt, 0, "abc", 3, 4); |
| TEST_ASSERT_EQUAL_INT(-1, ret1); |
| TEST_ASSERT_EQUAL_INT(4, ctxt->checkIndex); |
|
|
| |
| |
| int ret2 = test_htmlParseLookupString(ctxt, 8, "abc", 3, 0); |
| TEST_ASSERT_EQUAL_INT(7, ret2); |
| TEST_ASSERT_EQUAL_INT(0, ctxt->checkIndex); |
|
|
| xmlFreeParserCtxt(ctxt); |
| } |
|
|
| |
| void test_htmlParseLookupString_rescan_ge_remaining_forces_zero_index(void) { |
| const char *buf = "abcde"; |
| xmlParserCtxtPtr ctxt = make_ctxt(buf); |
| TEST_ASSERT_NOT_NULL(ctxt); |
| TEST_ASSERT_NOT_NULL(ctxt->input); |
|
|
| |
| int ret = test_htmlParseLookupString(ctxt, 0, "nop", 3, 3); |
| TEST_ASSERT_EQUAL_INT(-1, ret); |
| TEST_ASSERT_EQUAL_INT(0, ctxt->checkIndex); |
|
|
| xmlFreeParserCtxt(ctxt); |
| } |
|
|
| int main(void) { |
| UNITY_BEGIN(); |
| RUN_TEST(test_htmlParseLookupString_basic_found); |
| RUN_TEST(test_htmlParseLookupString_not_found_sets_checkIndex_rescan); |
| RUN_TEST(test_htmlParseLookupString_found_but_too_close_to_end_treated_as_not_found); |
| RUN_TEST(test_htmlParseLookupString_uses_checkIndex_over_startDelta_and_resets_on_success); |
| RUN_TEST(test_htmlParseLookupString_rescan_ge_remaining_forces_zero_index); |
| return UNITY_END(); |
| } |