// 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 "chrome/browser/status_icons/status_icon_menu_model.h" #include "base/compiler_specific.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "chrome/browser/status_icons/status_icon.h" #include "chrome/browser/status_icons/status_tray.h" #include "grit/chrome_unscaled_resources.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/base/accelerators/accelerator.h" #include "ui/base/resource/resource_bundle.h" #include "ui/gfx/image/image.h" using base::ASCIIToUTF16; class StatusIconMenuModelTest : public testing::Test, public StatusIconMenuModel::Observer { public: void SetUp() override { menu_.reset(new StatusIconMenuModel(NULL)); menu_->AddObserver(this); changed_count_ = 0; } void TearDown() override { menu_->RemoveObserver(this); } virtual int changed_count() { return changed_count_; } StatusIconMenuModel* menu_model() { return menu_.get(); } private: void OnMenuStateChanged() override { ++changed_count_; } scoped_ptr menu_; int changed_count_; }; TEST_F(StatusIconMenuModelTest, ToggleBooleanProperties) { menu_model()->AddItem(0, ASCIIToUTF16("foo")); menu_model()->SetCommandIdChecked(0, true); EXPECT_TRUE(menu_model()->IsCommandIdChecked(0)); menu_model()->SetCommandIdChecked(0, false); EXPECT_FALSE(menu_model()->IsCommandIdChecked(0)); menu_model()->SetCommandIdEnabled(0, true); EXPECT_TRUE(menu_model()->IsCommandIdEnabled(0)); menu_model()->SetCommandIdEnabled(0, false); EXPECT_FALSE(menu_model()->IsCommandIdEnabled(0)); menu_model()->SetCommandIdVisible(0, true); EXPECT_TRUE(menu_model()->IsCommandIdVisible(0)); menu_model()->SetCommandIdVisible(0, false); EXPECT_FALSE(menu_model()->IsCommandIdVisible(0)); // Menu state should have changed 7 times in this test. EXPECT_EQ(7, changed_count()); } TEST_F(StatusIconMenuModelTest, SetProperties) { menu_model()->AddItem(0, ASCIIToUTF16("foo1")); menu_model()->AddItem(1, ASCIIToUTF16("foo2")); ui::Accelerator test_accel(ui::VKEY_A, ui::EF_NONE); ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); gfx::Image test_image1(*rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON)); ui::Accelerator accel_arg; gfx::Image image_arg; EXPECT_FALSE(menu_model()->GetAcceleratorForCommandId(0, &accel_arg)); EXPECT_FALSE(menu_model()->GetIconForCommandId(0, &image_arg)); EXPECT_FALSE(menu_model()->IsItemForCommandIdDynamic(0)); // Set the accelerator and label for the first menu item. menu_model()->SetAcceleratorForCommandId(0, &test_accel); EXPECT_TRUE(menu_model()->GetAcceleratorForCommandId(0, &accel_arg)); EXPECT_EQ(test_accel, accel_arg); // Try setting label and changing it. Also ensure that menu item is marked // dynamic since the label has changed. menu_model()->ChangeLabelForCommandId(0, ASCIIToUTF16("label1")); EXPECT_TRUE(menu_model()->IsItemForCommandIdDynamic(0)); EXPECT_EQ(ASCIIToUTF16("label1"), menu_model()->GetLabelForCommandId(0)); menu_model()->ChangeLabelForCommandId(0, ASCIIToUTF16("label2")); EXPECT_EQ(ASCIIToUTF16("label2"), menu_model()->GetLabelForCommandId(0)); // Set the sublabel and icon image for the second menu item. menu_model()->ChangeSublabelForCommandId(1, ASCIIToUTF16("sublabel")); EXPECT_EQ(ASCIIToUTF16("sublabel"), menu_model()->GetSublabelForCommandId(1)); // Try setting icon image and changing it. menu_model()->ChangeIconForCommandId(1, test_image1); EXPECT_TRUE(menu_model()->GetIconForCommandId(1, &image_arg)); EXPECT_EQ(image_arg.ToImageSkia(), test_image1.ToImageSkia()); // Ensure changes to one menu item does not affect the other menu item. EXPECT_FALSE(menu_model()->GetAcceleratorForCommandId(1, &accel_arg)); EXPECT_EQ(base::string16(), menu_model()->GetLabelForCommandId(1)); EXPECT_EQ(base::string16(), menu_model()->GetSublabelForCommandId(0)); EXPECT_FALSE(menu_model()->GetIconForCommandId(0, &image_arg)); // Menu state should have changed 7 times in this test. EXPECT_EQ(7, changed_count()); }