Index: app/tree_node_model_unittest.cc |
diff --git a/app/tree_node_model_unittest.cc b/app/tree_node_model_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..64fbe6f236c0962f2982af9fec83df759d8fe83c |
--- /dev/null |
+++ b/app/tree_node_model_unittest.cc |
@@ -0,0 +1,277 @@ |
+// Copyright (c) 2010 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "app/tree_node_model.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+class TreeNodeModelTest : public testing::Test, public TreeModelObserver { |
+ public: |
+ TreeNodeModelTest() |
+ : added_count_(0), |
+ removed_count_(0), |
+ reordered_count_(0), |
+ changed_count_(0) {} |
+ |
+ void AssertObserverCount(int added_count, int removed_count, |
+ int reordered_count, int changed_count) { |
+ ASSERT_EQ(added_count, added_count_); |
+ ASSERT_EQ(removed_count, removed_count_); |
+ ASSERT_EQ(reordered_count, reordered_count_); |
+ ASSERT_EQ(changed_count, changed_count_); |
+ } |
+ |
+ void ClearCounts() { |
+ added_count_ = removed_count_ = reordered_count_ = changed_count_ = 0; |
+ } |
+ |
+ // Begin TreeModelObserver implementation. |
+ virtual void TreeNodesAdded(TreeModel* model, TreeModelNode* parent, |
+ int start, int count) { |
+ added_count_++; |
+ } |
+ virtual void TreeNodesRemoved(TreeModel* model, TreeModelNode* parent, |
+ int start, int count) { |
+ removed_count_++; |
+ } |
+ virtual void TreeNodeChildrenReordered(TreeModel* model, |
+ TreeModelNode* parent) { |
+ reordered_count_++; |
+ } |
+ virtual void TreeNodeChanged(TreeModel* model, TreeModelNode* node) { |
+ changed_count_++; |
+ } |
+ // End TreeModelObserver implementation. |
+ |
+ private: |
+ int added_count_; |
+ int removed_count_; |
+ int reordered_count_; |
+ int changed_count_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TreeNodeModelTest); |
+}; |
+ |
+// Verify if the model is properly adding a new node in the tree and |
+// notifying the observers. |
+// The tree looks like this: |
+// root |
+// |-- child1 |
+// | |-- foo1 |
+// | |-- foo2 |
+// +-- child2 |
+TEST_F(TreeNodeModelTest, AddNode) { |
+ TreeNodeWithValue<int>* root = |
+ new TreeNodeWithValue<int>(L"root", 0); |
+ TreeNodeModel<TreeNodeWithValue<int> > model(root); |
+ model.AddObserver(this); |
+ ClearCounts(); |
+ |
+ // Create the first root child. |
+ TreeNodeWithValue<int>* child1 = |
+ new TreeNodeWithValue<int>(L"child 1", 1); |
+ model.Add(root, 0, child1); |
+ |
+ AssertObserverCount(1, 0, 0, 0); |
+ |
+ // Add two nodes under the |child1|. |
+ TreeNodeWithValue<int>* foo1 = |
+ new TreeNodeWithValue<int>(L"foo1", 3); |
+ TreeNodeWithValue<int>* foo2 = |
+ new TreeNodeWithValue<int>(L"foo2", 4); |
+ child1->Add(0, foo1); |
+ child1->Add(1, foo2); |
+ |
+ // Create the second root child. |
+ TreeNodeWithValue<int>* child2 = |
+ new TreeNodeWithValue<int>(L"child 2", 2); |
+ root->Add(1, child2); |
+ |
+ // Check if there is two nodes under the root. |
+ ASSERT_EQ(2, model.GetChildCount(root)); |
+ |
+ // Check if there is two nodes under |child1|. |
+ ASSERT_EQ(2, model.GetChildCount(child1)); |
+ |
+ // Check if there is none nodes under |child2|. |
+ ASSERT_EQ(0, model.GetChildCount(child2)); |
+} |
+ |
+// Verify if the model is properly removing a node from the tree |
+// and notifying the observers. |
+TEST_F(TreeNodeModelTest, RemoveNode) { |
+ TreeNodeWithValue<int>* root = |
+ new TreeNodeWithValue<int>(L"root", 0); |
+ TreeNodeModel<TreeNodeWithValue<int> > model(root); |
+ model.AddObserver(this); |
+ ClearCounts(); |
+ |
+ // Create the first child node. |
+ TreeNodeWithValue<int>* child1 = |
+ new TreeNodeWithValue<int>(L"child 1", 1); |
+ |
+ // And add it to the root node. |
+ root->Add(0, child1); |
+ |
+ ASSERT_EQ(1, model.GetChildCount(root)); |
+ |
+ // Now remove the |child1| from root and release the memory. |
+ delete model.Remove(root, 0); |
+ |
+ AssertObserverCount(0, 1, 0, 0); |
+ |
+ ASSERT_EQ(0, model.GetChildCount(root)); |
+} |
+ |
+// Verify if the nodes added under the root are all deleted when calling |
+// RemoveAll. Note that is responsability of the caller to free the memory |
+// of the nodes removed after RemoveAll is called. |
+// The tree looks like this: |
+// root |
+// |-- child1 |
+// | |-- foo1 |
+// | |-- child0 |
+// | |-- child1 |
+// +-------|-- child2 |
+TEST_F(TreeNodeModelTest, RemoveAllNodes) { |
+ TreeNodeWithValue<int>* root = |
+ new TreeNodeWithValue<int>(L"root", 0); |
+ TreeNodeModel<TreeNodeWithValue<int> > model(root); |
+ model.AddObserver(this); |
+ ClearCounts(); |
+ |
+ // Create the first child node. |
+ TreeNodeWithValue<int>* child1 = |
+ new TreeNodeWithValue<int>(L"child 1", 1); |
+ model.Add(root, 0, child1); |
+ |
+ TreeNodeWithValue<int>* foo1 = |
+ new TreeNodeWithValue<int>(L"foo1", 2); |
+ model.Add(child1, 0, foo1); |
+ |
+ // Add some nodes to |foo1|. |
+ for (int i = 0; i < 3; ++i) |
+ model.Add(foo1, i, new TreeNodeWithValue<int>(L"child" + i, i)); |
+ |
+ ASSERT_EQ(3, model.GetChildCount(foo1)); |
+ |
+ // Now remove all nodes from root. |
+ root->RemoveAll(); |
+ |
+ // Release memory, so we don't leak. |
+ delete child1; |
+ |
+ ASSERT_EQ(0, model.GetChildCount(root)); |
+} |
+ |
+// Verify if the model returns correct indexes for the specified nodes. |
+// The tree looks like this: |
+// root |
+// |-- child1 |
+// | |-- foo1 |
+// +-- child2 |
+TEST_F(TreeNodeModelTest, IndexOfChild) { |
+ TreeNodeWithValue<int>* root = |
+ new TreeNodeWithValue<int>(L"root", 0); |
+ TreeNodeModel<TreeNodeWithValue<int> > model(root); |
+ model.AddObserver(this); |
+ ClearCounts(); |
+ |
+ TreeNodeWithValue<int>* child1 = |
+ new TreeNodeWithValue<int>(L"child 1", 1); |
+ model.Add(root, 0, child1); |
+ |
+ TreeNodeWithValue<int>* child2 = |
+ new TreeNodeWithValue<int>(L"child 2", 2); |
+ model.Add(root, 1, child2); |
+ |
+ TreeNodeWithValue<int>* foo1 = |
+ new TreeNodeWithValue<int>(L"foo1", 0); |
+ model.Add(child1, 0, foo1); |
+ |
+ ASSERT_EQ(0, model.IndexOfChild(root, child1)); |
+ ASSERT_EQ(1, model.IndexOfChild(root, child2)); |
+ ASSERT_EQ(0, model.IndexOfChild(child1, foo1)); |
+ ASSERT_EQ(-1, model.IndexOfChild(root, foo1)); |
+} |
+ |
+// Verify whether a specified node has or not an ancestor. |
+// The tree looks like this: |
+// root |
+// |-- child1 |
+// |-- child2 |
+TEST_F(TreeNodeModelTest, HasAncestor) { |
+ TreeNodeWithValue<int>* root = |
+ new TreeNodeWithValue<int>(L"root", 0); |
+ TreeNodeModel<TreeNodeWithValue<int> > model(root); |
+ |
+ TreeNodeWithValue<int>* child1 = |
+ new TreeNodeWithValue<int>(L"child 1", 0); |
+ model.Add(root, 0, child1); |
+ |
+ TreeNodeWithValue<int>* child2 = |
+ new TreeNodeWithValue<int>(L"child 2", 1); |
+ model.Add(root, 1, child2); |
+ |
+ ASSERT_TRUE(root->HasAncestor(root)); |
+ ASSERT_FALSE(root->HasAncestor(child1)); |
+ ASSERT_TRUE(child1->HasAncestor(root)); |
+ ASSERT_FALSE(child1->HasAncestor(child2)); |
+ ASSERT_FALSE(child2->HasAncestor(child1)); |
+} |
+ |
+// The tree looks like this: |
+// root |
+// |-- child1 |
+// | |-- child2 |
+// | |-- child3 |
+// |-- foo1 |
+// | |-- foo2 |
+// | |-- foo3 |
+// | |-- foo4 |
+// +-- bar1 |
+// |
+// The TotalNodeCount of root is: 9 |
+// The TotalNodeCount of child1 is: 3 |
+// The TotalNodeCount of bar1 is: 1 |
+// And so on... |
+// The purpose here is to verify if the function returns the total of nodes |
+// under the specifed node correctly. The count should include the node it self. |
+TEST_F(TreeNodeModelTest, GetTotalNodeCount) { |
+ TreeNodeWithValue<int>* root = |
+ new TreeNodeWithValue<int>(L"root", 0); |
+ TreeNodeModel<TreeNodeWithValue<int> > model(root); |
+ |
+ TreeNodeWithValue<int>* child1 = |
+ new TreeNodeWithValue<int>(L"child1", 1); |
+ TreeNodeWithValue<int>* child2 = |
+ new TreeNodeWithValue<int>(L"child2", 2); |
+ TreeNodeWithValue<int>* child3 = |
+ new TreeNodeWithValue<int>(L"child3", 3); |
+ TreeNodeWithValue<int>* foo1 = |
+ new TreeNodeWithValue<int>(L"foo1", 4); |
+ TreeNodeWithValue<int>* foo2 = |
+ new TreeNodeWithValue<int>(L"foo2", 5); |
+ TreeNodeWithValue<int>* foo3 = |
+ new TreeNodeWithValue<int>(L"foo3", 6); |
+ TreeNodeWithValue<int>* foo4 = |
+ new TreeNodeWithValue<int>(L"foo4", 7); |
+ TreeNodeWithValue<int>* bar1 = |
+ new TreeNodeWithValue<int>(L"bar1", 8); |
+ |
+ model.Add(root, 0, child1); |
+ model.Add(child1, 0, child2); |
+ model.Add(child2, 0, child3); |
+ |
+ model.Add(root, 1, foo1); |
+ model.Add(foo1, 0, foo2); |
+ model.Add(foo1, 1, foo4); |
+ model.Add(foo2, 0, foo3); |
+ |
+ model.Add(root, 0, bar1); |
+ |
+ ASSERT_EQ(9, root->GetTotalNodeCount()); |
+ ASSERT_EQ(3, child1->GetTotalNodeCount()); |
+ ASSERT_EQ(1, bar1->GetTotalNodeCount()); |
+ ASSERT_EQ(2, foo2->GetTotalNodeCount()); |
+} |