80 lines
2.5 KiB
C++
80 lines
2.5 KiB
C++
// SPDX-License-Identifier: LGPL-2.1-or-later
|
|
|
|
#include <gtest/gtest.h>
|
|
#include <Base/XMLTools.h>
|
|
|
|
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("a<b"), "a<b");
|
|
EXPECT_EQ(XMLTools::escapeXml("a>b"), "a>b");
|
|
EXPECT_EQ(XMLTools::escapeXml("a<b>c"), "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 ");
|
|
}
|