普通文本  |  212行  |  7.93 KB

// 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