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
15class 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.
27class 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
57TEST_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
98class EncodingMenuModelTest : public BrowserWithTestWindowTest,
99                              public MenuModelTest {
100};
101
102TEST_F(EncodingMenuModelTest, IsCommandIdCheckedWithNoTabs) {
103  EncodingMenuModel model(browser());
104  ASSERT_EQ(NULL, browser()->GetSelectedTabContents());
105  EXPECT_FALSE(model.IsCommandIdChecked(IDC_ENCODING_ISO88591));
106}
107