1// Copyright (c) 2011 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 "chrome/browser/chromeos/status/power_menu_button.h"
6
7#include "chrome/browser/chromeos/cros/cros_in_process_browser_test.h"
8#include "chrome/browser/chromeos/cros/mock_power_library.h"
9#include "chrome/browser/chromeos/frame/browser_view.h"
10#include "chrome/browser/chromeos/status/status_area_view.h"
11#include "chrome/browser/chromeos/view_ids.h"
12#include "chrome/browser/ui/browser.h"
13#include "chrome/browser/ui/browser_window.h"
14#include "grit/theme_resources.h"
15
16namespace chromeos {
17using ::testing::AnyNumber;
18using ::testing::InvokeWithoutArgs;
19using ::testing::Return;
20using ::testing::ReturnRef;
21using ::testing::_;
22
23class PowerMenuButtonTest : public CrosInProcessBrowserTest {
24 protected:
25  MockPowerLibrary *mock_power_library_;
26
27  PowerMenuButtonTest() : CrosInProcessBrowserTest(),
28                          mock_power_library_(NULL) {
29  }
30
31  virtual void SetUpInProcessBrowserTestFixture() {
32    cros_mock_->InitStatusAreaMocks();
33    cros_mock_->SetStatusAreaMocksExpectations();
34    mock_power_library_ = cros_mock_->mock_power_library();
35  }
36
37  PowerMenuButton* GetPowerMenuButton() {
38    BrowserView* view = static_cast<BrowserView*>(browser()->window());
39    PowerMenuButton* power = static_cast<StatusAreaView*>(view->
40        GetViewByID(VIEW_ID_STATUS_AREA))->power_view();
41    return power;
42  }
43
44  int CallPowerChangedAndGetIconId() {
45    PowerMenuButton* power = GetPowerMenuButton();
46    power->PowerChanged(mock_power_library_);
47    return power->icon_id();
48  }
49};
50
51IN_PROC_BROWSER_TEST_F(PowerMenuButtonTest, BatteryMissingTest) {
52  EXPECT_CALL(*mock_power_library_, battery_is_present())
53      .WillOnce((Return(false)))  // no battery
54      .RetiresOnSaturation();
55  EXPECT_CALL(*mock_power_library_, battery_percentage())
56      .WillOnce((Return(42.0)))
57      .RetiresOnSaturation();
58  EXPECT_CALL(*mock_power_library_, battery_fully_charged())
59      .WillOnce((Return(false)))
60      .RetiresOnSaturation();
61  EXPECT_CALL(*mock_power_library_, line_power_on())
62      .WillOnce((Return(false)))
63      .RetiresOnSaturation();
64  EXPECT_CALL(*mock_power_library_, battery_time_to_empty())
65      .WillOnce((Return(base::TimeDelta::FromMinutes(42))))
66      .RetiresOnSaturation();
67  EXPECT_CALL(*mock_power_library_, battery_time_to_full())
68      .WillOnce((Return(base::TimeDelta::FromMinutes(24))))
69      .RetiresOnSaturation();
70  EXPECT_EQ(IDR_STATUSBAR_BATTERY_MISSING, CallPowerChangedAndGetIconId());
71}
72
73IN_PROC_BROWSER_TEST_F(PowerMenuButtonTest, BatteryChargedTest) {
74  EXPECT_CALL(*mock_power_library_, battery_is_present())
75      .WillOnce((Return(true)))
76      .RetiresOnSaturation();
77  EXPECT_CALL(*mock_power_library_, battery_percentage())
78      .WillOnce((Return(42.0)))
79      .RetiresOnSaturation();
80  EXPECT_CALL(*mock_power_library_, battery_fully_charged())
81      .WillOnce((Return(true)))  // fully charged
82      .RetiresOnSaturation();
83  EXPECT_CALL(*mock_power_library_, line_power_on())
84      .WillOnce((Return(true)))  // plugged in
85      .RetiresOnSaturation();
86  EXPECT_CALL(*mock_power_library_, battery_time_to_empty())
87      .WillOnce((Return(base::TimeDelta::FromMinutes(42))))
88      .RetiresOnSaturation();
89  EXPECT_CALL(*mock_power_library_, battery_time_to_full())
90      .WillOnce((Return(base::TimeDelta::FromMinutes(0))))
91      .RetiresOnSaturation();
92  EXPECT_EQ(IDR_STATUSBAR_BATTERY_CHARGED, CallPowerChangedAndGetIconId());
93}
94
95IN_PROC_BROWSER_TEST_F(PowerMenuButtonTest, BatteryChargingTest) {
96  const int NUM_TIMES = 19;
97  EXPECT_CALL(*mock_power_library_, battery_is_present())
98      .Times(NUM_TIMES)
99      .WillRepeatedly((Return(true)))
100      .RetiresOnSaturation();
101  EXPECT_CALL(*mock_power_library_, battery_fully_charged())
102      .Times(NUM_TIMES)
103      .WillRepeatedly((Return(false)))
104      .RetiresOnSaturation();
105  EXPECT_CALL(*mock_power_library_, line_power_on())
106      .Times(NUM_TIMES)
107      .WillRepeatedly((Return(true)))  // plugged in
108      .RetiresOnSaturation();
109  EXPECT_CALL(*mock_power_library_, battery_time_to_empty())
110      .Times(NUM_TIMES)
111      .WillRepeatedly((Return(base::TimeDelta::FromMinutes(42))))
112      .RetiresOnSaturation();
113  EXPECT_CALL(*mock_power_library_, battery_time_to_full())
114      .Times(NUM_TIMES)
115      .WillRepeatedly((Return(base::TimeDelta::FromMinutes(24))))
116      .RetiresOnSaturation();
117
118  // Test the 16 battery charging states.
119  // NOTE: Use an array rather than just calculating a resource number to avoid
120  // creating implicit ordering dependencies on the resource values.
121  static const int kChargingImages[] = {
122    IDR_STATUSBAR_BATTERY_CHARGING_1,
123    IDR_STATUSBAR_BATTERY_CHARGING_2,
124    IDR_STATUSBAR_BATTERY_CHARGING_3,
125    IDR_STATUSBAR_BATTERY_CHARGING_4,
126    IDR_STATUSBAR_BATTERY_CHARGING_5,
127    IDR_STATUSBAR_BATTERY_CHARGING_6,
128    IDR_STATUSBAR_BATTERY_CHARGING_7,
129    IDR_STATUSBAR_BATTERY_CHARGING_8,
130    IDR_STATUSBAR_BATTERY_CHARGING_9,
131    IDR_STATUSBAR_BATTERY_CHARGING_10,
132    IDR_STATUSBAR_BATTERY_CHARGING_11,
133    IDR_STATUSBAR_BATTERY_CHARGING_12,
134    IDR_STATUSBAR_BATTERY_CHARGING_13,
135    IDR_STATUSBAR_BATTERY_CHARGING_14,
136    IDR_STATUSBAR_BATTERY_CHARGING_15,
137    IDR_STATUSBAR_BATTERY_CHARGING_16,
138    IDR_STATUSBAR_BATTERY_CHARGING_17,
139    IDR_STATUSBAR_BATTERY_CHARGING_18,
140    IDR_STATUSBAR_BATTERY_CHARGING_19,
141  };
142  size_t id = 0;
143  for (float percent = 5.0; percent < 100.0; percent += 5.0) {
144    EXPECT_CALL(*mock_power_library_, battery_percentage())
145        .WillOnce((Return(percent)))
146        .RetiresOnSaturation();
147    ASSERT_LT(id, arraysize(kChargingImages));
148    EXPECT_EQ(kChargingImages[id], CallPowerChangedAndGetIconId());
149    id++;
150  }
151}
152
153IN_PROC_BROWSER_TEST_F(PowerMenuButtonTest, BatteryDischargingTest) {
154  const int NUM_TIMES = 19;
155  EXPECT_CALL(*mock_power_library_, battery_is_present())
156      .Times(NUM_TIMES)
157      .WillRepeatedly((Return(true)))
158      .RetiresOnSaturation();
159  EXPECT_CALL(*mock_power_library_, battery_fully_charged())
160      .Times(NUM_TIMES)
161      .WillRepeatedly((Return(false)))
162      .RetiresOnSaturation();
163  EXPECT_CALL(*mock_power_library_, line_power_on())
164      .Times(NUM_TIMES)
165      .WillRepeatedly((Return(false)))
166      .RetiresOnSaturation();
167  EXPECT_CALL(*mock_power_library_, battery_time_to_empty())
168      .Times(NUM_TIMES)
169      .WillRepeatedly((Return(base::TimeDelta::FromMinutes(42))))
170      .RetiresOnSaturation();
171  EXPECT_CALL(*mock_power_library_, battery_time_to_full())
172      .Times(NUM_TIMES)
173      .WillRepeatedly((Return(base::TimeDelta::FromMinutes(24))))
174      .RetiresOnSaturation();
175
176  // Test the 16 battery discharing states.
177  // NOTE: Use an array rather than just calculating a resource number to avoid
178  // creating implicit ordering dependencies on the resource values.
179  static const int kDischargingImages[] = {
180    IDR_STATUSBAR_BATTERY_DISCHARGING_1,
181    IDR_STATUSBAR_BATTERY_DISCHARGING_2,
182    IDR_STATUSBAR_BATTERY_DISCHARGING_3,
183    IDR_STATUSBAR_BATTERY_DISCHARGING_4,
184    IDR_STATUSBAR_BATTERY_DISCHARGING_5,
185    IDR_STATUSBAR_BATTERY_DISCHARGING_6,
186    IDR_STATUSBAR_BATTERY_DISCHARGING_7,
187    IDR_STATUSBAR_BATTERY_DISCHARGING_8,
188    IDR_STATUSBAR_BATTERY_DISCHARGING_9,
189    IDR_STATUSBAR_BATTERY_DISCHARGING_10,
190    IDR_STATUSBAR_BATTERY_DISCHARGING_11,
191    IDR_STATUSBAR_BATTERY_DISCHARGING_12,
192    IDR_STATUSBAR_BATTERY_DISCHARGING_13,
193    IDR_STATUSBAR_BATTERY_DISCHARGING_14,
194    IDR_STATUSBAR_BATTERY_DISCHARGING_15,
195    IDR_STATUSBAR_BATTERY_DISCHARGING_16,
196    IDR_STATUSBAR_BATTERY_DISCHARGING_17,
197    IDR_STATUSBAR_BATTERY_DISCHARGING_18,
198    IDR_STATUSBAR_BATTERY_DISCHARGING_19,
199  };
200  size_t id = 0;
201  for (float percent = 5.0; percent < 100.0; percent += 5.0) {
202    EXPECT_CALL(*mock_power_library_, battery_percentage())
203        .WillOnce((Return(percent)))
204        .RetiresOnSaturation();
205    ASSERT_LT(id, arraysize(kDischargingImages));
206    EXPECT_EQ(kDischargingImages[id], CallPowerChangedAndGetIconId());
207    id++;
208  }
209}
210
211}  // namespace chromeos
212