// SPDX-License-Identifier: LGPL-2.1-or-later #include #include "Base/Exception.h" #include "Base/Writer.h" // Writer is designed to be a base class, so for testing we actually instantiate a StringWriter, // which is derived from it class WriterTest: public ::testing::Test { protected: // void SetUp() override {} // void TearDown() override {} protected: Base::StringWriter _writer; }; TEST_F(WriterTest, insertTextSimple) { // Arrange std::string testTextData {"Simple ASCII data"}; std::string expectedResult {""}; // Act _writer.insertText(testTextData); // Assert EXPECT_EQ(expectedResult, _writer.getString()); } /// If the data happens to actually include an XML CDATA close marker, that needs to be "escaped" -- /// this is done by breaking it up into two separate CDATA sections, splitting apart the marker. TEST_F(WriterTest, insertTextNeedsEscape) { // Arrange std::string testDataA {"ASCII data with a close marker in it, like so: ]]"}; std::string testDataB {"> "}; std::string expectedResult {""}; // Act _writer.insertText(testDataA + testDataB); // Assert EXPECT_EQ(expectedResult, _writer.getString()); } TEST_F(WriterTest, insertNonAsciiData) { // Arrange std::string testData {"\x01\x02\x03\x04\u0001F450😀"}; std::string expectedResult {""}; // Act _writer.insertText(testData); // Assert EXPECT_EQ(expectedResult, _writer.getString()); } TEST_F(WriterTest, beginCharStream) { // Arrange & Act auto& checkStream {_writer.beginCharStream()}; // Assert EXPECT_TRUE(checkStream.good()); } TEST_F(WriterTest, beginCharStreamTwice) { // Arrange _writer.beginCharStream(); // Act & Assert EXPECT_THROW(_writer.beginCharStream(), Base::RuntimeError); } TEST_F(WriterTest, endCharStream) { // Arrange _writer.beginCharStream(); // Act _writer.endCharStream(); // Assert EXPECT_EQ("", _writer.getString()); } TEST_F(WriterTest, endCharStreamTwice) { // Arrange _writer.beginCharStream(); _writer.endCharStream(); // Act _writer.endCharStream(); // Doesn't throw, or do anything at all // Assert EXPECT_EQ("", _writer.getString()); } TEST_F(WriterTest, charStream) { // Arrange auto& streamA {_writer.beginCharStream()}; // Act auto& streamB {_writer.charStream()}; // Assert EXPECT_EQ(&streamA, &streamB); } TEST_F(WriterTest, charStreamBase64Encoded) { // Arrange _writer.beginCharStream(Base::CharStreamFormat::Base64Encoded); std::string data {"FreeCAD rocks! 🪨🪨🪨"}; // Act _writer.charStream() << data; _writer.endCharStream(); // Assert // Conversion done using https://www.base64encode.org for testing purposes EXPECT_EQ(std::string("RnJlZUNBRCByb2NrcyEg8J+qqPCfqqjwn6qo\n"), _writer.getString()); }