Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / athena / home / athena_start_page_view_unittest.cc
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "athena/home/athena_start_page_view.h"
6
7 #include "athena/home/home_card_constants.h"
8 #include "athena/test/athena_test_base.h"
9 #include "base/format_macros.h"
10 #include "base/strings/stringprintf.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "ui/app_list/app_list_switches.h"
13 #include "ui/app_list/search_box_model.h"
14 #include "ui/app_list/test/app_list_test_model.h"
15 #include "ui/app_list/test/app_list_test_view_delegate.h"
16 #include "ui/app_list/views/search_box_view.h"
17 #include "ui/gfx/geometry/rect.h"
18 #include "ui/views/controls/textfield/textfield.h"
19
20 namespace athena {
21
22 namespace {
23
24 // The number of dummy applications in this tetst.
25 const size_t kNumApps = 10;
26
27 }
28
29 class AthenaTestViewDelegate : public app_list::test::AppListTestViewDelegate {
30  public:
31   AthenaTestViewDelegate() {}
32   virtual ~AthenaTestViewDelegate() {}
33
34  private:
35   // app_list::AppListViewDelegate:
36   virtual views::View* CreateStartPageWebView(const gfx::Size& size) OVERRIDE {
37     return new views::View();
38   }
39
40   DISALLOW_COPY_AND_ASSIGN(AthenaTestViewDelegate);
41 };
42
43 class AthenaStartPageViewTest : public test::AthenaTestBase {
44  public:
45   AthenaStartPageViewTest() {}
46   virtual ~AthenaStartPageViewTest() {}
47
48   // testing::Test:
49   virtual void SetUp() OVERRIDE {
50     test::AthenaTestBase::SetUp();
51     app_list::test::AppListTestModel* model = view_delegate_.GetTestModel();
52     for (size_t i = 0; i < kNumApps; ++i) {
53       model->AddItem(new app_list::test::AppListTestModel::AppListTestItem(
54           base::StringPrintf("id-%" PRIuS, i), model));
55     }
56
57     view_.reset(new AthenaStartPageView(&view_delegate_));
58     SetSize(gfx::Size(1280, 800));
59   }
60   virtual void TearDown() OVERRIDE {
61     view_.reset();
62     test::AthenaTestBase::TearDown();
63   }
64
65  protected:
66   void SetSize(const gfx::Size& new_size) {
67     view_->SetSize(new_size);
68     view_->Layout();
69   }
70
71   gfx::Rect GetIconsBounds() const {
72     return view_->app_icon_container_->layer()->GetTargetBounds();
73   }
74
75   gfx::Rect GetControlBounds() const {
76     return view_->control_icon_container_->layer()->GetTargetBounds();
77   }
78
79   gfx::Rect GetSearchBoxBounds() const {
80     return view_->search_box_container_->layer()->GetTargetBounds();
81   }
82
83   gfx::Rect GetLogoBounds() const {
84     return view_->logo_->layer()->GetTargetBounds();
85   }
86
87   bool IsLogoVisible() const {
88     return view_->logo_->layer()->GetTargetOpacity() > 0 &&
89         view_->logo_->layer()->GetTargetVisibility();
90   }
91
92   gfx::Size GetSearchBoxPreferredSize() {
93     return view_->search_box_container_->GetPreferredSize();
94   }
95
96   void SetSearchQuery(const base::string16& query) {
97     view_delegate_.GetModel()->search_box()->SetText(query);
98   }
99
100   base::string16 GetVisibleQuery() {
101     return view_->search_box_view_->search_box()->text();
102   }
103
104   scoped_ptr<AthenaStartPageView> view_;
105
106  private:
107   AthenaTestViewDelegate view_delegate_;
108
109   DISALLOW_COPY_AND_ASSIGN(AthenaStartPageViewTest);
110 };
111
112 TEST_F(AthenaStartPageViewTest, BasicLayout) {
113   // BOTTOM state. logo is invisible. icons, search box, and controls are
114   // arranged horizontally.
115   EXPECT_FALSE(IsLogoVisible());
116
117   // Three components are aligned at the middle point.
118   EXPECT_NEAR(GetIconsBounds().CenterPoint().y(),
119               GetControlBounds().CenterPoint().y(),
120               1);
121   EXPECT_NEAR(GetIconsBounds().CenterPoint().y(),
122               GetSearchBoxBounds().CenterPoint().y(),
123               1);
124   EXPECT_NEAR(GetControlBounds().CenterPoint().y(),
125               GetSearchBoxBounds().CenterPoint().y(),
126               1);
127
128   // Horizonttaly aligned in the order of icons, search_box, and controls.
129   EXPECT_LE(GetIconsBounds().right(), GetSearchBoxBounds().x());
130   EXPECT_LE(GetSearchBoxBounds().right(), GetControlBounds().x());
131   EXPECT_LE(0, GetIconsBounds().y());
132
133   // Search box should appear in the middle.
134   EXPECT_NEAR(GetSearchBoxBounds().CenterPoint().x(),
135               view_->bounds().CenterPoint().x(),
136               1);
137
138   // Should fit inside of the home card height.
139   EXPECT_GE(kHomeCardHeight, GetIconsBounds().height());
140   EXPECT_GE(kHomeCardHeight, GetSearchBoxBounds().height());
141   EXPECT_GE(kHomeCardHeight, GetControlBounds().height());
142   EXPECT_EQ(GetSearchBoxPreferredSize().ToString(),
143             GetSearchBoxBounds().size().ToString());
144
145   // CENTERED state. logo is visible. search box appears below the logo,
146   // icons and controls are arranged horizontally and below the search box.
147   view_->SetLayoutState(1.0f);
148   EXPECT_TRUE(IsLogoVisible());
149   EXPECT_NEAR(GetLogoBounds().x() + GetLogoBounds().width() / 2,
150               GetSearchBoxBounds().x() + GetSearchBoxBounds().width() / 2,
151               1);
152   EXPECT_LE(GetLogoBounds().bottom(), GetSearchBoxBounds().y());
153   EXPECT_EQ(GetIconsBounds().y(), GetControlBounds().y());
154   EXPECT_LE(GetIconsBounds().right(), GetControlBounds().x());
155   EXPECT_LE(GetSearchBoxBounds().bottom(), GetIconsBounds().y());
156 }
157
158 TEST_F(AthenaStartPageViewTest, NarrowLayout) {
159   SetSize(gfx::Size(800, 1280));
160
161   // BOTTOM state. Similar to BasicLayout.
162   EXPECT_FALSE(IsLogoVisible());
163   // Three components are aligned at the middle point.
164   EXPECT_NEAR(GetIconsBounds().CenterPoint().y(),
165               GetControlBounds().CenterPoint().y(),
166               1);
167   EXPECT_NEAR(GetIconsBounds().CenterPoint().y(),
168               GetSearchBoxBounds().CenterPoint().y(),
169               1);
170   EXPECT_NEAR(GetControlBounds().CenterPoint().y(),
171               GetSearchBoxBounds().CenterPoint().y(),
172               1);
173
174   // Horizonttaly aligned in the order of icons, search_box, and controls.
175   EXPECT_LE(GetIconsBounds().right(), GetSearchBoxBounds().x());
176   EXPECT_LE(GetSearchBoxBounds().right(), GetControlBounds().x());
177   EXPECT_LE(0, GetIconsBounds().y());
178
179   // Search box should appear in the middle.
180   EXPECT_NEAR(GetSearchBoxBounds().CenterPoint().x(),
181               view_->bounds().CenterPoint().x(),
182               1);
183
184   // Should fit inside of the home card height.
185   EXPECT_GE(kHomeCardHeight, GetIconsBounds().height());
186   EXPECT_GE(kHomeCardHeight, GetSearchBoxBounds().height());
187   EXPECT_GE(kHomeCardHeight, GetControlBounds().height());
188
189   // Search box is narrower because of the size is too narrow.
190   EXPECT_GT(GetSearchBoxPreferredSize().width(), GetSearchBoxBounds().width());
191   EXPECT_EQ(GetSearchBoxPreferredSize().height(),
192             GetSearchBoxBounds().height());
193
194   // CENTERED state. Search box should be back to the preferred size.
195   view_->SetLayoutState(1.0f);
196   EXPECT_EQ(GetSearchBoxPreferredSize().ToString(),
197             GetSearchBoxBounds().size().ToString());
198
199   // Back to BOTTOM state, the search box shrinks again.
200   view_->SetLayoutState(0.0f);
201   EXPECT_GT(GetSearchBoxPreferredSize().width(), GetSearchBoxBounds().width());
202
203   // Then set back to the original size, now the size is wide enough so the
204   // search box bounds becomes as preferred.
205   SetSize(gfx::Size(1280, 800));
206   EXPECT_EQ(GetSearchBoxPreferredSize().ToString(),
207             GetSearchBoxBounds().size().ToString());
208 }
209
210 TEST_F(AthenaStartPageViewTest, SearchBox) {
211   view_->SetLayoutState(1.0f);
212   EXPECT_TRUE(IsLogoVisible());
213
214   const gfx::Rect base_search_box_bounds = GetSearchBoxBounds();
215
216   const base::string16 query = base::UTF8ToUTF16("test");
217   SetSearchQuery(query);
218
219   EXPECT_FALSE(IsLogoVisible());
220   EXPECT_GT(base_search_box_bounds.y(), GetSearchBoxBounds().y());
221   EXPECT_EQ(query, GetVisibleQuery());
222
223   SetSearchQuery(base::string16());
224   EXPECT_TRUE(IsLogoVisible());
225   EXPECT_EQ(base_search_box_bounds.ToString(), GetSearchBoxBounds().ToString());
226   EXPECT_TRUE(GetVisibleQuery().empty());
227 }
228
229 }  // namespace athena