Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(478)

Side by Side Diff: ui/app_list/views/app_list_view_unittest.cc

Issue 220393003: Add a unit test for resetting the app list on a reshow. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@trent_whole_app_list_unit_test
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "ui/app_list/views/app_list_view.h" 5 #include "ui/app_list/views/app_list_view.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "base/strings/string_util.h." 9 #include "base/strings/string_util.h."
tapted 2014/04/01 06:28:27 make sure you rebase to avoid my derp :p
calamity 2014/04/01 08:08:46 Done.
10 #include "testing/gtest/include/gtest/gtest.h" 10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/app_list/app_list_switches.h" 11 #include "ui/app_list/app_list_switches.h"
12 #include "ui/app_list/pagination_model.h" 12 #include "ui/app_list/pagination_model.h"
13 #include "ui/app_list/test/app_list_test_model.h" 13 #include "ui/app_list/test/app_list_test_model.h"
14 #include "ui/app_list/test/app_list_test_view_delegate.h" 14 #include "ui/app_list/test/app_list_test_view_delegate.h"
15 #include "ui/app_list/views/app_list_folder_view.h"
15 #include "ui/app_list/views/app_list_main_view.h" 16 #include "ui/app_list/views/app_list_main_view.h"
17 #include "ui/app_list/views/apps_container_view.h"
18 #include "ui/app_list/views/apps_grid_view.h"
16 #include "ui/app_list/views/contents_view.h" 19 #include "ui/app_list/views/contents_view.h"
17 #include "ui/app_list/views/search_box_view.h" 20 #include "ui/app_list/views/search_box_view.h"
21 #include "ui/app_list/views/test/apps_grid_view_test_api.h"
18 #include "ui/aura/test/aura_test_base.h" 22 #include "ui/aura/test/aura_test_base.h"
19 #include "ui/aura/window.h" 23 #include "ui/aura/window.h"
20 #include "ui/views/test/views_test_base.h" 24 #include "ui/views/test/views_test_base.h"
21 #include "ui/views/views_delegate.h" 25 #include "ui/views/views_delegate.h"
22 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h" 26 #include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
23 27
24 namespace app_list { 28 namespace app_list {
25 namespace test { 29 namespace test {
26 30
27 namespace { 31 namespace {
28 32
29 // Choose a set that is 3 regular app list pages and 2 landscape app list pages. 33 // Choose a set that is 3 regular app list pages and 2 landscape app list pages.
30 const int kInitialItems = 34; 34 const int kInitialItems = 34;
31 35
32 const char* TestName() { 36 const char* TestName() {
33 return ::testing::UnitTest::GetInstance()->current_test_info()->name(); 37 return ::testing::UnitTest::GetInstance()->current_test_info()->name();
34 } 38 }
35 39
36 // Allows the same tests to run with different contexts: either an Ash-style 40 // Allows the same tests to run with different contexts: either an Ash-style
37 // root window or a desktop window tree host. 41 // root window or a desktop window tree host.
38 class AppListViewTestContext { 42 class AppListViewTestContext {
39 public: 43 public:
40 AppListViewTestContext(aura::Window* parent); 44 AppListViewTestContext(aura::Window* parent);
41 ~AppListViewTestContext(); 45 ~AppListViewTestContext();
42 46
43 // Test displaying the app list and performs a standard set of checks on its 47 // Test displaying the app list and performs a standard set of checks on its
44 // top level views. Then closes the window. 48 // top level views. Then closes the window.
45 void RunDisplayTest(); 49 void RunDisplayTest();
46 50
51 // Hides and reshows the app list with a folder open, expecting the main grid
52 // view to be shown.
53 void RunReshowWithOpenFolderTest();
54
47 // A standard set of checks on a view, e.g., ensuring it is drawn and visible. 55 // A standard set of checks on a view, e.g., ensuring it is drawn and visible.
48 static void CheckView(views::View* subview); 56 static void CheckView(views::View* subview);
49 57
50 // Invoked when the Widget is closing, and the view it contains is about to 58 // Invoked when the Widget is closing, and the view it contains is about to
51 // be torn down. This only occurs in a run loop and will be used as a signal 59 // be torn down. This only occurs in a run loop and will be used as a signal
52 // to quit. 60 // to quit.
53 void NativeWidgetClosing() { 61 void NativeWidgetClosing() {
54 view_ = NULL; 62 view_ = NULL;
55 run_loop_->Quit(); 63 run_loop_->Quit();
56 } 64 }
57 65
58 // Whether the experimental "landscape" app launcher UI is being tested. 66 // Whether the experimental "landscape" app launcher UI is being tested.
59 bool is_landscape() const { return is_landscape_; } 67 bool is_landscape() const { return is_landscape_; }
60 68
61 private: 69 private:
70 // Shows the app list and waits until a paint occurs.
71 void Show();
72
73 // Closes the app list. This sets |view_| to NULL.
74 void Close();
75
62 const bool is_landscape_; 76 const bool is_landscape_;
63 scoped_ptr<base::RunLoop> run_loop_; 77 scoped_ptr<base::RunLoop> run_loop_;
64 PaginationModel pagination_model_; 78 PaginationModel pagination_model_;
65 app_list::AppListView* view_; // Owned by native widget. 79 app_list::AppListView* view_; // Owned by native widget.
66 app_list::test::AppListTestViewDelegate* delegate_; // Owned by |view_|; 80 app_list::test::AppListTestViewDelegate* delegate_; // Owned by |view_|;
67 81
68 DISALLOW_COPY_AND_ASSIGN(AppListViewTestContext); 82 DISALLOW_COPY_AND_ASSIGN(AppListViewTestContext);
69 }; 83 };
70 84
71 // Extend the regular AppListTestViewDelegate to communicate back to the test 85 // Extend the regular AppListTestViewDelegate to communicate back to the test
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
110 } 124 }
111 125
112 // static 126 // static
113 void AppListViewTestContext::CheckView(views::View* subview) { 127 void AppListViewTestContext::CheckView(views::View* subview) {
114 ASSERT_TRUE(subview); 128 ASSERT_TRUE(subview);
115 EXPECT_TRUE(subview->parent()); 129 EXPECT_TRUE(subview->parent());
116 EXPECT_TRUE(subview->visible()); 130 EXPECT_TRUE(subview->visible());
117 EXPECT_TRUE(subview->IsDrawn()); 131 EXPECT_TRUE(subview->IsDrawn());
118 } 132 }
119 133
134 void AppListViewTestContext::Show() {
135 view_->GetWidget()->Show();
136 run_loop_.reset(new base::RunLoop);
137 AppListView::SetNextPaintCallback(run_loop_->QuitClosure());
138 run_loop_->Run();
139
140 EXPECT_TRUE(view_->GetWidget()->IsVisible());
141 }
142
143 void AppListViewTestContext::Close() {
144 view_->GetWidget()->Close();
145 run_loop_.reset(new base::RunLoop);
146 run_loop_->Run();
147
148 // |view_| should have been deleted and set to NULL via ViewClosing().
149 EXPECT_FALSE(view_);
150 }
151
120 void AppListViewTestContext::RunDisplayTest() { 152 void AppListViewTestContext::RunDisplayTest() {
121 EXPECT_FALSE(view_->GetWidget()->IsVisible()); 153 EXPECT_FALSE(view_->GetWidget()->IsVisible());
122 EXPECT_EQ(-1, pagination_model_.total_pages()); 154 EXPECT_EQ(-1, pagination_model_.total_pages());
123 view_->GetWidget()->Show();
124 delegate_->GetTestModel()->PopulateApps(kInitialItems); 155 delegate_->GetTestModel()->PopulateApps(kInitialItems);
125 156
126 run_loop_.reset(new base::RunLoop); 157 Show();
127 AppListView::SetNextPaintCallback(run_loop_->QuitClosure());
128 run_loop_->Run();
129
130 EXPECT_TRUE(view_->GetWidget()->IsVisible());
131 158
132 if (is_landscape_) 159 if (is_landscape_)
133 EXPECT_EQ(2, pagination_model_.total_pages()); 160 EXPECT_EQ(2, pagination_model_.total_pages());
134 else 161 else
135 EXPECT_EQ(3, pagination_model_.total_pages()); 162 EXPECT_EQ(3, pagination_model_.total_pages());
136 EXPECT_EQ(0, pagination_model_.selected_page()); 163 EXPECT_EQ(0, pagination_model_.selected_page());
137 164
138 // Checks on the main view. 165 // Checks on the main view.
139 AppListMainView* main_view = view_->app_list_main_view(); 166 AppListMainView* main_view = view_->app_list_main_view();
140 EXPECT_NO_FATAL_FAILURE(CheckView(main_view)); 167 EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
141 EXPECT_NO_FATAL_FAILURE(CheckView(main_view->search_box_view())); 168 EXPECT_NO_FATAL_FAILURE(CheckView(main_view->search_box_view()));
142 EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view())); 169 EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view()));
143 170
144 view_->GetWidget()->Close(); 171 Close();
145 run_loop_.reset(new base::RunLoop); 172 }
146 run_loop_->Run();
147 173
148 // |view_| should have been deleted and set to NULL via ViewClosing(). 174 void AppListViewTestContext::RunReshowWithOpenFolderTest() {
149 EXPECT_FALSE(view_); 175 EXPECT_FALSE(view_->GetWidget()->IsVisible());
176 EXPECT_EQ(-1, pagination_model_.total_pages());
177
178 AppListTestModel* model = delegate_->GetTestModel();
179 model->PopulateApps(kInitialItems);
180 const std::string folder_id =
181 model->MergeItems(model->top_level_item_list()->item_at(0)->id(),
182 model->top_level_item_list()->item_at(1)->id());
183
184 AppListFolderItem* folder_item = model->FindFolderItem(folder_id);
185 EXPECT_TRUE(folder_item);
186
187 Show();
188
189 // The main grid view should be showing initially.
190 AppListMainView* main_view = view_->app_list_main_view();
191 AppsContainerView* container_view =
192 main_view->contents_view()->apps_container_view();
193 EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
194 EXPECT_NO_FATAL_FAILURE(CheckView(container_view->apps_grid_view()));
195
tapted 2014/04/01 06:28:27 Can you EXPECT_FALSE(container_view->app_list_fo
calamity 2014/04/01 08:08:46 Done.
196 AppsGridViewTestApi test_api(container_view->apps_grid_view());
197 test_api.PressItemAt(0);
198
199 // After pressing the folder item, the folder view should be showing.
200 EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
201 EXPECT_NO_FATAL_FAILURE(CheckView(container_view->app_list_folder_view()));
202
tapted 2014/04/01 06:28:27 and EXPECT_FALSE(container_view->apps_grid_view()
calamity 2014/04/01 08:08:46 Done.
203 view_->GetWidget()->Hide();
204 EXPECT_FALSE(view_->GetWidget()->IsVisible());
205
206 Show();
207
208 // The main grid view should be showing after a reshow.
209 EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
210 EXPECT_NO_FATAL_FAILURE(CheckView(container_view->apps_grid_view()));
tapted 2014/04/01 06:28:27 EXPECT_FALSE(container_view->app_list_folder_view(
calamity 2014/04/01 08:08:46 Done.
211
212 Close();
150 } 213 }
151 214
152 class AppListViewTestAura : public views::ViewsTestBase { 215 class AppListViewTestAura : public views::ViewsTestBase {
153 public: 216 public:
154 AppListViewTestAura() {} 217 AppListViewTestAura() {}
155 virtual ~AppListViewTestAura() {} 218 virtual ~AppListViewTestAura() {}
156 219
157 // testing::Test overrides: 220 // testing::Test overrides:
158 virtual void SetUp() OVERRIDE { 221 virtual void SetUp() OVERRIDE {
159 views::ViewsTestBase::SetUp(); 222 views::ViewsTestBase::SetUp();
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
250 EXPECT_TRUE(test_context_->is_landscape()); 313 EXPECT_TRUE(test_context_->is_landscape());
251 host()->Show(); 314 host()->Show();
252 EXPECT_NO_FATAL_FAILURE(test_context_->RunDisplayTest()); 315 EXPECT_NO_FATAL_FAILURE(test_context_->RunDisplayTest());
253 } 316 }
254 317
255 TEST_F(AppListViewTestDesktop, DisplayLandscape) { 318 TEST_F(AppListViewTestDesktop, DisplayLandscape) {
256 EXPECT_TRUE(test_context_->is_landscape()); 319 EXPECT_TRUE(test_context_->is_landscape());
257 EXPECT_NO_FATAL_FAILURE(test_context_->RunDisplayTest()); 320 EXPECT_NO_FATAL_FAILURE(test_context_->RunDisplayTest());
258 } 321 }
259 322
323 // Tests that the main grid view is shown after hiding and reshowing the app
324 // list with a folder view open. This is a regression test for crbug.com/357058.
325 TEST_F(AppListViewTestAura, ReshowWithOpenFolder) {
326 EXPECT_FALSE(test_context_->is_landscape());
327 host()->Show();
328 EXPECT_NO_FATAL_FAILURE(test_context_->RunReshowWithOpenFolderTest());
329 }
330
331 TEST_F(AppListViewTestDesktop, ReshowWithOpenFolder) {
332 EXPECT_FALSE(test_context_->is_landscape());
333 EXPECT_NO_FATAL_FAILURE(test_context_->RunReshowWithOpenFolderTest());
334 }
335
260 } // namespace test 336 } // namespace test
261 } // namespace app_list 337 } // namespace app_list
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698