1// Copyright 2013 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 "base/mac/scoped_nsobject.h"
6#import "testing/gtest_mac.h"
7#import "ui/app_list/cocoa/app_list_view_controller.h"
8#import "ui/app_list/cocoa/apps_grid_controller.h"
9#import "ui/app_list/cocoa/test/apps_grid_controller_test_helper.h"
10#include "ui/app_list/test/app_list_test_model.h"
11#include "ui/app_list/test/app_list_test_view_delegate.h"
12
13namespace app_list {
14namespace test {
15
16class AppListViewControllerTest : public AppsGridControllerTestHelper {
17 public:
18  AppListViewControllerTest() {}
19
20  virtual void SetUp() OVERRIDE {
21    app_list_view_controller_.reset([[AppListViewController alloc] init]);
22    delegate_.reset(new AppListTestViewDelegate);
23    [app_list_view_controller_ setDelegate:delegate_.get()];
24    SetUpWithGridController([app_list_view_controller_ appsGridController]);
25    [[test_window() contentView] addSubview:[app_list_view_controller_ view]];
26  }
27
28  virtual void TearDown() OVERRIDE {
29    [app_list_view_controller_ setDelegate:NULL];
30    app_list_view_controller_.reset();
31    AppsGridControllerTestHelper::TearDown();
32  }
33
34  void ReplaceTestModel(int item_count) {
35    [app_list_view_controller_ setDelegate:NULL];
36    delegate_.reset(new AppListTestViewDelegate);
37    delegate_->ReplaceTestModel(item_count);
38    [app_list_view_controller_ setDelegate:delegate_.get()];
39  }
40
41  AppListTestModel* model() { return delegate_->GetTestModel(); }
42
43 protected:
44  scoped_ptr<AppListTestViewDelegate> delegate_;
45  base::scoped_nsobject<AppListViewController> app_list_view_controller_;
46
47 private:
48  DISALLOW_COPY_AND_ASSIGN(AppListViewControllerTest);
49};
50
51TEST_VIEW(AppListViewControllerTest, [app_list_view_controller_ view]);
52
53// Test that adding and removing pages updates the pager.
54TEST_F(AppListViewControllerTest, PagerSegmentCounts) {
55  NSSegmentedControl* pager = [app_list_view_controller_ pagerControl];
56  EXPECT_EQ(1, [pager segmentCount]);
57
58  ReplaceTestModel(kItemsPerPage * 2);
59  EXPECT_EQ(2, [pager segmentCount]);
60  model()->PopulateApps(1);
61  EXPECT_EQ(3, [pager segmentCount]);
62
63  ReplaceTestModel(1);
64  EXPECT_EQ(1, [pager segmentCount]);
65}
66
67// Test that clicking the pager changes pages.
68TEST_F(AppListViewControllerTest, PagerChangingPage) {
69  NSSegmentedControl* pager = [app_list_view_controller_ pagerControl];
70  ReplaceTestModel(kItemsPerPage * 3);
71  EXPECT_EQ(3, [pager segmentCount]);
72
73  EXPECT_EQ(0, [pager selectedSegment]);
74  EXPECT_EQ(0u, [apps_grid_controller_ visiblePage]);
75  EXPECT_EQ(1.0, [apps_grid_controller_ visiblePortionOfPage:0]);
76  EXPECT_EQ(0.0, [apps_grid_controller_ visiblePortionOfPage:1]);
77
78  // Emulate a click on the second segment to navigate to the second page.
79  [pager setSelectedSegment:1];
80  [[pager target] performSelector:[pager action]
81                       withObject:pager];
82
83  EXPECT_EQ(1u, [apps_grid_controller_ visiblePage]);
84  EXPECT_EQ(1, [pager selectedSegment]);
85  EXPECT_EQ(0.0, [apps_grid_controller_ visiblePortionOfPage:0]);
86  EXPECT_EQ(1.0, [apps_grid_controller_ visiblePortionOfPage:1]);
87
88  // Replace with a single page model, and ensure we go back to the first page.
89  ReplaceTestModel(1);
90  EXPECT_EQ(0u, [apps_grid_controller_ visiblePage]);
91  EXPECT_EQ(0, [pager selectedSegment]);
92  EXPECT_EQ(1, [pager segmentCount]);
93  EXPECT_EQ(1.0, [apps_grid_controller_ visiblePortionOfPage:0]);
94}
95
96}  // namespace test
97}  // namespace app_list
98