1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
521d179b334e59e9a3bfcaed4c4430bef1bc5759dKristian Monsen#include "chrome/browser/ui/toolbar/wrench_menu_model.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
7513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch#include "chrome/app/chrome_command_ids.h"
872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/browser.h"
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/browser_with_test_window_test.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/menu_model_test.h"
113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "chrome/test/testing_profile.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass WrenchMenuModelTest : public BrowserWithTestWindowTest,
1672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen                            public ui::AcceleratorProvider {
173345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
183345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  // Don't handle accelerators.
193345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool GetAcceleratorForCommandId(
203345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      int command_id,
2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen      ui::Accelerator* accelerator) { return false; }
223345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick};
233345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
243345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// Copies parts of MenuModelTest::Delegate and combines them with the
253345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// WrenchMenuModel since WrenchMenuModel is now a SimpleMenuModel::Delegate and
263345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick// not derived from SimpleMenuModel.
273345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrickclass TestWrenchMenuModel : public WrenchMenuModel {
283345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick public:
2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  TestWrenchMenuModel(ui::AcceleratorProvider* provider,
303345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick                      Browser* browser)
313345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      : WrenchMenuModel(provider, browser),
323345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        execute_count_(0),
333345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        checked_count_(0),
343345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick        enable_count_(0) {
353345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
363345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  // Testing overrides to ui::SimpleMenuModel::Delegate:
383345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool IsCommandIdChecked(int command_id) const {
393345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    bool val = WrenchMenuModel::IsCommandIdChecked(command_id);
403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    if (val)
413345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick      checked_count_++;
423345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return val;
433345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
443345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
453345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual bool IsCommandIdEnabled(int command_id) const {
463345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    ++enable_count_;
473345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick    return true;
483345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  }
493345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
503345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  virtual void ExecuteCommand(int command_id) { ++execute_count_; }
513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick
523345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  int execute_count_;
533345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  mutable int checked_count_;
543345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  mutable int enable_count_;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(WrenchMenuModelTest, Basics) {
583345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  TestWrenchMenuModel model(this, browser());
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int itemCount = model.GetItemCount();
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Verify it has items. The number varies by platform, so we don't check
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the exact number.
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_GT(itemCount, 10);
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Execute a couple of the items and make sure it gets back to our delegate.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // We can't use CountEnabledExecutable() here because the encoding menu's
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // delegate is internal, it doesn't use the one we pass in.
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model.ActivatedAt(0);
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(model.IsEnabledAt(0));
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Make sure to use the index that is not separator in all configurations.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model.ActivatedAt(2);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(model.IsEnabledAt(2));
733345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(model.execute_count_, 2);
743345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(model.enable_count_, 2);
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
763345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  model.execute_count_ = 0;
773345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  model.enable_count_ = 0;
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Choose something from the tools submenu and make sure it makes it back to
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // the delegate as well. Use the first submenu as the tools one.
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  int toolsModelIndex = -1;
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  for (int i = 0; i < itemCount; ++i) {
8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen    if (model.GetTypeAt(i) == ui::MenuModel::TYPE_SUBMENU) {
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      toolsModelIndex = i;
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      break;
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    }
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_GT(toolsModelIndex, -1);
8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen  ui::MenuModel* toolsModel = model.GetSubmenuModelAt(toolsModelIndex);
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(toolsModel);
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_GT(toolsModel->GetItemCount(), 2);
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  toolsModel->ActivatedAt(2);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(toolsModel->IsEnabledAt(2));
943345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(model.execute_count_, 1);
953345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  EXPECT_EQ(model.enable_count_, 1);
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass EncodingMenuModelTest : public BrowserWithTestWindowTest,
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                              public MenuModelTest {
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(EncodingMenuModelTest, IsCommandIdCheckedWithNoTabs) {
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EncodingMenuModel model(browser());
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ASSERT_EQ(NULL, browser()->GetSelectedTabContents());
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(model.IsCommandIdChecked(IDC_ENCODING_ISO88591));
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
107