1 // Copyright (c) 2010 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/ui/toolbar/wrench_menu_model.h" 6 7 #include "chrome/app/chrome_command_ids.h" 8 #include "chrome/browser/ui/browser.h" 9 #include "chrome/test/browser_with_test_window_test.h" 10 #include "chrome/test/menu_model_test.h" 11 #include "chrome/test/testing_profile.h" 12 #include "grit/generated_resources.h" 13 #include "testing/gtest/include/gtest/gtest.h" 14 15 class WrenchMenuModelTest : public BrowserWithTestWindowTest, 16 public ui::AcceleratorProvider { 17 public: 18 // Don't handle accelerators. 19 virtual bool GetAcceleratorForCommandId( 20 int command_id, 21 ui::Accelerator* accelerator) { return false; } 22 }; 23 24 // Copies parts of MenuModelTest::Delegate and combines them with the 25 // WrenchMenuModel since WrenchMenuModel is now a SimpleMenuModel::Delegate and 26 // not derived from SimpleMenuModel. 27 class TestWrenchMenuModel : public WrenchMenuModel { 28 public: 29 TestWrenchMenuModel(ui::AcceleratorProvider* provider, 30 Browser* browser) 31 : WrenchMenuModel(provider, browser), 32 execute_count_(0), 33 checked_count_(0), 34 enable_count_(0) { 35 } 36 37 // Testing overrides to ui::SimpleMenuModel::Delegate: 38 virtual bool IsCommandIdChecked(int command_id) const { 39 bool val = WrenchMenuModel::IsCommandIdChecked(command_id); 40 if (val) 41 checked_count_++; 42 return val; 43 } 44 45 virtual bool IsCommandIdEnabled(int command_id) const { 46 ++enable_count_; 47 return true; 48 } 49 50 virtual void ExecuteCommand(int command_id) { ++execute_count_; } 51 52 int execute_count_; 53 mutable int checked_count_; 54 mutable int enable_count_; 55 }; 56 57 TEST_F(WrenchMenuModelTest, Basics) { 58 TestWrenchMenuModel model(this, browser()); 59 int itemCount = model.GetItemCount(); 60 61 // Verify it has items. The number varies by platform, so we don't check 62 // the exact number. 63 EXPECT_GT(itemCount, 10); 64 65 // Execute a couple of the items and make sure it gets back to our delegate. 66 // We can't use CountEnabledExecutable() here because the encoding menu's 67 // delegate is internal, it doesn't use the one we pass in. 68 model.ActivatedAt(0); 69 EXPECT_TRUE(model.IsEnabledAt(0)); 70 // Make sure to use the index that is not separator in all configurations. 71 model.ActivatedAt(2); 72 EXPECT_TRUE(model.IsEnabledAt(2)); 73 EXPECT_EQ(model.execute_count_, 2); 74 EXPECT_EQ(model.enable_count_, 2); 75 76 model.execute_count_ = 0; 77 model.enable_count_ = 0; 78 79 // Choose something from the tools submenu and make sure it makes it back to 80 // the delegate as well. Use the first submenu as the tools one. 81 int toolsModelIndex = -1; 82 for (int i = 0; i < itemCount; ++i) { 83 if (model.GetTypeAt(i) == ui::MenuModel::TYPE_SUBMENU) { 84 toolsModelIndex = i; 85 break; 86 } 87 } 88 EXPECT_GT(toolsModelIndex, -1); 89 ui::MenuModel* toolsModel = model.GetSubmenuModelAt(toolsModelIndex); 90 EXPECT_TRUE(toolsModel); 91 EXPECT_GT(toolsModel->GetItemCount(), 2); 92 toolsModel->ActivatedAt(2); 93 EXPECT_TRUE(toolsModel->IsEnabledAt(2)); 94 EXPECT_EQ(model.execute_count_, 1); 95 EXPECT_EQ(model.enable_count_, 1); 96 } 97 98 class EncodingMenuModelTest : public BrowserWithTestWindowTest, 99 public MenuModelTest { 100 }; 101 102 TEST_F(EncodingMenuModelTest, IsCommandIdCheckedWithNoTabs) { 103 EncodingMenuModel model(browser()); 104 ASSERT_EQ(NULL, browser()->GetSelectedTabContents()); 105 EXPECT_FALSE(model.IsCommandIdChecked(IDC_ENCODING_ISO88591)); 106 } 107