// Copyright (c) 2011 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 "chrome/browser/chromeos/status/power_menu_button.h" #include "chrome/browser/chromeos/cros/cros_in_process_browser_test.h" #include "chrome/browser/chromeos/cros/mock_power_library.h" #include "chrome/browser/chromeos/frame/browser_view.h" #include "chrome/browser/chromeos/status/status_area_view.h" #include "chrome/browser/chromeos/view_ids.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_window.h" #include "grit/theme_resources.h" namespace chromeos { using ::testing::AnyNumber; using ::testing::InvokeWithoutArgs; using ::testing::Return; using ::testing::ReturnRef; using ::testing::_; class PowerMenuButtonTest : public CrosInProcessBrowserTest { protected: MockPowerLibrary *mock_power_library_; PowerMenuButtonTest() : CrosInProcessBrowserTest(), mock_power_library_(NULL) { } virtual void SetUpInProcessBrowserTestFixture() { cros_mock_->InitStatusAreaMocks(); cros_mock_->SetStatusAreaMocksExpectations(); mock_power_library_ = cros_mock_->mock_power_library(); } PowerMenuButton* GetPowerMenuButton() { BrowserView* view = static_cast<BrowserView*>(browser()->window()); PowerMenuButton* power = static_cast<StatusAreaView*>(view-> GetViewByID(VIEW_ID_STATUS_AREA))->power_view(); return power; } int CallPowerChangedAndGetIconId() { PowerMenuButton* power = GetPowerMenuButton(); power->PowerChanged(mock_power_library_); return power->icon_id(); } }; IN_PROC_BROWSER_TEST_F(PowerMenuButtonTest, BatteryMissingTest) { EXPECT_CALL(*mock_power_library_, battery_is_present()) .WillOnce((Return(false))) // no battery .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_percentage()) .WillOnce((Return(42.0))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_fully_charged()) .WillOnce((Return(false))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, line_power_on()) .WillOnce((Return(false))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_time_to_empty()) .WillOnce((Return(base::TimeDelta::FromMinutes(42)))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_time_to_full()) .WillOnce((Return(base::TimeDelta::FromMinutes(24)))) .RetiresOnSaturation(); EXPECT_EQ(IDR_STATUSBAR_BATTERY_MISSING, CallPowerChangedAndGetIconId()); } IN_PROC_BROWSER_TEST_F(PowerMenuButtonTest, BatteryChargedTest) { EXPECT_CALL(*mock_power_library_, battery_is_present()) .WillOnce((Return(true))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_percentage()) .WillOnce((Return(42.0))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_fully_charged()) .WillOnce((Return(true))) // fully charged .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, line_power_on()) .WillOnce((Return(true))) // plugged in .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_time_to_empty()) .WillOnce((Return(base::TimeDelta::FromMinutes(42)))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_time_to_full()) .WillOnce((Return(base::TimeDelta::FromMinutes(0)))) .RetiresOnSaturation(); EXPECT_EQ(IDR_STATUSBAR_BATTERY_CHARGED, CallPowerChangedAndGetIconId()); } IN_PROC_BROWSER_TEST_F(PowerMenuButtonTest, BatteryChargingTest) { const int NUM_TIMES = 19; EXPECT_CALL(*mock_power_library_, battery_is_present()) .Times(NUM_TIMES) .WillRepeatedly((Return(true))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_fully_charged()) .Times(NUM_TIMES) .WillRepeatedly((Return(false))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, line_power_on()) .Times(NUM_TIMES) .WillRepeatedly((Return(true))) // plugged in .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_time_to_empty()) .Times(NUM_TIMES) .WillRepeatedly((Return(base::TimeDelta::FromMinutes(42)))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_time_to_full()) .Times(NUM_TIMES) .WillRepeatedly((Return(base::TimeDelta::FromMinutes(24)))) .RetiresOnSaturation(); // Test the 16 battery charging states. // NOTE: Use an array rather than just calculating a resource number to avoid // creating implicit ordering dependencies on the resource values. static const int kChargingImages[] = { IDR_STATUSBAR_BATTERY_CHARGING_1, IDR_STATUSBAR_BATTERY_CHARGING_2, IDR_STATUSBAR_BATTERY_CHARGING_3, IDR_STATUSBAR_BATTERY_CHARGING_4, IDR_STATUSBAR_BATTERY_CHARGING_5, IDR_STATUSBAR_BATTERY_CHARGING_6, IDR_STATUSBAR_BATTERY_CHARGING_7, IDR_STATUSBAR_BATTERY_CHARGING_8, IDR_STATUSBAR_BATTERY_CHARGING_9, IDR_STATUSBAR_BATTERY_CHARGING_10, IDR_STATUSBAR_BATTERY_CHARGING_11, IDR_STATUSBAR_BATTERY_CHARGING_12, IDR_STATUSBAR_BATTERY_CHARGING_13, IDR_STATUSBAR_BATTERY_CHARGING_14, IDR_STATUSBAR_BATTERY_CHARGING_15, IDR_STATUSBAR_BATTERY_CHARGING_16, IDR_STATUSBAR_BATTERY_CHARGING_17, IDR_STATUSBAR_BATTERY_CHARGING_18, IDR_STATUSBAR_BATTERY_CHARGING_19, }; size_t id = 0; for (float percent = 5.0; percent < 100.0; percent += 5.0) { EXPECT_CALL(*mock_power_library_, battery_percentage()) .WillOnce((Return(percent))) .RetiresOnSaturation(); ASSERT_LT(id, arraysize(kChargingImages)); EXPECT_EQ(kChargingImages[id], CallPowerChangedAndGetIconId()); id++; } } IN_PROC_BROWSER_TEST_F(PowerMenuButtonTest, BatteryDischargingTest) { const int NUM_TIMES = 19; EXPECT_CALL(*mock_power_library_, battery_is_present()) .Times(NUM_TIMES) .WillRepeatedly((Return(true))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_fully_charged()) .Times(NUM_TIMES) .WillRepeatedly((Return(false))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, line_power_on()) .Times(NUM_TIMES) .WillRepeatedly((Return(false))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_time_to_empty()) .Times(NUM_TIMES) .WillRepeatedly((Return(base::TimeDelta::FromMinutes(42)))) .RetiresOnSaturation(); EXPECT_CALL(*mock_power_library_, battery_time_to_full()) .Times(NUM_TIMES) .WillRepeatedly((Return(base::TimeDelta::FromMinutes(24)))) .RetiresOnSaturation(); // Test the 16 battery discharing states. // NOTE: Use an array rather than just calculating a resource number to avoid // creating implicit ordering dependencies on the resource values. static const int kDischargingImages[] = { IDR_STATUSBAR_BATTERY_DISCHARGING_1, IDR_STATUSBAR_BATTERY_DISCHARGING_2, IDR_STATUSBAR_BATTERY_DISCHARGING_3, IDR_STATUSBAR_BATTERY_DISCHARGING_4, IDR_STATUSBAR_BATTERY_DISCHARGING_5, IDR_STATUSBAR_BATTERY_DISCHARGING_6, IDR_STATUSBAR_BATTERY_DISCHARGING_7, IDR_STATUSBAR_BATTERY_DISCHARGING_8, IDR_STATUSBAR_BATTERY_DISCHARGING_9, IDR_STATUSBAR_BATTERY_DISCHARGING_10, IDR_STATUSBAR_BATTERY_DISCHARGING_11, IDR_STATUSBAR_BATTERY_DISCHARGING_12, IDR_STATUSBAR_BATTERY_DISCHARGING_13, IDR_STATUSBAR_BATTERY_DISCHARGING_14, IDR_STATUSBAR_BATTERY_DISCHARGING_15, IDR_STATUSBAR_BATTERY_DISCHARGING_16, IDR_STATUSBAR_BATTERY_DISCHARGING_17, IDR_STATUSBAR_BATTERY_DISCHARGING_18, IDR_STATUSBAR_BATTERY_DISCHARGING_19, }; size_t id = 0; for (float percent = 5.0; percent < 100.0; percent += 5.0) { EXPECT_CALL(*mock_power_library_, battery_percentage()) .WillOnce((Return(percent))) .RetiresOnSaturation(); ASSERT_LT(id, arraysize(kDischargingImages)); EXPECT_EQ(kDischargingImages[id], CallPowerChangedAndGetIconId()); id++; } } } // namespace chromeos