1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// found in the LICENSE file.
4cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/app_list_view.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/command_line.h"
8cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/run_loop.h"
9cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/strings/string_util.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/app_list_switches.h"
13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/pagination_model.h"
146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/app_list/search_box_model.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/test/app_list_test_model.h"
16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/test/app_list_test_view_delegate.h"
17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/app_list_folder_view.h"
18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/app_list_main_view.h"
19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/apps_container_view.h"
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/apps_grid_view.h"
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/app_list/views/contents_switcher_view.h"
22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/contents_view.h"
23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/search_box_view.h"
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "ui/app_list/views/search_result_list_view.h"
25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/start_page_view.h"
26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/test/apps_grid_view_test_api.h"
27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/app_list/views/tile_item_view.h"
286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/views/controls/textfield/textfield.h"
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/test/views_test_base.h"
30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/views_delegate.h"
31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/views/widget/desktop_aura/desktop_native_widget_aura.h"
32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
33cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace app_list {
34cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace test {
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
36cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace {
37cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
38cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)enum TestType {
39cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TEST_TYPE_START = 0,
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  NORMAL = TEST_TYPE_START,
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  LANDSCAPE,
42cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPERIMENTAL,
43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  TEST_TYPE_END,
44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool IsViewAtOrigin(views::View* view) {
47cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return view->bounds().origin().IsOrigin();
48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)size_t GetVisibleTileItemViews(const std::vector<TileItemView*>& tiles) {
51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  size_t count = 0;
52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  for (std::vector<TileItemView*>::const_iterator it = tiles.begin();
53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       it != tiles.end();
54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)       ++it) {
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    if ((*it)->visible())
56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      count++;
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
58cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return count;
59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Choose a set that is 3 regular app list pages and 2 landscape app list pages.
62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const int kInitialItems = 34;
63cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class TestTileSearchResult : public SearchResult {
656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public:
666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  TestTileSearchResult() { set_display_type(DISPLAY_TILE); }
676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  virtual ~TestTileSearchResult() {}
686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) private:
706e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(TestTileSearchResult);
716e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)};
726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)
73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Allows the same tests to run with different contexts: either an Ash-style
74cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// root window or a desktop window tree host.
75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class AppListViewTestContext {
76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  AppListViewTestContext(int test_type, gfx::NativeView parent);
78cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ~AppListViewTestContext();
79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Test displaying the app list and performs a standard set of checks on its
81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // top level views. Then closes the window.
82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RunDisplayTest();
83cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
84cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Hides and reshows the app list with a folder open, expecting the main grid
85cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // view to be shown.
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RunReshowWithOpenFolderTest();
87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Tests displaying of the experimental app list and shows the start page.
89cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void RunStartPageTest();
90cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Tests switching rapidly between multiple pages of the launcher.
926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void RunPageSwitchingAnimationTest();
936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Tests changing the App List profile.
9546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  void RunProfileChangeTest();
9646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Tests displaying of the search results.
98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void RunSearchResultsTest();
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // A standard set of checks on a view, e.g., ensuring it is drawn and visible.
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static void CheckView(views::View* subview);
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
103cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Invoked when the Widget is closing, and the view it contains is about to
104cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // be torn down. This only occurs in a run loop and will be used as a signal
105cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // to quit.
106cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void NativeWidgetClosing() {
107cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    view_ = NULL;
108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    run_loop_->Quit();
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
110cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
111cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Whether the experimental "landscape" app launcher UI is being tested.
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool is_landscape() const {
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return test_type_ == LANDSCAPE || test_type_ == EXPERIMENTAL;
114cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
115cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
116cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
1176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Switches the active launcher page in the contents view and lays out to
1186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // ensure all launcher pages are in the correct position.
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  void ShowContentsViewPageAndVerify(int index);
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Shows the app list and waits until a paint occurs.
122cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Show();
123cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
124cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Closes the app list. This sets |view_| to NULL.
125cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void Close();
126cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
12746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Gets the PaginationModel owned by |view_|.
12846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  PaginationModel* GetPaginationModel();
12946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
130cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const TestType test_type_;
131cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<base::RunLoop> run_loop_;
132cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  app_list::AppListView* view_;  // Owned by native widget.
1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_ptr<app_list::test::AppListTestViewDelegate> delegate_;
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
135cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppListViewTestContext);
136cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
137cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
138cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Extend the regular AppListTestViewDelegate to communicate back to the test
139cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// context. Note the test context doesn't simply inherit this, because the
140cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// delegate is owned by the view.
141cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class UnitTestViewDelegate : public app_list::test::AppListTestViewDelegate {
142cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
143cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  UnitTestViewDelegate(AppListViewTestContext* parent) : parent_(parent) {}
144cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from app_list::AppListViewDelegate:
146cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool ShouldCenterWindow() const OVERRIDE {
147cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    return app_list::switches::IsCenteredAppListEnabled();
148cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
149cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
150cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Overridden from app_list::test::AppListTestViewDelegate:
151cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void ViewClosing() OVERRIDE { parent_->NativeWidgetClosing(); }
152cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
153cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
154cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListViewTestContext* parent_;
155cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
156cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(UnitTestViewDelegate);
157cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
158cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
159cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AppListViewTestContext::AppListViewTestContext(int test_type,
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                               gfx::NativeView parent)
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    : test_type_(static_cast<TestType>(test_type)) {
162cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (test_type_) {
163cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case NORMAL:
164cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
165cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case LANDSCAPE:
166cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::CommandLine::ForCurrentProcess()->AppendSwitch(
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          switches::kEnableCenteredAppList);
168cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
169cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case EXPERIMENTAL:
170cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      base::CommandLine::ForCurrentProcess()->AppendSwitch(
171cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)          switches::kEnableExperimentalAppList);
172cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
173cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
174cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
175cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
176cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
177cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delegate_.reset(new UnitTestViewDelegate(this));
1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  view_ = new app_list::AppListView(delegate_.get());
180cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
181cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Initialize centered around a point that ensures the window is wholly shown.
182cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  view_->InitAsBubbleAtFixedLocation(parent,
18346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)                                     0,
184cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     gfx::Point(300, 300),
185cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     views::BubbleBorder::FLOAT,
186cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                                     false /* border_accepts_events */);
187cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
188cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
189cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)AppListViewTestContext::~AppListViewTestContext() {
190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The view observes the PaginationModel which is about to get destroyed, so
191cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // if the view is not already deleted by the time this destructor is called,
192cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // there will be problems.
193cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(view_);
194cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
195cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
196cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// static
197cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AppListViewTestContext::CheckView(views::View* subview) {
198cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  ASSERT_TRUE(subview);
199cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(subview->parent());
200cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(subview->visible());
201cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(subview->IsDrawn());
202cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
203cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AppListViewTestContext::ShowContentsViewPageAndVerify(int index) {
2056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ContentsView* contents_view = view_->app_list_main_view()->contents_view();
2066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  contents_view->SetActivePage(index);
2076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  contents_view->Layout();
2086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  for (int i = 0; i < contents_view->NumLauncherPages(); ++i) {
2096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_EQ(i == index, IsViewAtOrigin(contents_view->GetPageView(i)));
2106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
2116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
2126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
213cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AppListViewTestContext::Show() {
214cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  view_->GetWidget()->Show();
215cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  run_loop_.reset(new base::RunLoop);
216cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  view_->SetNextPaintCallback(run_loop_->QuitClosure());
217cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  run_loop_->Run();
218cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
219cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(view_->GetWidget()->IsVisible());
220cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
221cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
222cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AppListViewTestContext::Close() {
223cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  view_->GetWidget()->Close();
224cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  run_loop_.reset(new base::RunLoop);
225cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  run_loop_->Run();
226cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
227cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // |view_| should have been deleted and set to NULL via ViewClosing().
228cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(view_);
229cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
230cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
23146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)PaginationModel* AppListViewTestContext::GetPaginationModel() {
23246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return view_->GetAppsPaginationModel();
23346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
23446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AppListViewTestContext::RunDisplayTest() {
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(view_->GetWidget()->IsVisible());
23746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(-1, GetPaginationModel()->total_pages());
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  delegate_->GetTestModel()->PopulateApps(kInitialItems);
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Show();
2411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Explicitly enforce the exact dimensions of the app list. Feel free to
2431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // change these if you need to (they are just here to prevent against
2441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // accidental changes to the window size).
2451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  switch (test_type_) {
2461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case NORMAL:
2471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ("400x500", view_->bounds().size().ToString());
2481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case LANDSCAPE:
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // NOTE: Height should not exceed 402, because otherwise there might not
2511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // be enough space to accomodate the virtual keyboard. (LANDSCAPE mode is
2521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      // enabled by default when the virtual keyboard is enabled.)
2531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ("576x402", view_->bounds().size().ToString());
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
2551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    case EXPERIMENTAL:
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ("768x560", view_->bounds().size().ToString());
2571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    default:
2591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NOTREACHED();
2601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      break;
2611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
263cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (is_landscape())
26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(2, GetPaginationModel()->total_pages());
265cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else
26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(3, GetPaginationModel()->total_pages());
26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(0, GetPaginationModel()->selected_page());
268cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
269cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Checks on the main view.
270cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListMainView* main_view = view_->app_list_main_view();
271cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
272cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view()));
273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
274116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(main_view->contents_view()->IsNamedPageActive(
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      test_type_ == EXPERIMENTAL ? ContentsView::NAMED_PAGE_START
276116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                 : ContentsView::NAMED_PAGE_APPS));
277116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
278cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Close();
279cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AppListViewTestContext::RunReshowWithOpenFolderTest() {
282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(view_->GetWidget()->IsVisible());
28346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(-1, GetPaginationModel()->total_pages());
284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListTestModel* model = delegate_->GetTestModel();
286cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  model->PopulateApps(kInitialItems);
287cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  const std::string folder_id =
288cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      model->MergeItems(model->top_level_item_list()->item_at(0)->id(),
289cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        model->top_level_item_list()->item_at(1)->id());
290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListFolderItem* folder_item = model->FindFolderItem(folder_id);
292cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_TRUE(folder_item);
293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
294cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Show();
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
296cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The main grid view should be showing initially.
297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListMainView* main_view = view_->app_list_main_view();
298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppsContainerView* container_view =
299cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      main_view->contents_view()->apps_container_view();
300cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
301cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(container_view->apps_grid_view()));
302cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(container_view->app_list_folder_view()->visible());
303cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
304cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppsGridViewTestApi test_api(container_view->apps_grid_view());
305cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  test_api.PressItemAt(0);
306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
307cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // After pressing the folder item, the folder view should be showing.
308cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
309cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(container_view->app_list_folder_view()));
310cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(container_view->apps_grid_view()->visible());
311cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
312cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  view_->GetWidget()->Hide();
313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(view_->GetWidget()->IsVisible());
314cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
315cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Show();
316cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
317cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // The main grid view should be showing after a reshow.
318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
319cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(container_view->apps_grid_view()));
320cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(container_view->app_list_folder_view()->visible());
321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
322cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Close();
323cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
324cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
325cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AppListViewTestContext::RunStartPageTest() {
326cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_FALSE(view_->GetWidget()->IsVisible());
32746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(-1, GetPaginationModel()->total_pages());
328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListTestModel* model = delegate_->GetTestModel();
329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  model->PopulateApps(3);
330cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
331cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Show();
332cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
333cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListMainView* main_view = view_->app_list_main_view();
334cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  StartPageView* start_page_view =
335cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      main_view->contents_view()->start_page_view();
336cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Checks on the main view.
337cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
338cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view()));
339cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (test_type_ == EXPERIMENTAL) {
340cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckView(start_page_view));
341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
342116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Show the start page view.
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ContentsView* contents_view = main_view->contents_view();
3446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ShowContentsViewPageAndVerify(contents_view->GetPageIndexForNamedPage(
345f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        ContentsView::NAMED_PAGE_START));
346cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_FALSE(main_view->search_box_view()->visible());
347cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
348116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    gfx::Size view_size(view_->GetPreferredSize());
3496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ShowContentsViewPageAndVerify(
350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        contents_view->GetPageIndexForNamedPage(ContentsView::NAMED_PAGE_APPS));
351cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_TRUE(main_view->search_box_view()->visible());
352cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
353116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // Hiding and showing the search box should not affect the app list's
354116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    // preferred size. This is a regression test for http://crbug.com/386912.
355116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    EXPECT_EQ(view_size.ToString(), view_->GetPreferredSize().ToString());
356116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
357cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Check tiles hide and show on deletion and addition.
3586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    model->results()->Add(new TestTileSearchResult());
3596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    start_page_view->UpdateForTesting();
3606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(1u, GetVisibleTileItemViews(start_page_view->tile_views()));
36103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    model->results()->DeleteAll();
3626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    start_page_view->UpdateForTesting();
3636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(0u, GetVisibleTileItemViews(start_page_view->tile_views()));
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  } else {
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    EXPECT_EQ(NULL, start_page_view);
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  Close();
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void AppListViewTestContext::RunPageSwitchingAnimationTest() {
3726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (test_type_ == EXPERIMENTAL) {
3736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    Show();
3746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    AppListMainView* main_view = view_->app_list_main_view();
3766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Checks on the main view.
3776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckView(main_view));
3786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckView(main_view->contents_view()));
3796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ContentsView* contents_view = main_view->contents_view();
3816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Pad the ContentsView with blank pages so we have at least 3 views.
3826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    while (contents_view->NumLauncherPages() < 3)
3836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      contents_view->AddBlankPageForTesting();
3846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    contents_view->SetActivePage(0);
3866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    contents_view->Layout();
3876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(IsViewAtOrigin(contents_view->GetPageView(0)));
3886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(1)));
3896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(2)));
3906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3916d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Change pages. View should not have moved without Layout().
3926d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    contents_view->SetActivePage(1);
3936d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(IsViewAtOrigin(contents_view->GetPageView(0)));
3946d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(1)));
3956d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(2)));
3966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
3976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Change to a third page. This queues up the second animation behind the
3986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // first.
3996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    contents_view->SetActivePage(2);
4006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(IsViewAtOrigin(contents_view->GetPageView(0)));
4016d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(1)));
4026d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(2)));
4036d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4046d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Call Layout(). Should jump to the third page.
4056d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    contents_view->Layout();
4066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(0)));
4076d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(IsViewAtOrigin(contents_view->GetPageView(1)));
4086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(IsViewAtOrigin(contents_view->GetPageView(2)));
4096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
4106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
4116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  Close();
4126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
4136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
41446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)void AppListViewTestContext::RunProfileChangeTest() {
41546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_FALSE(view_->GetWidget()->IsVisible());
41646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(-1, GetPaginationModel()->total_pages());
41746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  delegate_->GetTestModel()->PopulateApps(kInitialItems);
41846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
41946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Show();
42046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
42146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (is_landscape())
42246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(2, GetPaginationModel()->total_pages());
42346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  else
42446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(3, GetPaginationModel()->total_pages());
42546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
42646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Change the profile. The original model needs to be kept alive for
42746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // observers to unregister themselves.
42846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  scoped_ptr<AppListTestModel> original_test_model(
42946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      delegate_->ReleaseTestModel());
43046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  delegate_->set_next_profile_app_count(1);
43146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
43246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // The original ContentsView is destroyed here.
43346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  view_->SetProfileByPath(base::FilePath());
43446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_EQ(1, GetPaginationModel()->total_pages());
43546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
43646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  StartPageView* start_page_view =
43746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      view_->app_list_main_view()->contents_view()->start_page_view();
438f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ContentsSwitcherView* contents_switcher_view =
439f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      view_->app_list_main_view()->contents_switcher_view();
44046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (test_type_ == EXPERIMENTAL) {
441f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckView(contents_switcher_view));
442f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(view_->app_list_main_view()->contents_view(),
443f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)              contents_switcher_view->contents_view());
44446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_NO_FATAL_FAILURE(CheckView(start_page_view));
44546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  } else {
446f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(NULL, contents_switcher_view);
44746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    EXPECT_EQ(NULL, start_page_view);
44846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
44946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
45046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // New model updates should be processed by the start page view.
4516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  delegate_->GetTestModel()->results()->Add(new TestTileSearchResult());
4526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_type_ == EXPERIMENTAL) {
4536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    start_page_view->UpdateForTesting();
4546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(1u, GetVisibleTileItemViews(start_page_view->tile_views()));
4556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
45646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
45746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // Old model updates should be ignored.
4586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  original_test_model->results()->Add(new TestTileSearchResult());
4596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  original_test_model->results()->Add(new TestTileSearchResult());
4606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (test_type_ == EXPERIMENTAL) {
4616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    start_page_view->UpdateForTesting();
4626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    EXPECT_EQ(1u, GetVisibleTileItemViews(start_page_view->tile_views()));
4636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  }
46446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
46546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  Close();
46646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
46746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
468f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void AppListViewTestContext::RunSearchResultsTest() {
469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(view_->GetWidget()->IsVisible());
470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(-1, GetPaginationModel()->total_pages());
471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AppListTestModel* model = delegate_->GetTestModel();
472f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  model->PopulateApps(3);
473f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Show();
475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  AppListMainView* main_view = view_->app_list_main_view();
477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  ContentsView* contents_view = main_view->contents_view();
4786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  ShowContentsViewPageAndVerify(
479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      contents_view->GetPageIndexForNamedPage(ContentsView::NAMED_PAGE_APPS));
480f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(main_view->search_box_view()->visible());
481f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
482f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Show the search results.
483f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  contents_view->ShowSearchResults(true);
484f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  contents_view->Layout();
485f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(contents_view->IsShowingSearchResults());
486f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(main_view->search_box_view()->visible());
487f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
488f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (test_type_ == EXPERIMENTAL) {
489f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(
490f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        contents_view->IsNamedPageActive(ContentsView::NAMED_PAGE_START));
491f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(IsViewAtOrigin(contents_view->start_page_view()));
492f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  } else {
493f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(contents_view->IsNamedPageActive(
494f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        ContentsView::NAMED_PAGE_SEARCH_RESULTS));
495f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(IsViewAtOrigin(contents_view->search_results_view()));
496f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
497f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
498f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Hide the search results.
499f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  contents_view->ShowSearchResults(false);
500f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  contents_view->Layout();
501f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(contents_view->IsShowingSearchResults());
502116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
503116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Check that we return to the page that we were on before the search.
504116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(contents_view->IsNamedPageActive(ContentsView::NAMED_PAGE_APPS));
505116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(IsViewAtOrigin(contents_view->apps_container_view()));
506116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  EXPECT_TRUE(main_view->search_box_view()->visible());
507f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
5086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (test_type_ == EXPERIMENTAL) {
509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    ShowContentsViewPageAndVerify(contents_view->GetPageIndexForNamedPage(
510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        ContentsView::NAMED_PAGE_START));
511116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
5126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Check that typing into the dummy search box triggers the search page.
5136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    base::string16 search_text = base::UTF8ToUTF16("test");
5146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    SearchBoxView* dummy_search_box =
5156d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        contents_view->start_page_view()->dummy_search_box_view();
5166d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(dummy_search_box->IsDrawn());
5176d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    dummy_search_box->search_box()->InsertText(search_text);
5186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    contents_view->Layout();
5196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Check that the current search is using |search_text|.
5206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_EQ(search_text, delegate_->GetTestModel()->search_box()->text());
5216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(contents_view->IsShowingSearchResults());
5226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(dummy_search_box->IsDrawn());
5236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(main_view->search_box_view()->visible());
5246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_EQ(search_text, main_view->search_box_view()->search_box()->text());
5256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(
5266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        contents_view->IsNamedPageActive(ContentsView::NAMED_PAGE_START));
5276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(IsViewAtOrigin(contents_view->start_page_view()));
5286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5296d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Check that typing into the real search box triggers the search page.
5306d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ShowContentsViewPageAndVerify(
5316d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        contents_view->GetPageIndexForNamedPage(ContentsView::NAMED_PAGE_APPS));
5326d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(IsViewAtOrigin(contents_view->apps_container_view()));
5336d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5346d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    base::string16 new_search_text = base::UTF8ToUTF16("apple");
5356d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    main_view->search_box_view()->search_box()->SetText(base::string16());
5366d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    main_view->search_box_view()->search_box()->InsertText(new_search_text);
5376d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Check that the current search is using |search_text|.
5386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_EQ(new_search_text, delegate_->GetTestModel()->search_box()->text());
5396d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_EQ(new_search_text,
5406d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)              main_view->search_box_view()->search_box()->text());
5416d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(contents_view->IsShowingSearchResults());
5426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_FALSE(dummy_search_box->IsDrawn());
5436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(main_view->search_box_view()->visible());
5446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(dummy_search_box->search_box()->text().empty());
5456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
5466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    // Check that the dummy search box is clear when reshowing the start page.
5476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ShowContentsViewPageAndVerify(
5486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        contents_view->GetPageIndexForNamedPage(ContentsView::NAMED_PAGE_APPS));
5496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    ShowContentsViewPageAndVerify(contents_view->GetPageIndexForNamedPage(
5506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)        ContentsView::NAMED_PAGE_START));
5516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(dummy_search_box->IsDrawn());
5526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    EXPECT_TRUE(dummy_search_box->search_box()->text().empty());
5536d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  }
5546d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
555f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  Close();
556f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
557f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
558cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class AppListViewTestAura : public views::ViewsTestBase,
559cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            public ::testing::WithParamInterface<int> {
560cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
561cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListViewTestAura() {}
562cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~AppListViewTestAura() {}
563cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
564cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // testing::Test overrides:
565cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
566cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::ViewsTestBase::SetUp();
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // On Ash (only) the app list is placed into an aura::Window "container",
5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // which is also used to determine the context. In tests, use the ash root
5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // window as the parent. This only works on aura where the root window is a
5715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // NativeView as well as a NativeWindow.
5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gfx::NativeView container = NULL;
5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if defined(USE_AURA)
5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    container = GetContext();
5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    test_context_.reset(new AppListViewTestContext(GetParam(), container));
578cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
579cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
580cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
581cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test_context_.reset();
582cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::ViewsTestBase::TearDown();
583cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
584cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
585cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
586cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<AppListViewTestContext> test_context_;
587cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
588cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
589cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppListViewTestAura);
590cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
591cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
592cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)class AppListViewTestDesktop : public views::ViewsTestBase,
593cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                               public ::testing::WithParamInterface<int> {
594cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) public:
595cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  AppListViewTestDesktop() {}
596cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual ~AppListViewTestDesktop() {}
597cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
598cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // testing::Test overrides:
599cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void SetUp() OVERRIDE {
600cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    set_views_delegate(new AppListViewTestViewsDelegate(this));
601cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::ViewsTestBase::SetUp();
602cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test_context_.reset(new AppListViewTestContext(GetParam(), NULL));
603cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
604cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
605cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual void TearDown() OVERRIDE {
606cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    test_context_.reset();
607cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::ViewsTestBase::TearDown();
608cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
609cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
610cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) protected:
611cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  scoped_ptr<AppListViewTestContext> test_context_;
612cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
613cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) private:
614cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  class AppListViewTestViewsDelegate : public views::TestViewsDelegate {
615cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   public:
616cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    AppListViewTestViewsDelegate(AppListViewTestDesktop* parent)
617cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        : parent_(parent) {}
618cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
619cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    // Overridden from views::ViewsDelegate:
620cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    virtual void OnBeforeWidgetInit(
621cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        views::Widget::InitParams* params,
622cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        views::internal::NativeWidgetDelegate* delegate) OVERRIDE;
623cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
624cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)   private:
625cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    AppListViewTestDesktop* parent_;
626cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
627cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(AppListViewTestViewsDelegate);
628cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  };
629cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(AppListViewTestDesktop);
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)};
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void AppListViewTestDesktop::AppListViewTestViewsDelegate::OnBeforeWidgetInit(
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::Widget::InitParams* params,
635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    views::internal::NativeWidgetDelegate* delegate) {
636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Mimic the logic in ChromeViewsDelegate::OnBeforeWidgetInit(). Except, for
637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// ChromeOS, use the root window from the AuraTestHelper rather than depending
638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// on ash::Shell:GetPrimaryRootWindow(). Also assume non-ChromeOS is never the
639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Ash desktop, as that is covered by AppListViewTestAura.
640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS)
641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!params->parent && !params->context)
642cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    params->context = parent_->GetContext();
643cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#elif defined(USE_AURA)
644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (params->parent == NULL && params->context == NULL && !params->child)
645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    params->native_widget = new views::DesktopNativeWidgetAura(delegate);
646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif
647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace
650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests showing the app list with basic test model in an ash-style root window.
652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(AppListViewTestAura, Display) {
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunDisplayTest());
654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests showing the app list on the desktop. Note on ChromeOS, this will still
657cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// use the regular root window.
658cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(AppListViewTestDesktop, Display) {
659cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunDisplayTest());
660cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
661cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
662cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that the main grid view is shown after hiding and reshowing the app
663cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// list with a folder view open. This is a regression test for crbug.com/357058.
664cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(AppListViewTestAura, ReshowWithOpenFolder) {
665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunReshowWithOpenFolderTest());
666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(AppListViewTestDesktop, ReshowWithOpenFolder) {
669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunReshowWithOpenFolderTest());
670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Tests that the start page view operates correctly.
673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(AppListViewTestAura, StartPageTest) {
674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunStartPageTest());
675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)TEST_P(AppListViewTestDesktop, StartPageTest) {
678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunStartPageTest());
6796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
6806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
6816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)// Tests that the start page view operates correctly.
6826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AppListViewTestAura, PageSwitchingAnimationTest) {
6836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunPageSwitchingAnimationTest());
6846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
6856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
6866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)TEST_P(AppListViewTestDesktop, PageSwitchingAnimationTest) {
6876d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunPageSwitchingAnimationTest());
688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
69046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Tests that the profile changes operate correctly.
69146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_P(AppListViewTestAura, ProfileChangeTest) {
69246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunProfileChangeTest());
69346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
69446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
69546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)TEST_P(AppListViewTestDesktop, ProfileChangeTest) {
69646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunProfileChangeTest());
69746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
69846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
699f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Tests that the correct views are displayed for showing search results.
700f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_P(AppListViewTestAura, SearchResultsTest) {
701f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunSearchResultsTest());
702f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
703f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
704f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_P(AppListViewTestDesktop, SearchResultsTest) {
705f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_NO_FATAL_FAILURE(test_context_->RunSearchResultsTest());
706f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
707f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(AppListViewTestAuraInstance,
709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        AppListViewTestAura,
710cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        ::testing::Range<int>(TEST_TYPE_START, TEST_TYPE_END));
711cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
712cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)INSTANTIATE_TEST_CASE_P(AppListViewTestDesktopInstance,
713cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        AppListViewTestDesktop,
714cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        ::testing::Range<int>(TEST_TYPE_START, TEST_TYPE_END));
715cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
716cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace test
717cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace app_list
718