1// Copyright (c) 2011 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/test/base/menu_model_test.h"
6#include "testing/gtest/include/gtest/gtest.h"
7
8
9bool MenuModelTest::Delegate::IsCommandIdChecked(int command_id) const {
10  return false;
11}
12
13bool MenuModelTest::Delegate::IsCommandIdEnabled(int command_id) const {
14  ++enable_count_;
15  return true;
16}
17
18bool MenuModelTest::Delegate::GetAcceleratorForCommandId(
19    int command_id,
20    ui::Accelerator* accelerator) {
21  return false;
22}
23
24void MenuModelTest::Delegate::ExecuteCommand(int command_id, int event_flags) {
25  ++execute_count_;
26}
27
28// Recursively checks the enabled state and executes a command on every item
29// that's not a separator or a submenu parent item. The returned count should
30// match the number of times the delegate is called to ensure every item works.
31void MenuModelTest::CountEnabledExecutable(ui::MenuModel* model,
32                                           int* count) {
33  for (int i = 0; i < model->GetItemCount(); ++i) {
34    ui::MenuModel::ItemType type = model->GetTypeAt(i);
35    switch (type) {
36      case ui::MenuModel::TYPE_SEPARATOR:
37        continue;
38      case ui::MenuModel::TYPE_SUBMENU:
39        CountEnabledExecutable(model->GetSubmenuModelAt(i), count);
40        break;
41      case ui::MenuModel::TYPE_COMMAND:
42      case ui::MenuModel::TYPE_CHECK:
43      case ui::MenuModel::TYPE_RADIO:
44        model->IsEnabledAt(i);  // Check if it's enabled (ignore answer).
45        model->ActivatedAt(i);  // Execute it.
46        (*count)++;  // Increment the count of executable items seen.
47        break;
48      default:
49        FAIL();  // Ensure every case is tested.
50    }
51  }
52}
53