blob: 691c3b050579d75f38a5cb4d49ee471b1eb7338b [file] [log] [blame]
// Copyright 2018 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 "ui/base/models/simple_menu_model.h"
#include "base/macros.h"
#include "base/strings/string_util.h"
#include "base/strings/utf_string_conversions.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/gfx/image/image_unittest_util.h"
#include "ui/gfx/paint_vector_icon.h"
#include "ui/gfx/vector_icon_types.h"
namespace ui {
namespace {
DECLARE_ELEMENT_IDENTIFIER_VALUE(kTestElementID);
DEFINE_ELEMENT_IDENTIFIER_VALUE(kTestElementID);
constexpr int kAlertedCommandId = 2;
class DelegateBase : public SimpleMenuModel::Delegate {
public:
DelegateBase() : SimpleMenuModel::Delegate() {}
~DelegateBase() override = default;
void set_icon_on_item(int command_id) { item_with_icon_ = command_id; }
// SimpleMenuModel::Delegate:
bool IsCommandIdChecked(int command_id) const override { return true; }
bool IsCommandIdEnabled(int command_id) const override {
// Commands 0-99 are enabled.
return command_id < 100;
}
bool IsCommandIdVisible(int command_id) const override {
// Commands 0-99 are visible.
return command_id < 100;
}
bool IsCommandIdAlerted(int command_id) const override {
return command_id == kAlertedCommandId;
}
void ExecuteCommand(int command_id, int event_flags) override {}
bool IsItemForCommandIdDynamic(int command_id) const override {
return item_with_icon_ == command_id;
}
ImageModel GetIconForCommandId(int command_id) const override {
return item_with_icon_ == command_id
? ImageModel::FromImage(gfx::test::CreateImage(16, 16))
: ImageModel();
}
private:
absl::optional<int> item_with_icon_;
DISALLOW_COPY_AND_ASSIGN(DelegateBase);
};
TEST(SimpleMenuModelTest, SetLabel) {
SimpleMenuModel simple_menu_model(nullptr);
simple_menu_model.AddItem(/*command_id*/ 5, u"menu item 0");
simple_menu_model.SetLabel(/*index*/ 0, u"new label");
ASSERT_EQ(u"new label", simple_menu_model.GetLabelAt(0));
}
TEST(SimpleMenuModelTest, SetEnabledAt) {
SimpleMenuModel simple_menu_model(nullptr);
simple_menu_model.AddItem(/*command_id*/ 5, u"menu item 0");
simple_menu_model.AddItem(/*command_id*/ 6, u"menu item 1");
simple_menu_model.SetEnabledAt(/*index*/ 0, false);
simple_menu_model.SetEnabledAt(/*index*/ 1, true);
ASSERT_FALSE(simple_menu_model.IsEnabledAt(0));
ASSERT_TRUE(simple_menu_model.IsEnabledAt(1));
}
TEST(SimpleMenuModelTest, SetVisibleAt) {
SimpleMenuModel simple_menu_model(nullptr);
simple_menu_model.AddItem(/*command_id*/ 5, u"menu item 0");
simple_menu_model.AddItem(/*command_id*/ 6, u"menu item 1");
simple_menu_model.SetVisibleAt(/*index*/ 0, false);
simple_menu_model.SetVisibleAt(/*index*/ 1, true);
ASSERT_FALSE(simple_menu_model.IsVisibleAt(0));
ASSERT_TRUE(simple_menu_model.IsVisibleAt(1));
}
TEST(SimpleMenuModelTest, IsEnabledAtWithNoDelegate) {
SimpleMenuModel simple_menu_model(nullptr);
simple_menu_model.AddItem(/*command_id*/ 5, u"menu item");
simple_menu_model.SetEnabledAt(/*index*/ 0, false);
ASSERT_FALSE(simple_menu_model.IsEnabledAt(0));
}
TEST(SimpleMenuModelTest, IsEnabledAtWithDelegateAndCommandEnabled) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
// CommandId 5 is enabled.
simple_menu_model.AddItem(/*command_id*/ 5, u"menu item");
simple_menu_model.SetEnabledAt(/*index*/ 0, true);
// Should return false since the command_id 5 is enabled.
ASSERT_TRUE(simple_menu_model.IsEnabledAt(0));
}
TEST(SimpleMenuModelTest, IsEnabledAtWithDelegateAndCommandNotEnabled) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
// CommandId 108 is disabled.
simple_menu_model.AddItem(/*command_id*/ 108, u"menu item");
simple_menu_model.SetEnabledAt(/*index*/ 0, true);
// Should return false since the command_id 108 is disabled.
ASSERT_FALSE(simple_menu_model.IsEnabledAt(0));
}
TEST(SimpleMenuModelTest, IsVisibleAtWithDelegateAndCommandVisible) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
// CommandId 5 is visible.
simple_menu_model.AddItem(/*command_id*/ 5, u"menu item");
simple_menu_model.SetVisibleAt(/*index*/ 0, true);
// Should return false since the command_id 5 is enabled.
ASSERT_TRUE(simple_menu_model.IsEnabledAt(0));
}
TEST(SimpleMenuModelTest, IsVisibleAtWithDelegateAndCommandNotVisible) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
// CommandId 108 is not visible.
simple_menu_model.AddItem(/*command_id*/ 108, u"menu item");
simple_menu_model.SetVisibleAt(/*index*/ 0, true);
// Should return false since the command_id 108 is not visible.
ASSERT_FALSE(simple_menu_model.IsEnabledAt(0));
}
TEST(SimpleMenuModelTest, IsAlertedAtViaDelegate) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
simple_menu_model.AddItem(kAlertedCommandId, u"alerted item");
simple_menu_model.AddItem(kAlertedCommandId + 1, u"non-alerted item");
EXPECT_TRUE(simple_menu_model.IsAlertedAt(0));
EXPECT_FALSE(simple_menu_model.IsAlertedAt(1));
}
TEST(SimpleMenuModelTest, SetIsNewFeatureAt) {
SimpleMenuModel simple_menu_model(nullptr);
simple_menu_model.AddItem(/*command_id*/ 5, u"menu item 0");
simple_menu_model.AddItem(/*command_id*/ 6, u"menu item 1");
simple_menu_model.SetIsNewFeatureAt(/*index*/ 0, false);
simple_menu_model.SetIsNewFeatureAt(/*index*/ 1, true);
ASSERT_FALSE(simple_menu_model.IsNewFeatureAt(0));
ASSERT_TRUE(simple_menu_model.IsNewFeatureAt(1));
}
TEST(SimpleMenuModelTest, SetElementIdentifierAt) {
SimpleMenuModel simple_menu_model(nullptr);
simple_menu_model.AddItem(/*command_id*/ 5, u"menu item 0");
simple_menu_model.AddItem(/*command_id*/ 6, u"menu item 1");
simple_menu_model.SetElementIdentifierAt(/*index*/ 1, kTestElementID);
EXPECT_EQ(ui::ElementIdentifier(),
simple_menu_model.GetElementIdentifierAt(0));
EXPECT_EQ(kTestElementID, simple_menu_model.GetElementIdentifierAt(1));
}
TEST(SimpleMenuModelTest, HasIconsViaDelegate) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
simple_menu_model.AddItem(/*command_id*/ 10, u"menu item");
EXPECT_FALSE(simple_menu_model.HasIcons());
simple_menu_model.AddItem(/*command_id*/ 11, u"menu item");
delegate.set_icon_on_item(11);
EXPECT_TRUE(simple_menu_model.HasIcons());
}
TEST(SimpleMenuModelTest, HasIconsViaAddItem) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
simple_menu_model.AddItem(/*command_id*/ 10, u"menu item");
EXPECT_FALSE(simple_menu_model.HasIcons());
simple_menu_model.AddItemWithIcon(
/*command_id*/ 11, u"menu item",
ui::ImageModel::FromImage(gfx::test::CreateImage(16, 16)));
EXPECT_TRUE(simple_menu_model.HasIcons());
}
TEST(SimpleMenuModelTest, HasIconsViaVectorIcon) {
DelegateBase delegate;
SimpleMenuModel simple_menu_model(&delegate);
simple_menu_model.AddItem(/*command_id*/ 10, u"menu item");
EXPECT_FALSE(simple_menu_model.HasIcons());
gfx::PathElement path[] = {gfx::CommandType::CIRCLE, 24, 18, 5};
gfx::VectorIconRep rep[] = {{path, 4}};
gfx::VectorIcon circle_icon = {rep, 1, "circle"};
simple_menu_model.AddItemWithIcon(
/*command_id*/ 11, u"menu item",
ui::ImageModel::FromVectorIcon(circle_icon, -1, 16));
EXPECT_TRUE(simple_menu_model.HasIcons());
}
} // namespace
} // namespace ui