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