1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// found in the LICENSE file.
4a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "chrome/browser/ui/views/menu_test_base.h"
7a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/menu/menu_item_view.h"
8a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/views/controls/menu/submenu_view.h"
9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
10a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)template<ui::KeyboardCode KEYCODE, int EXPECTED_COMMAND>
11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class MenuControllerMnemonicTest : public MenuTestBase {
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) public:
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  MenuControllerMnemonicTest() {
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual ~MenuControllerMnemonicTest() {
17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // MenuTestBase overrides:
20a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void BuildMenu(views::MenuItemView* menu) OVERRIDE {
21a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_NE(ui::VKEY_DIVIDE, '/');
22a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    menu->AppendMenuItemWithLabel(1, base::ASCIIToUTF16("One&/"));
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    menu->AppendMenuItemWithLabel(2, base::ASCIIToUTF16("Two"));
24a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
25a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
26a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void DoTestWithMenuOpen() {
27a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_TRUE(menu()->GetSubmenu()->IsShowing());
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    KeyPress(KEYCODE,
29a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)             CreateEventTask(this, &MenuControllerMnemonicTest::Step2));
30a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
31a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Step2() {
33a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_EQ(EXPECTED_COMMAND, last_command());
34a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    if (EXPECTED_COMMAND == 0) {
35a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      KeyPress(ui::VKEY_ESCAPE,
36a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)               CreateEventTask(this, &MenuControllerMnemonicTest::Step3));
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    } else {
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      ASSERT_FALSE(menu()->GetSubmenu()->IsShowing());
39a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      Done();
40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    }
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
42a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
43a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  void Step3() {
44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    ASSERT_FALSE(menu()->GetSubmenu()->IsShowing());
45a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    Done();
46a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  }
47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) private:
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MenuControllerMnemonicTest);
50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)};
51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Pressing the mnemonic for a menu item should execute the command for that
53a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// menu item.
54a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)typedef MenuControllerMnemonicTest<ui::VKEY_DIVIDE, 1>
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MenuControllerMnemonicTestMnemonicMatch;
56a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)VIEW_TEST(MenuControllerMnemonicTestMnemonicMatch, MnemonicMatch);
57a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Pressing a key which matches the first letter of the menu item's title
59a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// should execute the command for that menu item.
60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)typedef MenuControllerMnemonicTest<ui::VKEY_T, 2>
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MenuControllerMnemonicTestTitleMatch;
62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)VIEW_TEST(MenuControllerMnemonicTestTitleMatch, TitleMatch);
63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Pressing an arbitrary key should not execute any commands.
65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)typedef MenuControllerMnemonicTest<ui::VKEY_A, 0>
66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    MenuControllerMnemonicTestNoMatch;
67a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)VIEW_TEST(MenuControllerMnemonicTestNoMatch, NoMatch);
68