blob: ecd5b09f2d15b78eb79913f3702166a652027f87 [file] [log] [blame]
kumarashishg826308d2023-06-23 13:21:22 +00001// Copyright 2019 The PDFium Authors
Haibo Huang49cc9302020-04-27 16:14:24 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "core/fxcrt/tree_node.h"
6
7#include <memory>
8
9#include "testing/gtest/include/gtest/gtest.h"
Haibo Huang49cc9302020-04-27 16:14:24 -070010
11namespace fxcrt {
12
13class TestTreeNode : public TreeNode<TestTreeNode> {};
14
15// NOTE: Successful cases are covered via RetainedTreeNode tests.
16// These tests check that we trip CHECKS given bad calls.
17
18TEST(TreeNode, SelfAppendFirstChild) {
kumarashishg826308d2023-06-23 13:21:22 +000019 auto pNode = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070020 EXPECT_DEATH(pNode->AppendFirstChild(pNode.get()), "");
21}
22
23TEST(TreeNode, SelfAppendLastChild) {
kumarashishg826308d2023-06-23 13:21:22 +000024 auto pNode = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070025 EXPECT_DEATH(pNode->AppendLastChild(pNode.get()), "");
26}
27
28TEST(TreeNode, SelfInsertBeforeOther) {
kumarashishg826308d2023-06-23 13:21:22 +000029 auto pNode = std::make_unique<TestTreeNode>();
30 auto pOther = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070031 pNode->AppendFirstChild(pOther.get());
32 EXPECT_DEATH(pNode->InsertBefore(pNode.get(), pOther.get()), "");
33}
34
35TEST(TreeNode, InsertOtherBeforeSelf) {
kumarashishg826308d2023-06-23 13:21:22 +000036 auto pNode = std::make_unique<TestTreeNode>();
37 auto pOther = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070038 pNode->AppendFirstChild(pOther.get());
39 EXPECT_DEATH(pNode->InsertBefore(pOther.get(), pNode.get()), "");
40}
41
42TEST(TreeNode, SelfInsertAfterOther) {
kumarashishg826308d2023-06-23 13:21:22 +000043 auto pNode = std::make_unique<TestTreeNode>();
44 auto pOther = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070045 pNode->AppendFirstChild(pOther.get());
46 EXPECT_DEATH(pNode->InsertBefore(pNode.get(), pOther.get()), "");
47}
48
49TEST(TreeNode, InsertOtherAfterSelf) {
kumarashishg826308d2023-06-23 13:21:22 +000050 auto pNode = std::make_unique<TestTreeNode>();
51 auto pOther = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070052 pNode->AppendFirstChild(pOther.get());
53 EXPECT_DEATH(pNode->InsertBefore(pOther.get(), pNode.get()), "");
54}
55
56TEST(TreeNode, RemoveParentless) {
kumarashishg826308d2023-06-23 13:21:22 +000057 auto pNode = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070058 EXPECT_DEATH(pNode->GetParent()->RemoveChild(pNode.get()), "");
59}
60
61TEST(TreeNode, RemoveFromWrongParent) {
kumarashishg826308d2023-06-23 13:21:22 +000062 auto pGoodParent = std::make_unique<TestTreeNode>();
63 auto pBadParent = std::make_unique<TestTreeNode>();
64 auto pNode = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070065 pGoodParent->AppendFirstChild(pNode.get());
66 EXPECT_DEATH(pBadParent->RemoveChild(pNode.get()), "");
67}
68
69TEST(TreeNode, SafeRemove) {
kumarashishg826308d2023-06-23 13:21:22 +000070 auto pParent = std::make_unique<TestTreeNode>();
71 auto pChild = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070072 pParent->AppendFirstChild(pChild.get());
73 pChild->RemoveSelfIfParented();
kumarashishg826308d2023-06-23 13:21:22 +000074 EXPECT_FALSE(pParent->GetFirstChild());
75 EXPECT_FALSE(pChild->GetParent());
Haibo Huang49cc9302020-04-27 16:14:24 -070076}
77
78TEST(TreeNode, SafeRemoveParentless) {
kumarashishg826308d2023-06-23 13:21:22 +000079 auto pNode = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070080 pNode->RemoveSelfIfParented();
kumarashishg826308d2023-06-23 13:21:22 +000081 EXPECT_FALSE(pNode->GetParent());
Haibo Huang49cc9302020-04-27 16:14:24 -070082}
83
84TEST(TreeNode, RemoveAllChildren) {
kumarashishg826308d2023-06-23 13:21:22 +000085 auto pParent = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070086 pParent->RemoveAllChildren();
kumarashishg826308d2023-06-23 13:21:22 +000087 EXPECT_FALSE(pParent->GetFirstChild());
Haibo Huang49cc9302020-04-27 16:14:24 -070088
kumarashishg826308d2023-06-23 13:21:22 +000089 auto p0 = std::make_unique<TestTreeNode>();
90 auto p1 = std::make_unique<TestTreeNode>();
91 auto p2 = std::make_unique<TestTreeNode>();
92 auto p3 = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -070093 pParent->AppendLastChild(p0.get());
94 pParent->AppendLastChild(p1.get());
95 pParent->AppendLastChild(p2.get());
96 pParent->AppendLastChild(p3.get());
97 pParent->RemoveAllChildren();
kumarashishg826308d2023-06-23 13:21:22 +000098 EXPECT_FALSE(pParent->GetFirstChild());
Haibo Huang49cc9302020-04-27 16:14:24 -070099}
100
101TEST(TreeNode, NthChild) {
kumarashishg826308d2023-06-23 13:21:22 +0000102 auto pParent = std::make_unique<TestTreeNode>();
103 EXPECT_FALSE(pParent->GetNthChild(-1));
104 EXPECT_FALSE(pParent->GetNthChild(0));
Haibo Huang49cc9302020-04-27 16:14:24 -0700105
kumarashishg826308d2023-06-23 13:21:22 +0000106 auto p0 = std::make_unique<TestTreeNode>();
107 auto p1 = std::make_unique<TestTreeNode>();
108 auto p2 = std::make_unique<TestTreeNode>();
109 auto p3 = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -0700110 pParent->AppendLastChild(p0.get());
111 pParent->AppendLastChild(p1.get());
112 pParent->AppendLastChild(p2.get());
113 pParent->AppendLastChild(p3.get());
kumarashishg826308d2023-06-23 13:21:22 +0000114 EXPECT_FALSE(pParent->GetNthChild(-1));
Haibo Huang49cc9302020-04-27 16:14:24 -0700115 EXPECT_EQ(p0.get(), pParent->GetNthChild(0));
116 EXPECT_EQ(p1.get(), pParent->GetNthChild(1));
117 EXPECT_EQ(p2.get(), pParent->GetNthChild(2));
118 EXPECT_EQ(p3.get(), pParent->GetNthChild(3));
kumarashishg826308d2023-06-23 13:21:22 +0000119 EXPECT_FALSE(pParent->GetNthChild(4));
Haibo Huang49cc9302020-04-27 16:14:24 -0700120 pParent->RemoveAllChildren();
121}
122
123TEST(TreeNode, AppendFirstChild) {
kumarashishg826308d2023-06-23 13:21:22 +0000124 auto parent = std::make_unique<TestTreeNode>();
125 auto child0 = std::make_unique<TestTreeNode>();
126 auto child1 = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -0700127 parent->AppendFirstChild(child0.get());
128 EXPECT_EQ(child0.get(), parent->GetFirstChild());
129 parent->AppendFirstChild(child1.get());
130 EXPECT_EQ(child1.get(), parent->GetFirstChild());
131 EXPECT_EQ(child1.get(), parent->GetNthChild(0));
132 EXPECT_EQ(child0.get(), parent->GetNthChild(1));
133}
134
135TEST(TreeNode, RemoveChild) {
kumarashishg826308d2023-06-23 13:21:22 +0000136 auto parent = std::make_unique<TestTreeNode>();
137 auto child0 = std::make_unique<TestTreeNode>();
138 auto child1 = std::make_unique<TestTreeNode>();
Haibo Huang49cc9302020-04-27 16:14:24 -0700139
140 parent->AppendFirstChild(child0.get());
141 parent->AppendLastChild(child1.get());
142 EXPECT_EQ(child0.get(), parent->GetFirstChild());
143 EXPECT_EQ(child1.get(), parent->GetLastChild());
144 parent->RemoveChild(child0.get());
145 EXPECT_EQ(child1.get(), parent->GetFirstChild());
146 EXPECT_EQ(child1.get(), parent->GetLastChild());
147 parent->RemoveChild(child1.get());
kumarashishg826308d2023-06-23 13:21:22 +0000148 EXPECT_FALSE(parent->GetFirstChild());
149 EXPECT_FALSE(parent->GetLastChild());
Haibo Huang49cc9302020-04-27 16:14:24 -0700150
151 parent->AppendFirstChild(child0.get());
152 parent->AppendLastChild(child1.get());
153 EXPECT_EQ(child0.get(), parent->GetFirstChild());
154 EXPECT_EQ(child1.get(), parent->GetLastChild());
155 parent->RemoveChild(child1.get());
156 EXPECT_EQ(child0.get(), parent->GetFirstChild());
157 EXPECT_EQ(child0.get(), parent->GetLastChild());
158 parent->RemoveChild(child0.get());
kumarashishg826308d2023-06-23 13:21:22 +0000159 EXPECT_FALSE(parent->GetFirstChild());
160 EXPECT_FALSE(parent->GetLastChild());
Haibo Huang49cc9302020-04-27 16:14:24 -0700161}
162
163} // namespace fxcrt