/* * Copyright (c) 2022, Luke Wilde * * SPDX-License-Identifier: BSD-2-Clause */ #include #include TEST_CASE(char_data_ending) { EXPECT_NO_CRASH("parsing character data ending by itself should not crash", [] { // After seeing ``, the parser will start parsing the content of the element. The content parser will then parse any character data it sees. // The character parser would see the first two `]]` and consume them. Then, it would see the `>` and set the state machine to say we have seen this, // but it did _not_ consume it and would instead tell GenericLexer that it should stop consuming characters. Therefore, we only consumed 2 characters. // Then, it would see that we are in the state where we've seen the full `]]>` and try to take off three characters from the end of the consumed // input when we only have 2 characters, causing an assertion failure as we are asking to take off more characters than there really is. XML::Parser parser("]]>"sv); (void)parser.parse(); return Test::Crash::Failure::DidNotCrash; }); } TEST_CASE(character_reference_integer_overflow) { EXPECT_NO_CRASH("parsing character references that do not fit in 32 bits should not crash", [] { XML::Parser parser("�"sv); (void)parser.parse(); return Test::Crash::Failure::DidNotCrash; }); } TEST_CASE(predefined_character_reference) { XML::Parser parser("Well hello &, <, >, ', and "!"sv); auto document = MUST(parser.parse()); auto const& node = document.root().content.get(); EXPECT_EQ(node.name, "a"); auto const& content = node.children[0]->content.get(); EXPECT_EQ(content.builder.string_view(), "Well hello &, <, >, ', and \"!"); }