Beef up tests for CFX_XMLNode insertions.
Also add helper functions to make expected results more obvious.
Change-Id: Id122b388600a42beb7525ebbcef4757603fca2cc
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/54351
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fxcrt/xml/cfx_xmlnode_unittest.cpp b/core/fxcrt/xml/cfx_xmlnode_unittest.cpp
index e707d80..6055e92 100644
--- a/core/fxcrt/xml/cfx_xmlnode_unittest.cpp
+++ b/core/fxcrt/xml/cfx_xmlnode_unittest.cpp
@@ -2,9 +2,32 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/xml/cfx_xmlelement.h"
#include "testing/gtest/include/gtest/gtest.h"
+namespace {
+
+WideString ChildrenString(CFX_XMLElement* pParent) {
+ WideString result;
+ for (CFX_XMLNode* pChild = pParent->GetFirstChild(); pChild;
+ pChild = pChild->GetNextSibling()) {
+ result += static_cast<CFX_XMLElement*>(pChild)->GetName();
+ }
+ return result;
+}
+
+WideString ReverseChildrenString(CFX_XMLElement* pParent) {
+ WideString result;
+ for (CFX_XMLNode* pChild = pParent->GetLastChildForTesting(); pChild;
+ pChild = pChild->GetPrevSiblingForTesting()) {
+ result = static_cast<CFX_XMLElement*>(pChild)->GetName() + result;
+ }
+ return result;
+}
+
+} // namespace
+
TEST(CFX_XMLNodeTest, GetParent) {
CFX_XMLElement node1(L"node");
CFX_XMLElement node2(L"node2");
@@ -78,35 +101,47 @@
}
TEST(CFX_XMLNodeTest, AddingChildren) {
- CFX_XMLElement node1(L"node");
- CFX_XMLElement node2(L"node2");
- CFX_XMLElement node3(L"node3");
+ CFX_XMLElement parent(L"Root");
+ CFX_XMLElement nodeA(L"A");
+ CFX_XMLElement nodeB(L"B");
- node1.AppendChild(&node2);
- node1.AppendChild(&node3);
+ parent.AppendChild(&nodeA);
+ parent.AppendChild(&nodeB);
- EXPECT_EQ(&node1, node2.GetParent());
- EXPECT_EQ(&node1, node3.GetParent());
+ EXPECT_EQ(L"AB", ChildrenString(&parent));
+ EXPECT_EQ(L"AB", ReverseChildrenString(&parent));
+ EXPECT_EQ(&parent, nodeA.GetParent());
+ EXPECT_EQ(&parent, nodeB.GetParent());
+ EXPECT_EQ(&nodeA, parent.GetFirstChild());
+ EXPECT_EQ(&nodeB, nodeA.GetNextSibling());
+ EXPECT_TRUE(nodeB.GetNextSibling() == nullptr);
- EXPECT_EQ(&node2, node1.GetFirstChild());
- EXPECT_EQ(&node3, node2.GetNextSibling());
- EXPECT_TRUE(node3.GetNextSibling() == nullptr);
+ // Insert to negative appends last child.
+ CFX_XMLElement nodeC(L"C");
+ parent.InsertChildNode(&nodeC, -1);
+ EXPECT_EQ(L"ABC", ChildrenString(&parent));
+ EXPECT_EQ(L"ABC", ReverseChildrenString(&parent));
+ EXPECT_EQ(&parent, nodeC.GetParent());
+ EXPECT_EQ(&nodeC, nodeB.GetNextSibling());
+ EXPECT_TRUE(nodeC.GetNextSibling() == nullptr);
- // Insert to negative appends.
- CFX_XMLElement node4(L"node4");
- node1.InsertChildNode(&node4, -1);
- EXPECT_EQ(&node1, node4.GetParent());
- EXPECT_EQ(&node4, node3.GetNextSibling());
- EXPECT_TRUE(node4.GetNextSibling() == nullptr);
+ // Insertion occurs before a zero based index.
+ CFX_XMLElement nodeD(L"D");
+ parent.InsertChildNode(&nodeD, 1);
+ EXPECT_EQ(L"ADBC", ChildrenString(&parent));
+ EXPECT_EQ(L"ADBC", ReverseChildrenString(&parent));
- CFX_XMLElement node5(L"node5");
- node1.InsertChildNode(&node5, 1);
- EXPECT_EQ(&node1, node5.GetParent());
- EXPECT_EQ(&node2, node1.GetFirstChild());
- EXPECT_EQ(&node5, node2.GetNextSibling());
- EXPECT_EQ(&node3, node5.GetNextSibling());
- EXPECT_EQ(&node4, node3.GetNextSibling());
- EXPECT_TRUE(node4.GetNextSibling() == nullptr);
+ // Insert to 0 appends first child.
+ CFX_XMLElement nodeE(L"E");
+ parent.InsertChildNode(&nodeE, 0);
+ EXPECT_EQ(L"EADBC", ChildrenString(&parent));
+ EXPECT_EQ(L"EADBC", ReverseChildrenString(&parent));
+
+ // Insert to out-of-bounds index appends last child.
+ CFX_XMLElement nodeF(L"F");
+ parent.InsertChildNode(&nodeF, 10);
+ EXPECT_EQ(L"EADBCF", ChildrenString(&parent));
+ EXPECT_EQ(L"EADBCF", ReverseChildrenString(&parent));
}
#ifndef NDEBUG
@@ -129,16 +164,20 @@
node1.AppendChild(&node3);
node1.AppendChild(&node4);
+ EXPECT_EQ(L"node2node3node4", ChildrenString(&node1));
+ EXPECT_EQ(L"node2node3node4", ReverseChildrenString(&node1));
EXPECT_EQ(&node2, node1.GetFirstChild());
EXPECT_EQ(&node3, node2.GetNextSibling());
EXPECT_EQ(&node4, node3.GetNextSibling());
EXPECT_TRUE(node4.GetNextSibling() == nullptr);
node1.RemoveChildNode(&node3);
+
+ EXPECT_EQ(L"node2node4", ChildrenString(&node1));
+ EXPECT_EQ(L"node2node4", ReverseChildrenString(&node1));
EXPECT_TRUE(node3.GetParent() == nullptr);
EXPECT_TRUE(node3.GetNextSibling() == nullptr);
EXPECT_TRUE(node3.GetPrevSiblingForTesting() == nullptr);
-
EXPECT_EQ(&node2, node1.GetFirstChild());
EXPECT_EQ(&node4, node2.GetNextSibling());
EXPECT_EQ(&node2, node4.GetPrevSiblingForTesting());
@@ -155,16 +194,20 @@
node1.AppendChild(&node3);
node1.AppendChild(&node4);
+ EXPECT_EQ(L"node2node3node4", ChildrenString(&node1));
+ EXPECT_EQ(L"node2node3node4", ReverseChildrenString(&node1));
EXPECT_EQ(&node2, node1.GetFirstChild());
EXPECT_EQ(&node3, node2.GetNextSibling());
EXPECT_EQ(&node4, node3.GetNextSibling());
EXPECT_TRUE(node4.GetNextSibling() == nullptr);
node1.RemoveChildNode(&node2);
+
+ EXPECT_EQ(L"node3node4", ChildrenString(&node1));
+ EXPECT_EQ(L"node3node4", ReverseChildrenString(&node1));
EXPECT_TRUE(node2.GetParent() == nullptr);
EXPECT_TRUE(node2.GetNextSibling() == nullptr);
EXPECT_TRUE(node2.GetPrevSiblingForTesting() == nullptr);
-
EXPECT_EQ(&node3, node1.GetFirstChild());
EXPECT_TRUE(node3.GetPrevSiblingForTesting() == nullptr);
EXPECT_EQ(&node4, node3.GetNextSibling());
@@ -181,16 +224,20 @@
node1.AppendChild(&node3);
node1.AppendChild(&node4);
+ EXPECT_EQ(L"node2node3node4", ChildrenString(&node1));
+ EXPECT_EQ(L"node2node3node4", ReverseChildrenString(&node1));
EXPECT_EQ(&node2, node1.GetFirstChild());
EXPECT_EQ(&node3, node2.GetNextSibling());
EXPECT_EQ(&node4, node3.GetNextSibling());
EXPECT_TRUE(node4.GetNextSibling() == nullptr);
node1.RemoveChildNode(&node4);
+
+ EXPECT_EQ(L"node2node3", ChildrenString(&node1));
+ EXPECT_EQ(L"node2node3", ReverseChildrenString(&node1));
EXPECT_TRUE(node4.GetParent() == nullptr);
EXPECT_TRUE(node4.GetNextSibling() == nullptr);
EXPECT_TRUE(node4.GetPrevSiblingForTesting() == nullptr);
-
EXPECT_EQ(&node2, node1.GetFirstChild());
EXPECT_EQ(&node3, node2.GetNextSibling());
EXPECT_TRUE(node3.GetNextSibling() == nullptr);