15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2014 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) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/views/folder_header_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h" 115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/compiler_specific.h" 1290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/strings/utf_string_conversions.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/app_list/app_list_constants.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/app_list/app_list_folder_item.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/app_list_item.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/app_list_model.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/app_list/test/app_list_test_model.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/app_list/views/folder_header_view_delegate.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/views/test/views_test_base.h" 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace app_list { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace test { 256e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace { 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class TestFolderHeaderViewDelegate : public FolderHeaderViewDelegate { 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public: 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestFolderHeaderViewDelegate() {} 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~TestFolderHeaderViewDelegate() {} 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // FolderHeaderViewDelegate 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void NavigateBack(AppListFolderItem* item, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ui::Event& event_flags) OVERRIDE {} 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) virtual void GiveBackFocusToSearchBox() OVERRIDE {} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetItemName(AppListFolderItem* item, 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& name) OVERRIDE { 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) folder_name_ = name; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& folder_name() const { return folder_name_; } 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string folder_name_; 48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(TestFolderHeaderViewDelegate); 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class FolderHeaderViewTest : public views::ViewsTestBase { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) FolderHeaderViewTest() {} 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual ~FolderHeaderViewTest() {} 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // testing::Test overrides: 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ViewsTestBase::SetUp(); 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) model_.reset(new AppListTestModel); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_->SetFoldersEnabled(true); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delegate_.reset(new TestFolderHeaderViewDelegate); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) folder_header_view_.reset(new FolderHeaderView(delegate_.get())); 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) folder_header_view_.reset(); // Release apps grid view before models. 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) delegate_.reset(); 72f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) views::ViewsTestBase::TearDown(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 74a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void UpdateFolderName(const std::string& name) { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::string16 folder_name = base::UTF8ToUTF16(name); 78558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch folder_header_view_->SetFolderNameForTest(folder_name); 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) folder_header_view_->ContentsChanged(NULL, folder_name); 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const std::string GetFolderNameFromUI() { 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return base::UTF16ToUTF8(folder_header_view_->GetFolderNameForTest()); 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) bool CanEditFolderName() { 876e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return folder_header_view_->IsFolderNameEnabledForTest(); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 8903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<AppListTestModel> model_; 9103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) scoped_ptr<FolderHeaderView> folder_header_view_; 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_ptr<TestFolderHeaderViewDelegate> delegate_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 94a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private: 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(FolderHeaderViewTest); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(FolderHeaderViewTest, SetFolderName) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creating a folder with empty folder name. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AppListFolderItem* folder_item = model_->CreateAndPopulateFolderWithApps(2); 10190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) folder_header_view_->SetFolderItem(folder_item); 10290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_EQ("", GetFolderNameFromUI()); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(CanEditFolderName()); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Update UI to set folder name to "test folder". 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) UpdateFolderName("test folder"); 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("test folder", delegate_->folder_name()); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)TEST_F(FolderHeaderViewTest, MaxFoldernNameLength) { 111a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Creating a folder with empty folder name. 112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch AppListFolderItem* folder_item = model_->CreateAndPopulateFolderWithApps(2); 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) folder_header_view_->SetFolderItem(folder_item); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_EQ("", GetFolderNameFromUI()); 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) EXPECT_TRUE(CanEditFolderName()); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update UI to set folder name to really long one beyond its maxium limit, 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The folder name should be trucated to the maximum length. 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string max_len_name; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < kMaxFolderNameChars; ++i) 121 max_len_name += "a"; 122 UpdateFolderName(max_len_name); 123 EXPECT_EQ(max_len_name, delegate_->folder_name()); 124 std::string too_long_name = max_len_name + "a"; 125 UpdateFolderName(too_long_name); 126 EXPECT_EQ(max_len_name, delegate_->folder_name()); 127} 128 129TEST_F(FolderHeaderViewTest, OemFolderNameNotEditable) { 130 AppListFolderItem* folder_item = model_->CreateAndAddOemFolder("oem folder"); 131 folder_header_view_->SetFolderItem(folder_item); 132 EXPECT_EQ("", GetFolderNameFromUI()); 133 EXPECT_FALSE(CanEditFolderName()); 134} 135 136} // namespace test 137} // namespace app_list 138