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" 12fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch#include "ui/views/controls/prefix_selector.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/controls/textfield/textfield.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) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)using base::ASCIIToUTF16; 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TestNode : public TreeNode<TestNode> { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode() {} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestNode() {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestNode); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates the following structure: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'root' 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'a' 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'b' 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'b1' 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 'c' 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class TreeViewTest : public ViewsTestBase { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TreeViewTest() : model_(new TestNode) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestNode*>(model_.GetRoot())->SetTitle(ASCIIToUTF16("root")); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(model_.GetRoot(), 0, "a"); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(Add(model_.GetRoot(), 1, "b"), 0, "b1"); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(model_.GetRoot(), 2, "c"); 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* Add(TestNode* parent, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& title); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string TreeViewContentsAsString(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetSelectedNodeTitle(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string GetEditingNodeTitle(); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* GetNodeByTitle(const std::string& title); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void IncrementSelection(bool next); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CollapseOrSelectParent(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ExpandOrSelectChild(); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int GetRowCount(); 65fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch PrefixSelector* selector() { return tree_.selector_.get(); } 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::TreeNodeModel<TestNode > model_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeView tree_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string InternalNodeAsString(TreeView::InternalNode* node); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) TestNode* GetNodeByTitleImpl(TestNode* node, const base::string16& title); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TreeViewTest); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestNode* TreeViewTest::Add(TestNode* parent, 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int index, 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& title) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* new_node = new TestNode; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_node->SetTitle(ASCIIToUTF16(title)); 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.Add(parent, new_node, index); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return new_node; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string TreeViewTest::TreeViewContentsAsString() { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return InternalNodeAsString(&tree_.root_); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string TreeViewTest::GetSelectedNodeTitle() { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeModelNode* model_node = tree_.GetSelectedNode(); 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return model_node ? base::UTF16ToASCII(model_node->GetTitle()) 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : std::string(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string TreeViewTest::GetEditingNodeTitle() { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeModelNode* model_node = tree_.GetEditingNode(); 99a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return model_node ? base::UTF16ToASCII(model_node->GetTitle()) 100a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) : std::string(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestNode* TreeViewTest::GetNodeByTitle(const std::string& title) { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetNodeByTitleImpl(model_.GetRoot(), ASCIIToUTF16(title)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TreeViewTest::IncrementSelection(bool next) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.IncrementSelection(next ? TreeView::INCREMENT_NEXT : 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeView::INCREMENT_PREVIOUS); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TreeViewTest::CollapseOrSelectParent() { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.CollapseOrSelectParent(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TreeViewTest::ExpandOrSelectChild() { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.ExpandOrSelectChild(); 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)int TreeViewTest::GetRowCount() { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tree_.GetRowCount(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TestNode* TreeViewTest::GetNodeByTitleImpl(TestNode* node, 1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const base::string16& title) { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->GetTitle() == title) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < node->child_count(); ++i) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestNode* child = GetNodeByTitleImpl(node->GetChild(i), title); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (child) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return child; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)std::string TreeViewTest::InternalNodeAsString( 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TreeView::InternalNode* node) { 138a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string result = base::UTF16ToASCII(node->model_node()->GetTitle()); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (node->is_expanded() && node->child_count()) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " ["; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < node->child_count(); ++i) { 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (i > 0) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += " "; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += InternalNodeAsString(node->GetChild(i)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result += "]"; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies setting model correctly updates internal state. 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, SetModel) { 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies SetSelectedNode works. 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, SetSelectedNode) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // NULL should clear the selection. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(NULL); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(), GetSelectedNodeTitle()); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select 'c'. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("c")); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c", GetSelectedNodeTitle()); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select 'b1', which should expand 'b'. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b1")); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Makes sure SetRootShown doesn't blow up. 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, HideRoot) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetRootShown(false); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetRowCount()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Expands a node and verifies the children are loaded correctly. 188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, Expand) { 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b1")); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root",GetSelectedNodeTitle()); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Collapes a node and verifies state. 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, Collapse) { 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b1")); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b1")); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Collapse(GetNodeByTitle("b")); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Selected node should have moved to 'b' 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies adding nodes works. 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, TreeNodesAdded) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a node between b and c. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(model_.GetRoot(), 2, "B"); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b B c]", TreeViewContentsAsString()); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a child of b1, which hasn't been loaded and shouldn't do anything. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(GetNodeByTitle("b1"), 0, "b11"); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b B c]", TreeViewContentsAsString()); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add a child of b, which isn't expanded yet, so it shouldn't effect 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // anything. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(GetNodeByTitle("b"), 1, "b2"); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b B c]", TreeViewContentsAsString()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(5, GetRowCount()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expand b and make sure b2 is there. 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b")); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1 b2] B c]", TreeViewContentsAsString()); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root",GetSelectedNodeTitle()); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(7, GetRowCount()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies removing nodes works. 242c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, TreeNodesRemoved) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add c1 as a child of c and c11 as a child of c1. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(Add(GetNodeByTitle("c"), 0, "c1"), 0, "c11"); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove c11, which shouldn't have any effect on the tree. 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Expand b1, then collapse it and remove its only child, b1. This shouldn't 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // effect the tree. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b")); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Collapse(GetNodeByTitle("b")); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("b1")->parent(), GetNodeByTitle("b1")); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove 'b'. 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("b")->parent(), GetNodeByTitle("b")); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a c]", TreeViewContentsAsString()); 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetRowCount()); 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove 'c11', shouldn't visually change anything. 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("c11")->parent(), GetNodeByTitle("c11")); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a c]", TreeViewContentsAsString()); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(3, GetRowCount()); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Select 'c1', remove 'c' and make sure selection changes. 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("c1")); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c1", GetSelectedNodeTitle()); 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("c")->parent(), GetNodeByTitle("c")); 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a]", TreeViewContentsAsString()); 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, GetRowCount()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetRootShown(false); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add 'b' select it and remove it. Because we're not showing the root 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // selection should change to 'a'. 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(GetNodeByTitle("root"), 1, "b"); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b")); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete model_.Remove(GetNodeByTitle("b")->parent(), GetNodeByTitle("b")); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a]", TreeViewContentsAsString()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, GetRowCount()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies changing a node title works. 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, TreeNodeChanged) { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add c1 as a child of c and c11 as a child of c1. 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Add(Add(GetNodeByTitle("c"), 0, "c1"), 0, "c11"); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change c11, shouldn't do anything. 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.SetTitle(GetNodeByTitle("c11"), ASCIIToUTF16("c11.new")); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change 'b1', shouldn't do anything. 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.SetTitle(GetNodeByTitle("b1"), ASCIIToUTF16("b1.new")); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change 'b'. 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_.SetTitle(GetNodeByTitle("b"), ASCIIToUTF16("b.new")); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b.new c]", TreeViewContentsAsString()); 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(4, GetRowCount()); 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies IncrementSelection() works. 318c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, IncrementSelection) { 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.Expand(GetNodeByTitle("b")); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(false); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c", GetSelectedNodeTitle()); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(true); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("c", GetSelectedNodeTitle()); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetRootShown(false); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("a")); 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) IncrementSelection(false); 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies CollapseOrSelectParent works. 342c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, CollapseOrSelectParent) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("root")); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollapseOrSelectParent(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", TreeViewContentsAsString()); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root", GetSelectedNodeTitle()); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hide the root, which should implicitly expand the root. 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetRootShown(false); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b1")); 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollapseOrSelectParent(); 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CollapseOrSelectParent(); 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Verifies ExpandOrSelectChild works. 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, ExpandOrSelectChild) { 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetModel(&model_); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("root")); 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) ExpandOrSelectChild(); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b c]", TreeViewContentsAsString()); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("b")); 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandOrSelectChild(); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandOrSelectChild(); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExpandOrSelectChild(); 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("root [a b [b1] c]", TreeViewContentsAsString()); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 391c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verify selection is properly updated on each keystroke. 392c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, SelectOnKeyStroke) { 393c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.SetModel(&model_); 394c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.ExpandAll(model_.GetRoot()); 395c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.GetTextInputClient(); 396c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->InsertText(ASCIIToUTF16("b")); 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("b", GetSelectedNodeTitle()); 398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->InsertText(ASCIIToUTF16("1")); 399c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 400c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 401fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch // Invoke OnViewBlur() to reset time. 402fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch selector()->OnViewBlur(); 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->InsertText(ASCIIToUTF16("z")); 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("b1", GetSelectedNodeTitle()); 405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 406fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch selector()->OnViewBlur(); 407c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) selector()->InsertText(ASCIIToUTF16("a")); 408c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ("a", GetSelectedNodeTitle()); 409c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 410c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 411c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Verifies edits are committed when focus is lost. 412c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(TreeViewTest, CommitOnFocusLost) { 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.SetModel(&model_); 414c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 415c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.SetSelectedNode(GetNodeByTitle("root")); 416c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ExpandOrSelectChild(); 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.SetEditable(true); 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.StartEditing(GetNodeByTitle("a")); 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.editor()->SetText(ASCIIToUTF16("a changed")); 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) tree_.OnDidChangeFocus(NULL, NULL); 421c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(GetNodeByTitle("a changed") != NULL); 422c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 423c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 425