";
xmlSAXHandler sax;
memset(&sax, 0, sizeof(sax));
sax.startElement = sax_start;
sax.endElement = sax_end;
TestSaxCounters counters = {0};
htmlParserCtxtPtr ctxt = make_ctxt_with_input(src, 0, &sax, &counters);
int ret = test_htmlParseElementInternal(ctxt);
TEST_ASSERT_EQUAL_INT(1, ret);
TEST_ASSERT_EQUAL_INT(1, counters.startCount);
TEST_ASSERT_EQUAL_INT(0, counters.endCount);
TEST_ASSERT_EQUAL_STRING("div", counters.lastStart);
/* Name should remain as current element since not empty */
TEST_ASSERT_NOT_NULL(ctxt->name);
TEST_ASSERT_TRUE(xmlStrEqual(ctxt->name, BAD_CAST "div"));
htmlFreeParserCtxt(ctxt);
}
void test_htmlParseElementInternal_self_closing_non_html5_calls_endElement_and_returns_0(void) {
const char *src = "
";
xmlSAXHandler sax;
memset(&sax, 0, sizeof(sax));
sax.startElement = sax_start;
sax.endElement = sax_end;
TestSaxCounters counters = {0};
htmlParserCtxtPtr ctxt = make_ctxt_with_input(src, 0, &sax, &counters);
int ret = test_htmlParseElementInternal(ctxt);
TEST_ASSERT_EQUAL_INT(0, ret);
TEST_ASSERT_EQUAL_INT(1, counters.startCount);
TEST_ASSERT_EQUAL_INT(1, counters.endCount);
TEST_ASSERT_EQUAL_STRING("input", counters.lastStart);
TEST_ASSERT_EQUAL_STRING("input", counters.lastEnd);
htmlFreeParserCtxt(ctxt);
}
void test_htmlParseElementInternal_self_closing_html5_does_not_call_endElement_returns_0(void) {
const char *src = "
";
xmlSAXHandler sax;
memset(&sax, 0, sizeof(sax));
sax.startElement = sax_start;
sax.endElement = sax_end;
TestSaxCounters counters = {0};
htmlParserCtxtPtr ctxt = make_ctxt_with_input(src, 1, &sax, &counters);
int ret = test_htmlParseElementInternal(ctxt);
TEST_ASSERT_EQUAL_INT(0, ret);
TEST_ASSERT_EQUAL_INT(1, counters.startCount);
TEST_ASSERT_EQUAL_INT(0, counters.endCount);
TEST_ASSERT_EQUAL_STRING("input", counters.lastStart);
htmlFreeParserCtxt(ctxt);
}
void test_htmlParseElementInternal_dtd_empty_without_solidus_returns_0_and_calls_end(void) {
const char *src = "
";
xmlSAXHandler sax;
memset(&sax, 0, sizeof(sax));
sax.startElement = sax_start;
sax.endElement = sax_end;
TestSaxCounters counters = {0};
htmlParserCtxtPtr ctxt = make_ctxt_with_input(src, 0, &sax, &counters);
int ret = test_htmlParseElementInternal(ctxt);
TEST_ASSERT_EQUAL_INT(0, ret);
TEST_ASSERT_EQUAL_INT(1, counters.startCount);
TEST_ASSERT_EQUAL_INT(1, counters.endCount);
TEST_ASSERT_EQUAL_STRING("br", counters.lastStart);
TEST_ASSERT_EQUAL_STRING("br", counters.lastEnd);
htmlFreeParserCtxt(ctxt);
}
void test_htmlParseElementInternal_missing_gt_returns_0_and_no_callbacks(void) {
const char *src = "
";
xmlSAXHandler sax;
memset(&sax, 0, sizeof(sax));
sax.startElement = sax_start;
sax.endElement = sax_end;
TestSaxCounters counters = {0};
htmlParserCtxtPtr ctxt = make_ctxt_with_input(src, 0, &sax, &counters);
TEST_ASSERT_EQUAL_INT(0, ctxt->endCheckState);
int ret = test_htmlParseElementInternal(ctxt);
TEST_ASSERT_EQUAL_INT(1, ret);
TEST_ASSERT_EQUAL_INT(1, counters.startCount);
TEST_ASSERT_EQUAL_INT(0, counters.endCount);
TEST_ASSERT_EQUAL_INT(0, ctxt->endCheckState); /* remains unchanged */
htmlFreeParserCtxt(ctxt);
}
int main(void) {
UNITY_BEGIN();
RUN_TEST(test_htmlParseElementInternal_null_context_returns_0);
RUN_TEST(test_htmlParseElementInternal_null_input_returns_0);
RUN_TEST(test_htmlParseElementInternal_nonempty_tag_returns_1_and_callbacks);
RUN_TEST(test_htmlParseElementInternal_self_closing_non_html5_calls_endElement_and_returns_0);
RUN_TEST(test_htmlParseElementInternal_self_closing_html5_does_not_call_endElement_returns_0);
RUN_TEST(test_htmlParseElementInternal_dtd_empty_without_solidus_returns_0_and_calls_end);
RUN_TEST(test_htmlParseElementInternal_missing_gt_returns_0_and_no_callbacks);
RUN_TEST(test_htmlParseElementInternal_unknown_tag_keeps_endCheckState_zero_returns_1);
return UNITY_END();
}