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 16 namespace chromeos { 17 using ::testing::AnyNumber; 18 using ::testing::InvokeWithoutArgs; 19 using ::testing::Return; 20 using ::testing::ReturnRef; 21 using ::testing::_; 22 23 class 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 51 IN_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 73 IN_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 95 IN_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 153 IN_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