Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: ui/base/models/tree_node_model_unittest.cc

Issue 2379863002: Fix object ownership in ui/base/models. (Closed)
Patch Set: fix Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/base/models/tree_node_model.h ('k') | ui/views/controls/tree/tree_view.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/base/models/tree_node_model.h" 5 #include "ui/base/models/tree_node_model.h"
6 6
7 #include <memory> 7 #include <memory>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
11 #include "base/memory/ptr_util.h"
11 #include "base/strings/string16.h" 12 #include "base/strings/string16.h"
12 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
13 #include "base/strings/utf_string_conversions.h" 14 #include "base/strings/utf_string_conversions.h"
14 #include "testing/gtest/include/gtest/gtest.h" 15 #include "testing/gtest/include/gtest/gtest.h"
15 16
16 using base::ASCIIToUTF16; 17 using base::ASCIIToUTF16;
17 18
18 namespace ui { 19 namespace ui {
19 20
20 class TreeNodeModelTest : public testing::Test, public TreeModelObserver { 21 class TreeNodeModelTest : public testing::Test, public TreeModelObserver {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 63
63 // Verifies if the model is properly adding a new node in the tree and 64 // Verifies if the model is properly adding a new node in the tree and
64 // notifying the observers. 65 // notifying the observers.
65 // The tree looks like this: 66 // The tree looks like this:
66 // root 67 // root
67 // +-- child1 68 // +-- child1
68 // +-- foo1 69 // +-- foo1
69 // +-- foo2 70 // +-- foo2
70 // +-- child2 71 // +-- child2
71 TEST_F(TreeNodeModelTest, AddNode) { 72 TEST_F(TreeNodeModelTest, AddNode) {
72 TestNode* root = new TestNode; 73 TreeNodeModel<TestNode> model(base::MakeUnique<TestNode>());
73 TreeNodeModel<TestNode > model(root); 74 TestNode* root = model.GetRoot();
74 model.AddObserver(this); 75 model.AddObserver(this);
75 76
76 TestNode* child1 = new TestNode; 77 TestNode* child1 = model.Add(root, base::MakeUnique<TestNode>(), 0);
77 model.Add(root, child1, 0);
78 78
79 EXPECT_EQ("added=1 removed=0 changed=0", GetObserverCountStateAndClear()); 79 EXPECT_EQ("added=1 removed=0 changed=0", GetObserverCountStateAndClear());
80 80
81 for (int i = 0; i < 2; ++i) 81 for (int i = 0; i < 2; ++i)
82 child1->Add(new TestNode, i); 82 child1->Add(base::MakeUnique<TestNode>(), i);
83 83
84 TestNode* child2 = new TestNode; 84 TestNode* child2 = model.Add(root, base::MakeUnique<TestNode>(), 1);
85 model.Add(root, child2, 1);
86 85
87 EXPECT_EQ("added=1 removed=0 changed=0", GetObserverCountStateAndClear()); 86 EXPECT_EQ("added=1 removed=0 changed=0", GetObserverCountStateAndClear());
88 87
89 EXPECT_EQ(2, root->child_count()); 88 EXPECT_EQ(2, root->child_count());
90 EXPECT_EQ(2, child1->child_count()); 89 EXPECT_EQ(2, child1->child_count());
91 EXPECT_EQ(0, child2->child_count()); 90 EXPECT_EQ(0, child2->child_count());
92 } 91 }
93 92
94 // Verifies if the model is properly removing a node from the tree 93 // Verifies if the model is properly removing a node from the tree
95 // and notifying the observers. 94 // and notifying the observers.
96 TEST_F(TreeNodeModelTest, RemoveNode) { 95 TEST_F(TreeNodeModelTest, RemoveNode) {
97 TestNode* root = new TestNode; 96 TreeNodeModel<TestNode> model(base::MakeUnique<TestNode>());
98 TreeNodeModel<TestNode > model(root); 97 TestNode* root = model.GetRoot();
99 model.AddObserver(this); 98 model.AddObserver(this);
100 99
101 TestNode* child1 = new TestNode; 100 TestNode* child1 = root->Add(base::MakeUnique<TestNode>(), 0);
102 root->Add(child1, 0);
103 101
104 EXPECT_EQ(1, model.GetChildCount(root)); 102 EXPECT_EQ(1, model.GetChildCount(root));
105 103
106 // Now remove |child1| from |root| and release the memory. 104 // Now remove |child1| from |root| and release the memory.
107 delete model.Remove(root, child1); 105 model.Remove(root, child1);
108 106
109 EXPECT_EQ("added=0 removed=1 changed=0", GetObserverCountStateAndClear()); 107 EXPECT_EQ("added=0 removed=1 changed=0", GetObserverCountStateAndClear());
110 108
111 EXPECT_EQ(0, model.GetChildCount(root)); 109 EXPECT_EQ(0, model.GetChildCount(root));
112 } 110 }
113 111
114 // Verifies if the nodes added under the root are all deleted when calling 112 // Verifies if the nodes added under the root are all deleted when calling
115 // RemoveAll. Note that is responsability of the caller to free the memory 113 // DeleteAll.
116 // of the nodes removed after RemoveAll is called.
117 // The tree looks like this: 114 // The tree looks like this:
118 // root 115 // root
119 // +-- child1 116 // +-- child1
120 // +-- foo 117 // +-- foo
121 // +-- bar0 118 // +-- bar0
122 // +-- bar1 119 // +-- bar1
123 // +-- bar2 120 // +-- bar2
124 // +-- child2 121 // +-- child2
125 // +-- child3 122 // +-- child3
126 TEST_F(TreeNodeModelTest, RemoveAllNodes) { 123 TEST_F(TreeNodeModelTest, DeleteAllNodes) {
127 TestNode root; 124 TestNode root;
128 125
129 TestNode child1; 126 TestNode* child1 = root.Add(base::MakeUnique<TestNode>(), 0);
130 TestNode child2; 127 root.Add(base::MakeUnique<TestNode>(), 1); // child2
131 TestNode child3; 128 root.Add(base::MakeUnique<TestNode>(), 2); // child3
132 129
133 root.Add(&child1, 0); 130 TestNode* foo = child1->Add(base::MakeUnique<TestNode>(), 0);
134 root.Add(&child2, 1);
135 root.Add(&child3, 2);
136
137 TestNode* foo = new TestNode;
138 child1.Add(foo, 0);
139 131
140 // Add some nodes to |foo|. 132 // Add some nodes to |foo|.
141 for (int i = 0; i < 3; ++i) 133 for (int i = 0; i < 3; ++i)
142 foo->Add(new TestNode, i); 134 foo->Add(base::MakeUnique<TestNode>(), i); // bar[n]
143 135
144 EXPECT_EQ(3, root.child_count()); 136 EXPECT_EQ(3, root.child_count());
145 EXPECT_EQ(1, child1.child_count()); 137 EXPECT_EQ(1, child1->child_count());
146 EXPECT_EQ(3, foo->child_count()); 138 EXPECT_EQ(3, foo->child_count());
147 139
148 // Now remove the child nodes from root. 140 // Now remove the child nodes from root.
149 root.RemoveAll(); 141 root.DeleteAll();
150 142
151 EXPECT_EQ(0, root.child_count()); 143 EXPECT_EQ(0, root.child_count());
152 EXPECT_TRUE(root.empty()); 144 EXPECT_TRUE(root.empty());
153
154 EXPECT_EQ(1, child1.child_count());
155 EXPECT_EQ(3, foo->child_count());
156 } 145 }
157 146
158 // Verifies if GetIndexOf() returns the correct index for the specified node. 147 // Verifies if GetIndexOf() returns the correct index for the specified node.
159 // The tree looks like this: 148 // The tree looks like this:
160 // root 149 // root
161 // +-- child1 150 // +-- child1
162 // +-- foo1 151 // +-- foo1
163 // +-- child2 152 // +-- child2
164 TEST_F(TreeNodeModelTest, GetIndexOf) { 153 TEST_F(TreeNodeModelTest, GetIndexOf) {
165 TestNode root; 154 TestNode root;
166 155
167 TestNode* child1 = new TestNode; 156 TestNode* child1 = root.Add(base::MakeUnique<TestNode>(), 0);
168 root.Add(child1, 0); 157 TestNode* child2 = root.Add(base::MakeUnique<TestNode>(), 1);
169 158 TestNode* foo1 = child1->Add(base::MakeUnique<TestNode>(), 0);
170 TestNode* child2 = new TestNode;
171 root.Add(child2, 1);
172
173 TestNode* foo1 = new TestNode;
174 child1->Add(foo1, 0);
175 159
176 EXPECT_EQ(-1, root.GetIndexOf(&root)); 160 EXPECT_EQ(-1, root.GetIndexOf(&root));
177 EXPECT_EQ(0, root.GetIndexOf(child1)); 161 EXPECT_EQ(0, root.GetIndexOf(child1));
178 EXPECT_EQ(1, root.GetIndexOf(child2)); 162 EXPECT_EQ(1, root.GetIndexOf(child2));
179 EXPECT_EQ(-1, root.GetIndexOf(foo1)); 163 EXPECT_EQ(-1, root.GetIndexOf(foo1));
180 164
181 EXPECT_EQ(-1, child1->GetIndexOf(&root)); 165 EXPECT_EQ(-1, child1->GetIndexOf(&root));
182 EXPECT_EQ(-1, child1->GetIndexOf(child1)); 166 EXPECT_EQ(-1, child1->GetIndexOf(child1));
183 EXPECT_EQ(-1, child1->GetIndexOf(child2)); 167 EXPECT_EQ(-1, child1->GetIndexOf(child2));
184 EXPECT_EQ(0, child1->GetIndexOf(foo1)); 168 EXPECT_EQ(0, child1->GetIndexOf(foo1));
185 169
186 EXPECT_EQ(-1, child2->GetIndexOf(&root)); 170 EXPECT_EQ(-1, child2->GetIndexOf(&root));
187 EXPECT_EQ(-1, child2->GetIndexOf(child2)); 171 EXPECT_EQ(-1, child2->GetIndexOf(child2));
188 EXPECT_EQ(-1, child2->GetIndexOf(child1)); 172 EXPECT_EQ(-1, child2->GetIndexOf(child1));
189 EXPECT_EQ(-1, child2->GetIndexOf(foo1)); 173 EXPECT_EQ(-1, child2->GetIndexOf(foo1));
190 } 174 }
191 175
192 // Verifies whether a specified node has or not an ancestor. 176 // Verifies whether a specified node has or not an ancestor.
193 // The tree looks like this: 177 // The tree looks like this:
194 // root 178 // root
195 // +-- child1 179 // +-- child1
196 // +-- foo1 180 // +-- foo1
197 // +-- child2 181 // +-- child2
198 TEST_F(TreeNodeModelTest, HasAncestor) { 182 TEST_F(TreeNodeModelTest, HasAncestor) {
199 TestNode root; 183 TestNode root;
200 TestNode* child1 = new TestNode;
201 TestNode* child2 = new TestNode;
202 184
203 root.Add(child1, 0); 185 TestNode* child1 = root.Add(base::MakeUnique<TestNode>(), 0);
204 root.Add(child2, 1); 186 TestNode* child2 = root.Add(base::MakeUnique<TestNode>(), 1);
205 187
206 TestNode* foo1 = new TestNode; 188 TestNode* foo1 = child1->Add(base::MakeUnique<TestNode>(), 0);
207 child1->Add(foo1, 0);
208 189
209 EXPECT_TRUE(root.HasAncestor(&root)); 190 EXPECT_TRUE(root.HasAncestor(&root));
210 EXPECT_FALSE(root.HasAncestor(child1)); 191 EXPECT_FALSE(root.HasAncestor(child1));
211 EXPECT_FALSE(root.HasAncestor(child2)); 192 EXPECT_FALSE(root.HasAncestor(child2));
212 EXPECT_FALSE(root.HasAncestor(foo1)); 193 EXPECT_FALSE(root.HasAncestor(foo1));
213 194
214 EXPECT_TRUE(child1->HasAncestor(child1)); 195 EXPECT_TRUE(child1->HasAncestor(child1));
215 EXPECT_TRUE(child1->HasAncestor(&root)); 196 EXPECT_TRUE(child1->HasAncestor(&root));
216 EXPECT_FALSE(child1->HasAncestor(child2)); 197 EXPECT_FALSE(child1->HasAncestor(child2));
217 EXPECT_FALSE(child1->HasAncestor(foo1)); 198 EXPECT_FALSE(child1->HasAncestor(foo1));
218 199
219 EXPECT_TRUE(child2->HasAncestor(child2)); 200 EXPECT_TRUE(child2->HasAncestor(child2));
220 EXPECT_TRUE(child2->HasAncestor(&root)); 201 EXPECT_TRUE(child2->HasAncestor(&root));
221 EXPECT_FALSE(child2->HasAncestor(child1)); 202 EXPECT_FALSE(child2->HasAncestor(child1));
222 EXPECT_FALSE(child2->HasAncestor(foo1)); 203 EXPECT_FALSE(child2->HasAncestor(foo1));
223 204
224 EXPECT_TRUE(foo1->HasAncestor(foo1)); 205 EXPECT_TRUE(foo1->HasAncestor(foo1));
225 EXPECT_TRUE(foo1->HasAncestor(child1)); 206 EXPECT_TRUE(foo1->HasAncestor(child1));
226 EXPECT_TRUE(foo1->HasAncestor(&root)); 207 EXPECT_TRUE(foo1->HasAncestor(&root));
227 EXPECT_FALSE(foo1->HasAncestor(child2)); 208 EXPECT_FALSE(foo1->HasAncestor(child2));
228 } 209 }
229 210
230 // Verifies if GetTotalNodeCount returns the correct number of nodes from the 211 // Verifies if GetTotalNodeCount returns the correct number of nodes from the
231 // node specifed. The count should include the node itself. 212 // node specified. The count should include the node itself.
232 // The tree looks like this: 213 // The tree looks like this:
233 // root 214 // root
234 // +-- child1 215 // +-- child1
235 // +-- child2 216 // +-- child2
236 // +-- child3 217 // +-- child3
237 // +-- foo1 218 // +-- foo1
238 // +-- foo2 219 // +-- foo2
239 // +-- foo3 220 // +-- foo3
240 // +-- foo4 221 // +-- foo4
241 // +-- bar1 222 // +-- bar1
242 // 223 //
243 // The TotalNodeCount of root is: 9 224 // The TotalNodeCount of root is: 9
244 // The TotalNodeCount of child1 is: 3 225 // The TotalNodeCount of child1 is: 3
245 // The TotalNodeCount of child2 and foo2 is: 2 226 // The TotalNodeCount of child2 and foo2 is: 2
246 // The TotalNodeCount of bar1 is: 1 227 // The TotalNodeCount of bar1 is: 1
247 // And so on... 228 // And so on...
248 TEST_F(TreeNodeModelTest, GetTotalNodeCount) { 229 TEST_F(TreeNodeModelTest, GetTotalNodeCount) {
249 TestNode root; 230 TestNode root;
250 231
251 TestNode* child1 = new TestNode; 232 TestNode* child1 = root.Add(base::MakeUnique<TestNode>(), 0);
252 TestNode* child2 = new TestNode; 233 TestNode* child2 = child1->Add(base::MakeUnique<TestNode>(), 0);
253 TestNode* child3 = new TestNode; 234 child2->Add(base::MakeUnique<TestNode>(), 0); // child3
254 235
255 root.Add(child1, 0); 236 TestNode* foo1 = root.Add(base::MakeUnique<TestNode>(), 1);
256 child1->Add(child2, 0); 237 TestNode* foo2 = foo1->Add(base::MakeUnique<TestNode>(), 0);
257 child2->Add(child3, 0); 238 foo2->Add(base::MakeUnique<TestNode>(), 0); // foo3
239 foo1->Add(base::MakeUnique<TestNode>(), 1); // foo4
258 240
259 TestNode* foo1 = new TestNode; 241 TestNode* bar1 = root.Add(base::MakeUnique<TestNode>(), 2);
260 TestNode* foo2 = new TestNode;
261 TestNode* foo3 = new TestNode;
262 TestNode* foo4 = new TestNode;
263
264 root.Add(foo1, 1);
265 foo1->Add(foo2, 0);
266 foo2->Add(foo3, 0);
267 foo1->Add(foo4, 1);
268
269 TestNode* bar1 = new TestNode;
270
271 root.Add(bar1, 2);
272 242
273 EXPECT_EQ(9, root.GetTotalNodeCount()); 243 EXPECT_EQ(9, root.GetTotalNodeCount());
274 EXPECT_EQ(3, child1->GetTotalNodeCount()); 244 EXPECT_EQ(3, child1->GetTotalNodeCount());
275 EXPECT_EQ(2, child2->GetTotalNodeCount()); 245 EXPECT_EQ(2, child2->GetTotalNodeCount());
276 EXPECT_EQ(2, foo2->GetTotalNodeCount()); 246 EXPECT_EQ(2, foo2->GetTotalNodeCount());
277 EXPECT_EQ(1, bar1->GetTotalNodeCount()); 247 EXPECT_EQ(1, bar1->GetTotalNodeCount());
278 } 248 }
279 249
280 // Makes sure that we are notified when the node is renamed, 250 // Makes sure that we are notified when the node is renamed,
281 // also makes sure the node is properly renamed. 251 // also makes sure the node is properly renamed.
282 TEST_F(TreeNodeModelTest, SetTitle) { 252 TEST_F(TreeNodeModelTest, SetTitle) {
283 TestNode* root = new TestNode(ASCIIToUTF16("root"), 0); 253 TreeNodeModel<TestNode> model(
284 TreeNodeModel<TestNode > model(root); 254 base::MakeUnique<TestNode>(ASCIIToUTF16("root"), 0));
255 TestNode* root = model.GetRoot();
285 model.AddObserver(this); 256 model.AddObserver(this);
286 257
287 const base::string16 title(ASCIIToUTF16("root2")); 258 const base::string16 title(ASCIIToUTF16("root2"));
288 model.SetTitle(root, title); 259 model.SetTitle(root, title);
289 EXPECT_EQ("added=0 removed=0 changed=1", GetObserverCountStateAndClear()); 260 EXPECT_EQ("added=0 removed=0 changed=1", GetObserverCountStateAndClear());
290 EXPECT_EQ(title, root->GetTitle()); 261 EXPECT_EQ(title, root->GetTitle());
291 } 262 }
292 263
293 TEST_F(TreeNodeModelTest, BasicOperations) { 264 TEST_F(TreeNodeModelTest, BasicOperations) {
294 TestNode root; 265 TestNode root;
295 EXPECT_EQ(0, root.child_count()); 266 EXPECT_EQ(0, root.child_count());
296 267
297 TestNode* child1 = new TestNode; 268 TestNode* child1 = root.Add(base::MakeUnique<TestNode>(), root.child_count());
298 root.Add(child1, root.child_count());
299 EXPECT_EQ(1, root.child_count()); 269 EXPECT_EQ(1, root.child_count());
300 EXPECT_EQ(&root, child1->parent()); 270 EXPECT_EQ(&root, child1->parent());
301 271
302 TestNode* child2 = new TestNode; 272 TestNode* child2 = root.Add(base::MakeUnique<TestNode>(), root.child_count());
303 root.Add(child2, root.child_count());
304 EXPECT_EQ(2, root.child_count()); 273 EXPECT_EQ(2, root.child_count());
305 EXPECT_EQ(child1->parent(), child2->parent()); 274 EXPECT_EQ(child1->parent(), child2->parent());
306 275
307 std::unique_ptr<TestNode> c2(root.Remove(child2)); 276 std::unique_ptr<TestNode> c2 = root.Remove(child2);
308 EXPECT_EQ(1, root.child_count()); 277 EXPECT_EQ(1, root.child_count());
309 EXPECT_EQ(NULL, child2->parent()); 278 EXPECT_EQ(NULL, child2->parent());
310 279
311 std::unique_ptr<TestNode> c1(root.Remove(child1)); 280 std::unique_ptr<TestNode> c1 = root.Remove(child1);
312 EXPECT_EQ(0, root.child_count()); 281 EXPECT_EQ(0, root.child_count());
313 } 282 }
314 283
315 TEST_F(TreeNodeModelTest, IsRoot) { 284 TEST_F(TreeNodeModelTest, IsRoot) {
316 TestNode root; 285 TestNode root;
317 EXPECT_TRUE(root.is_root()); 286 EXPECT_TRUE(root.is_root());
318 287
319 TestNode* child1 = new TestNode; 288 TestNode* child1 = root.Add(base::MakeUnique<TestNode>(), root.child_count());
320 root.Add(child1, root.child_count());
321 EXPECT_FALSE(child1->is_root()); 289 EXPECT_FALSE(child1->is_root());
322 } 290 }
323 291
324 } // namespace ui 292 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/models/tree_node_model.h ('k') | ui/views/controls/tree/tree_view.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698