aboutsummaryrefslogtreecommitdiff
path: root/test/base
diff options
context:
space:
mode:
authorYuqian Yang <crupest@crupest.life>2025-11-04 21:59:42 +0800
committerYuqian Yang <crupest@crupest.life>2025-11-04 21:59:42 +0800
commit1a6111e3f02b0a9cff0f81fb524b4dfb7d69854b (patch)
tree3a92e1bf61fc165c2148f38ca6602f5066011f06 /test/base
parentf48505c96a70e2f1d1982fea30f3015e42fcd49d (diff)
downloadcru-1a6111e3f02b0a9cff0f81fb524b4dfb7d69854b.tar.gz
cru-1a6111e3f02b0a9cff0f81fb524b4dfb7d69854b.tar.bz2
cru-1a6111e3f02b0a9cff0f81fb524b4dfb7d69854b.zip
Move xml to base.
Diffstat (limited to 'test/base')
-rw-r--r--test/base/CMakeLists.txt1
-rw-r--r--test/base/xml/ParserTest.cpp116
2 files changed, 117 insertions, 0 deletions
diff --git a/test/base/CMakeLists.txt b/test/base/CMakeLists.txt
index 39895c3e..b36bbd23 100644
--- a/test/base/CMakeLists.txt
+++ b/test/base/CMakeLists.txt
@@ -6,6 +6,7 @@ add_executable(CruBaseTest
StringUtilTest.cpp
SubProcessTest.cpp
TimerTest.cpp
+ xml/ParserTest.cpp
)
target_link_libraries(CruBaseTest PRIVATE CruBase CruTestBase)
diff --git a/test/base/xml/ParserTest.cpp b/test/base/xml/ParserTest.cpp
new file mode 100644
index 00000000..f7544f02
--- /dev/null
+++ b/test/base/xml/ParserTest.cpp
@@ -0,0 +1,116 @@
+#include "cru/base/xml/XmlNode.h"
+#include "cru/base/xml/XmlParser.h"
+
+#include <catch2/catch_test_macros.hpp>
+
+using namespace cru::xml;
+
+TEST_CASE("CruXmlParserTest Simple", "[xml]") {
+ XmlParser parser("<root></root>");
+ auto n = parser.Parse();
+ REQUIRE(n->GetTag() == "root");
+ REQUIRE(n->GetAttributes().empty() == true);
+ REQUIRE(n->GetChildCount() == 0);
+ delete n;
+}
+
+TEST_CASE("CruXmlParserTest SimpleWithAttribute", "[xml]") {
+ XmlParser parser("<root a1=\"v1\" a2=\"v2\"></root>");
+ auto n = parser.Parse();
+ REQUIRE(n->GetTag() == "root");
+ REQUIRE(n->GetAttributeValue("a1") == "v1");
+ REQUIRE(n->GetAttributeValue("a2") == "v2");
+ REQUIRE(n->GetChildCount() == 0);
+ delete n;
+}
+
+TEST_CASE("CruXmlParserTest SimpleSelfClosing", "[xml]") {
+ XmlParser parser("<root a1=\"v1\" a2=\"v2\"/>");
+ auto n = parser.Parse();
+ REQUIRE(n->GetTag() == "root");
+ REQUIRE(n->GetAttributeValue("a1") == "v1");
+ REQUIRE(n->GetAttributeValue("a2") == "v2");
+ REQUIRE(n->GetChildCount() == 0);
+ delete n;
+}
+
+TEST_CASE("CruXmlParserTest NestedElement", "[xml]") {
+ XmlParser parser(
+ "<root><c1><d1></d1></c1><c2><d2></d2><d3></d3></c2></root>");
+ auto n = parser.Parse();
+ REQUIRE(n->GetChildren().size() == 2);
+ REQUIRE(n->GetChildAt(0)->AsElement()->GetTag() == "c1");
+ REQUIRE(n->GetChildAt(1)->AsElement()->GetTag() == "c2");
+ REQUIRE(n->GetChildAt(0)->AsElement()->GetChildCount() == 1);
+ REQUIRE(n->GetChildAt(0)->AsElement()->GetChildAt(0)->AsElement()->GetTag() ==
+ "d1");
+ REQUIRE(n->GetChildAt(1)->AsElement()->GetChildCount() == 2);
+ REQUIRE(n->GetChildAt(1)->AsElement()->GetChildAt(0)->AsElement()->GetTag() ==
+ "d2");
+ REQUIRE(n->GetChildAt(1)->AsElement()->GetChildAt(1)->AsElement()->GetTag() ==
+ "d3");
+ delete n;
+}
+
+TEST_CASE("CruXmlParserTest SimpleText", "[xml]") {
+ XmlParser parser("<root>text</root>");
+ auto n = parser.Parse();
+ REQUIRE(n->GetChildCount() == 1);
+ REQUIRE(n->GetChildAt(0)->AsText()->GetText() == "text");
+ delete n;
+}
+
+TEST_CASE("CruXmlParserTest Whitespace", "[xml]") {
+ XmlParser parser("\t\t<root>\n\t\t\ttext test\n\t\t</root>\t\t");
+ auto n = parser.Parse();
+ REQUIRE(n->GetChildCount() == 1);
+ REQUIRE(n->GetChildAt(0)->AsText()->GetText() == "text test");
+ delete n;
+}
+
+TEST_CASE("CruXmlParserTest Comment", "[xml]") {
+ XmlParser parser("<!-- comment -->");
+ auto n = parser.Parse();
+ REQUIRE(n->IsCommentNode());
+ REQUIRE(n->AsComment()->GetText() == "comment");
+ delete n;
+}
+
+TEST_CASE("CruXmlParserTest Complex", "[xml]") {
+ XmlParser parser(
+ R"(
+<root a1="v1">
+ <c1>
+ <d1>
+ </d1>
+ </c1>
+ <c2 a2="v2" a3="v3">
+ t1
+ <d2 a4="v4"> t2 </d2>
+ text test
+ <d3></d3>
+ t2
+ </c2>
+ <!-- comment -->
+</root>
+ )");
+ auto n = parser.Parse();
+ REQUIRE(n->GetAttributeValue("a1") == "v1");
+ REQUIRE(n->GetChildCount() == 3);
+ REQUIRE(n->GetChildAt(0)->AsElement()->GetTag() == "c1");
+ REQUIRE(n->GetChildAt(0)->AsElement()->GetChildCount() == 1);
+ auto c2 = n->GetChildAt(1)->AsElement();
+ REQUIRE(c2->GetTag() == "c2");
+ REQUIRE(c2->GetAttributeValue("a2") == "v2");
+ REQUIRE(c2->GetAttributeValue("a3") == "v3");
+ REQUIRE(c2->GetChildAt(0)->AsText()->GetText() == "t1");
+ auto d2 = c2->GetChildAt(1)->AsElement();
+ REQUIRE(d2->GetTag() == "d2");
+ REQUIRE(d2->GetAttributeValue("a4") == "v4");
+ REQUIRE(c2->GetChildAt(2)->AsText()->GetText() == "text test");
+ REQUIRE(c2->GetChildAt(3)->AsElement()->GetTag() == "d3");
+ REQUIRE(c2->GetChildAt(4)->AsText()->GetText() == "t2");
+ REQUIRE(n->GetChildAt(2)->IsCommentNode());
+ REQUIRE(n->GetChildAt(2)->AsComment()->GetText() == "comment");
+ delete n;
+}