// SPDX-License-Identifier: LGPL-2.1-or-later #include #include class TestXMLTools: public testing::Test { }; TEST_F(TestXMLTools, EscapeXmlEmptyString) { EXPECT_EQ(XMLTools::escapeXml(""), ""); } TEST_F(TestXMLTools, EscapeXmlNoChangesForSafeText) { EXPECT_EQ(XMLTools::escapeXml("abcXYZ_123"), "abcXYZ_123"); EXPECT_EQ(XMLTools::escapeXml("hello world"), "hello world"); EXPECT_EQ(XMLTools::escapeXml("line1\nline2\tend"), "line1\nline2\tend"); } TEST_F(TestXMLTools, EscapeXmlEscapesAmpersand) { EXPECT_EQ(XMLTools::escapeXml("&"), "&"); EXPECT_EQ(XMLTools::escapeXml("a&b"), "a&b"); } TEST_F(TestXMLTools, EscapeXmlEscapesLessThanAndGreaterThan) { EXPECT_EQ(XMLTools::escapeXml("<"), "<"); EXPECT_EQ(XMLTools::escapeXml(">"), ">"); EXPECT_EQ(XMLTools::escapeXml("ab"), "a>b"); EXPECT_EQ(XMLTools::escapeXml("ac"), "a<b>c"); } TEST_F(TestXMLTools, EscapeXmlEscapesQuotes) { EXPECT_EQ(XMLTools::escapeXml("\""), """); EXPECT_EQ(XMLTools::escapeXml("'"), "'"); EXPECT_EQ(XMLTools::escapeXml("a\"b"), "a"b"); EXPECT_EQ(XMLTools::escapeXml("a'b"), "a'b"); } TEST_F(TestXMLTools, EscapeXmlEscapesAllFiveInOneString) { // input: & < > " ' EXPECT_EQ(XMLTools::escapeXml("&<>\"'"), "&<>"'"); } TEST_F(TestXMLTools, EscapeXmlDoesNotDoubleEscapeNewlyInsertedEntities) { // This test specifically catches the classic bug where you replace // '<' with "<" and then later replace '&' with "&" and end up with "&lt;". EXPECT_EQ(XMLTools::escapeXml("<"), "<"); EXPECT_EQ(XMLTools::escapeXml(">"), ">"); EXPECT_EQ(XMLTools::escapeXml("\""), """); EXPECT_EQ(XMLTools::escapeXml("'"), "'"); } TEST_F(TestXMLTools, EscapeXmlComplexMixedContent) { const std::string in = "Tom & Jerry <\"fun\"> 'n' games"; const std::string out = "Tom & Jerry <"fun"> 'n' games"; EXPECT_EQ(XMLTools::escapeXml(in), out); } TEST_F(TestXMLTools, EscapeXmlMultipleAdjacentCharacters) { EXPECT_EQ(XMLTools::escapeXml("&&&&"), "&&&&"); EXPECT_EQ(XMLTools::escapeXml("<<<<"), "<<<<"); EXPECT_EQ(XMLTools::escapeXml("\"\"''"), """''"); } TEST_F(TestXMLTools, EscapeXmlPreservesWhitespaceAndControlCommonInText) { EXPECT_EQ(XMLTools::escapeXml(" a \r\n b \t c "), " a \r\n b \t c "); }