tree_view_unittest.cc revision 5e3f23d412006dc4db4e659864679f29341e113f
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/tree/tree_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/string_util.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/tree_node_model.h" 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/textfield/textfield.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/tree/tree_view_selector.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/test/views_test_base.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::TreeModel; 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::TreeModelNode; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::TreeNode; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestNode : public TreeNode<TestNode> { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode() {} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestNode() {} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestNode); 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates the following structure: 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'root' 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'a' 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'b' 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'b1' 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'c' 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TreeViewTest : public ViewsTestBase { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TreeViewTest() : model_(new TestNode) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestNode*>(model_.GetRoot())->SetTitle(ASCIIToUTF16("root")); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(model_.GetRoot(), 0, "a"); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(Add(model_.GetRoot(), 1, "b"), 0, "b1"); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(model_.GetRoot(), 2, "c"); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* Add(TestNode* parent, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& title); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string TreeViewContentsAsString(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetSelectedNodeTitle(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetEditingNodeTitle(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* GetNodeByTitle(const std::string& title); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncrementSelection(bool next); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CollapseOrSelectParent(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpandOrSelectChild(); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetRowCount(); 63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TreeViewSelector* selector() { return tree_.selector_.get(); } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TreeNodeModel<TestNode > model_; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeView tree_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string InternalNodeAsString(TreeView::InternalNode* node); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* GetNodeByTitleImpl(TestNode* node, const string16& title); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TreeViewTest); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestNode* TreeViewTest::Add(TestNode* parent, 77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int index, 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& title) { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* new_node = new TestNode; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_node->SetTitle(ASCIIToUTF16(title)); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.Add(parent, new_node, index); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_node; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string TreeViewTest::TreeViewContentsAsString() { 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InternalNodeAsString(&tree_.root_); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string TreeViewTest::GetSelectedNodeTitle() { 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeModelNode* model_node = tree_.GetSelectedNode(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return model_node ? UTF16ToASCII(model_node->GetTitle()) : std::string(); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string TreeViewTest::GetEditingNodeTitle() { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeModelNode* model_node = tree_.GetEditingNode(); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return model_node ? UTF16ToASCII(model_node->GetTitle()) : std::string(); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestNode* TreeViewTest::GetNodeByTitle(const std::string& title) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetNodeByTitleImpl(model_.GetRoot(), ASCIIToUTF16(title)); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TreeViewTest::IncrementSelection(bool next) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.IncrementSelection(next ? TreeView::INCREMENT_NEXT : 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeView::INCREMENT_PREVIOUS); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TreeViewTest::CollapseOrSelectParent() { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.CollapseOrSelectParent(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TreeViewTest::ExpandOrSelectChild() { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.ExpandOrSelectChild(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int TreeViewTest::GetRowCount() { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tree_.GetRowCount(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestNode* TreeViewTest::GetNodeByTitleImpl(TestNode* node, 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const string16& title) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->GetTitle() == title) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < node->child_count(); ++i) { 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* child = GetNodeByTitleImpl(node->GetChild(i), title); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return child; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string TreeViewTest::InternalNodeAsString( 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeView::InternalNode* node) { 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string result = UTF16ToASCII(node->model_node()->GetTitle()); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->is_expanded() && node->child_count()) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " ["; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < node->child_count(); ++i) { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " "; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += InternalNodeAsString(node->GetChild(i)); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += "]"; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies setting model correctly updates internal state. 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, SetModel) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies SetSelectedNode works. 156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, SetSelectedNode) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL should clear the selection. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(NULL); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(), GetSelectedNodeTitle()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select 'c'. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("c")); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c", GetSelectedNodeTitle()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select 'b1', which should expand 'b'. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b1")); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure SetRootShown doesn't blow up. 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, HideRoot) { 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetRootShown(false); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetRowCount()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Expands a node and verifies the children are loaded correctly. 184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, Expand) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b1")); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root",GetSelectedNodeTitle()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Collapes a node and verifies state. 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, Collapse) { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b1")); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b1")); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Collapse(GetNodeByTitle("b")); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Selected node should have moved to 'b' 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies adding nodes works. 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, TreeNodesAdded) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a node between b and c. 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(model_.GetRoot(), 2, "B"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b B c]", TreeViewContentsAsString()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a child of b1, which hasn't been loaded and shouldn't do anything. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(GetNodeByTitle("b1"), 0, "b11"); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b B c]", TreeViewContentsAsString()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a child of b, which isn't expanded yet, so it shouldn't effect 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // anything. 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(GetNodeByTitle("b"), 1, "b2"); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b B c]", TreeViewContentsAsString()); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expand b and make sure b2 is there. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b")); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1 b2] B c]", TreeViewContentsAsString()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root",GetSelectedNodeTitle()); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7, GetRowCount()); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies removing nodes works. 238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, TreeNodesRemoved) { 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add c1 as a child of c and c11 as a child of c1. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(Add(GetNodeByTitle("c"), 0, "c1"), 0, "c11"); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove c11, which shouldn't have any effect on the tree. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expand b1, then collapse it and remove its only child, b1. This shouldn't 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // effect the tree. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b")); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Collapse(GetNodeByTitle("b")); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("b1")->parent(), GetNodeByTitle("b1")); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove 'b'. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("b")->parent(), GetNodeByTitle("b")); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a c]", TreeViewContentsAsString()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetRowCount()); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove 'c11', shouldn't visually change anything. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("c11")->parent(), GetNodeByTitle("c11")); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a c]", TreeViewContentsAsString()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetRowCount()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select 'c1', remove 'c' and make sure selection changes. 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("c1")); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c1", GetSelectedNodeTitle()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("c")->parent(), GetNodeByTitle("c")); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a]", TreeViewContentsAsString()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, GetRowCount()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetRootShown(false); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add 'b' select it and remove it. Because we're not showing the root 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // selection should change to 'a'. 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(GetNodeByTitle("root"), 1, "b"); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b")); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("b")->parent(), GetNodeByTitle("b")); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a]", TreeViewContentsAsString()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetRowCount()); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies changing a node title works. 289c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, TreeNodeChanged) { 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add c1 as a child of c and c11 as a child of c1. 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(Add(GetNodeByTitle("c"), 0, "c1"), 0, "c11"); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change c11, shouldn't do anything. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.SetTitle(GetNodeByTitle("c11"), ASCIIToUTF16("c11.new")); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change 'b1', shouldn't do anything. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.SetTitle(GetNodeByTitle("b1"), ASCIIToUTF16("b1.new")); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change 'b'. 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.SetTitle(GetNodeByTitle("b"), ASCIIToUTF16("b.new")); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b.new c]", TreeViewContentsAsString()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies IncrementSelection() works. 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, IncrementSelection) { 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b")); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(false); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c", GetSelectedNodeTitle()); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c", GetSelectedNodeTitle()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetRootShown(false); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("a")); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(false); 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies CollapseOrSelectParent works. 338c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, CollapseOrSelectParent) { 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("root")); 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollapseOrSelectParent(); 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", TreeViewContentsAsString()); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hide the root, which should implicitly expand the root. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetRootShown(false); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b1")); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollapseOrSelectParent(); 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollapseOrSelectParent(); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies ExpandOrSelectChild works. 363c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, ExpandOrSelectChild) { 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("root")); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandOrSelectChild(); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandOrSelectChild(); 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b")); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandOrSelectChild(); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandOrSelectChild(); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandOrSelectChild(); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify selection is properly updated on each keystroke. 388c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, SelectOnKeyStroke) { 389c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.SetModel(&model_); 390c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.ExpandAll(model_.GetRoot()); 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.GetTextInputClient(); 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->InsertText(ASCIIToUTF16("b")); 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->InsertText(ASCIIToUTF16("1")); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Invoke OnTreeViewBlur() to reset time. 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->OnTreeViewBlur(); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->InsertText(ASCIIToUTF16("z")); 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->OnTreeViewBlur(); 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->InsertText(ASCIIToUTF16("a")); 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 406c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies edits are committed when focus is lost. 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, CommitOnFocusLost) { 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.SetModel(&model_); 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("root")); 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpandOrSelectChild(); 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.SetEditable(true); 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.StartEditing(GetNodeByTitle("a")); 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.editor()->SetText(ASCIIToUTF16("a changed")); 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.OnDidChangeFocus(NULL, NULL); 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(GetNodeByTitle("a changed") != NULL); 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 421