summaryrefslogtreecommitdiff
path: root/chromium/ui/app_list/cocoa/app_list_view_controller_unittest.mm
blob: 70769aba759f0dce5a43c596efbd14c6bf34df96 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/mac/scoped_nsobject.h"
#import "testing/gtest_mac.h"
#import "ui/app_list/cocoa/app_list_view_controller.h"
#import "ui/app_list/cocoa/apps_grid_controller.h"
#import "ui/app_list/cocoa/test/apps_grid_controller_test_helper.h"
#include "ui/app_list/signin_delegate.h"
#include "ui/app_list/test/app_list_test_model.h"
#include "ui/app_list/test/app_list_test_view_delegate.h"

namespace app_list {
namespace test {

class AppListViewControllerTest : public AppsGridControllerTestHelper,
                                  public SigninDelegate {
 public:
  AppListViewControllerTest() {}

  virtual void SetUp() OVERRIDE {
    app_list_view_controller_.reset([[AppListViewController alloc] init]);
    SetUpWithGridController([app_list_view_controller_ appsGridController]);
    [[test_window() contentView] addSubview:[app_list_view_controller_ view]];
  }

  virtual void TearDown() OVERRIDE {
    [app_list_view_controller_
        setDelegate:scoped_ptr<app_list::AppListViewDelegate>()];
    app_list_view_controller_.reset();
    AppsGridControllerTestHelper::TearDown();
  }

  virtual void ResetModel(scoped_ptr<AppListModel> new_model) OVERRIDE {
    scoped_ptr<AppListTestViewDelegate> delegate(new AppListTestViewDelegate);
    delegate->set_test_signin_delegate(this);
    [app_list_view_controller_
          setDelegate:delegate.PassAs<AppListViewDelegate>()
        withTestModel:new_model.Pass()];
  }

  // SigninDelegate overrides:
  virtual bool NeedSignin() OVERRIDE { return false; }
  virtual void ShowSignin() OVERRIDE {}
  virtual void OpenLearnMore() OVERRIDE {}
  virtual void OpenSettings() OVERRIDE {}

  virtual base::string16 GetSigninHeading() OVERRIDE {
    return base::string16();
  }
  virtual base::string16 GetSigninText() OVERRIDE { return base::string16(); }
  virtual base::string16 GetSigninButtonText() OVERRIDE {
    return base::string16();
  }
  virtual base::string16 GetLearnMoreLinkText() OVERRIDE {
    return base::string16();
  }
  virtual base::string16 GetSettingsLinkText() OVERRIDE {
    return base::string16();
  }

 protected:
  base::scoped_nsobject<AppListViewController> app_list_view_controller_;

 private:
  DISALLOW_COPY_AND_ASSIGN(AppListViewControllerTest);
};

// Helper class allowing NeedSignin() to return true during SetUp(), to test an
// initial state where signin is required, and the regular view starts hidden.
class AppListViewControllerSigninTest : public AppListViewControllerTest {
 public:
  AppListViewControllerSigninTest() : needs_signin_(true) {}

  // SigninDelegate override:
  virtual bool NeedSignin() OVERRIDE { return needs_signin_; }

 protected:
  bool needs_signin_;

 private:
  DISALLOW_COPY_AND_ASSIGN(AppListViewControllerSigninTest);
};

TEST_VIEW(AppListViewControllerTest, [app_list_view_controller_ view]);

// Test that adding and removing pages updates the pager.
TEST_F(AppListViewControllerTest, PagerSegmentCounts) {
  NSSegmentedControl* pager = [app_list_view_controller_ pagerControl];
  EXPECT_EQ(1, [pager segmentCount]);

  ReplaceTestModel(kItemsPerPage * 2);
  EXPECT_EQ(2, [pager segmentCount]);
  model()->PopulateApps(1);
  EXPECT_EQ(3, [pager segmentCount]);

  ReplaceTestModel(1);
  EXPECT_EQ(1, [pager segmentCount]);
}

// Test that clicking the pager changes pages.
TEST_F(AppListViewControllerTest, PagerChangingPage) {
  NSSegmentedControl* pager = [app_list_view_controller_ pagerControl];
  ReplaceTestModel(kItemsPerPage * 3);
  EXPECT_EQ(3, [pager segmentCount]);

  EXPECT_EQ(0, [pager selectedSegment]);
  EXPECT_EQ(0u, [apps_grid_controller_ visiblePage]);
  EXPECT_EQ(1.0, [apps_grid_controller_ visiblePortionOfPage:0]);
  EXPECT_EQ(0.0, [apps_grid_controller_ visiblePortionOfPage:1]);

  // Emulate a click on the second segment to navigate to the second page.
  [pager setSelectedSegment:1];
  [[pager target] performSelector:[pager action]
                       withObject:pager];

  EXPECT_EQ(1u, [apps_grid_controller_ visiblePage]);
  EXPECT_EQ(1, [pager selectedSegment]);
  EXPECT_EQ(0.0, [apps_grid_controller_ visiblePortionOfPage:0]);
  EXPECT_EQ(1.0, [apps_grid_controller_ visiblePortionOfPage:1]);

  // Replace with a single page model, and ensure we go back to the first page.
  ReplaceTestModel(1);
  EXPECT_EQ(0u, [apps_grid_controller_ visiblePage]);
  EXPECT_EQ(0, [pager selectedSegment]);
  EXPECT_EQ(1, [pager segmentCount]);
  EXPECT_EQ(1.0, [apps_grid_controller_ visiblePortionOfPage:0]);
}

// Test the view when the user is already signed in.
TEST_F(AppListViewControllerTest, SignedIn) {
  // There should be just 1, visible subview when signed in.
  EXPECT_EQ(1u, [[[app_list_view_controller_ view] subviews] count]);
  EXPECT_FALSE([[app_list_view_controller_ backgroundView] isHidden]);
}

// Test the view when signin is required.
TEST_F(AppListViewControllerSigninTest, NeedsSignin) {
  EXPECT_EQ(2u, [[[app_list_view_controller_ view] subviews] count]);
  EXPECT_TRUE([[app_list_view_controller_ backgroundView] isHidden]);

  // Simulate signing in, should enter the SignedIn state.
  needs_signin_ = false;
  NotifySigninSuccess();
  EXPECT_EQ(1u, [[[app_list_view_controller_ view] subviews] count]);
  EXPECT_FALSE([[app_list_view_controller_ backgroundView] isHidden]);
}

}  // namespace test
}  // namespace app_list