| OLD | NEW |
| 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 Loading... |
| 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 |
| OLD | NEW |