1 // Copyright 2013 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.
5 #include "base/basictypes.h"
6 #include "base/compiler_specific.h"
7 #include "base/strings/stringprintf.h"
8 #include "chrome/browser/chromeos/keyboard_driven_event_rewriter.h"
9 #include "testing/gtest/include/gtest/gtest.h"
10 #include "ui/events/event.h"
11 #include "ui/events/x/events_x_utils.h"
13 #include <X11/keysym.h>
14 #include <X11/XF86keysym.h>
19 // Creates an XKeyEvent to initialize a ui::KeyEvent that is passed to
20 // KeyboardDrivenEventRewriter for processing.
21 void InitXKeyEvent(ui::KeyboardCode ui_keycode,
23 ui::EventType ui_type,
27 ui::InitXKeyEventForTesting(ui_type,
31 event->xkey.keycode = x_keycode;
32 event->xkey.state = x_state;
35 class KeyboardDrivenEventRewriterTest : public testing::Test {
37 KeyboardDrivenEventRewriterTest()
38 : display_(gfx::GetXDisplay()),
39 keycode_a_(XKeysymToKeycode(display_, XK_a)),
40 keycode_up_(XKeysymToKeycode(display_, XK_Up)),
41 keycode_down_(XKeysymToKeycode(display_, XK_Down)),
42 keycode_left_(XKeysymToKeycode(display_, XK_Left)),
43 keycode_right_(XKeysymToKeycode(display_, XK_Right)),
44 keycode_return_(XKeysymToKeycode(display_, XK_Return)),
45 keycode_f6_(XKeysymToKeycode(display_, XK_F6)) {
48 virtual ~KeyboardDrivenEventRewriterTest() {}
51 std::string GetRewrittenEventAsString(ui::KeyboardCode ui_keycode,
53 ui::EventType ui_type,
55 unsigned int x_state) {
57 InitXKeyEvent(ui_keycode, ui_flags, ui_type, x_keycode, x_state, &xev);
58 ui::KeyEvent keyevent(&xev, false /* is_char */);
59 bool changed = rewriter_.RewriteForTesting(&keyevent);
60 return base::StringPrintf("ui_flags=%d x_state=%u changed=%d",
66 std::string GetExpectedResultAsString(int ui_flags,
69 return base::StringPrintf(
70 "ui_flags=%d x_state=%u changed=%d", ui_flags, x_state, changed);
74 const KeyCode keycode_a_;
75 const KeyCode keycode_up_;
76 const KeyCode keycode_down_;
77 const KeyCode keycode_left_;
78 const KeyCode keycode_right_;
79 const KeyCode keycode_return_;
80 const KeyCode keycode_f6_;
82 KeyboardDrivenEventRewriter rewriter_;
85 DISALLOW_COPY_AND_ASSIGN(KeyboardDrivenEventRewriterTest);
88 TEST_F(KeyboardDrivenEventRewriterTest, PassThrough) {
90 ui::KeyboardCode ui_keycode;
95 { ui::VKEY_A, ui::EF_NONE, keycode_a_, 0 },
96 { ui::VKEY_A, ui::EF_CONTROL_DOWN, keycode_a_, ControlMask },
97 { ui::VKEY_A, ui::EF_ALT_DOWN, keycode_a_, Mod1Mask },
98 { ui::VKEY_A, ui::EF_SHIFT_DOWN, keycode_a_, ShiftMask },
99 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
100 keycode_a_, ControlMask | Mod1Mask },
101 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN,
102 keycode_a_, ControlMask | Mod1Mask | ShiftMask },
104 { ui::VKEY_LEFT, ui::EF_NONE, keycode_left_, 0 },
105 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN, keycode_left_, ControlMask },
106 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
107 keycode_left_, ControlMask | Mod1Mask },
109 { ui::VKEY_RIGHT, ui::EF_NONE, keycode_right_, 0 },
110 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN, keycode_right_, ControlMask },
111 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
112 keycode_right_, ControlMask | Mod1Mask },
114 { ui::VKEY_UP, ui::EF_NONE, keycode_up_, 0 },
115 { ui::VKEY_UP, ui::EF_CONTROL_DOWN, keycode_up_, ControlMask },
116 { ui::VKEY_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
117 keycode_up_, ControlMask | Mod1Mask },
119 { ui::VKEY_DOWN, ui::EF_NONE, keycode_down_, 0 },
120 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN, keycode_down_, ControlMask },
121 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
122 keycode_down_, ControlMask | Mod1Mask },
124 { ui::VKEY_RETURN, ui::EF_NONE, keycode_return_, 0 },
125 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN, keycode_return_, ControlMask },
126 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN,
127 keycode_return_, ControlMask | Mod1Mask },
130 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
131 EXPECT_EQ(GetExpectedResultAsString(kTests[i].ui_flags,
134 GetRewrittenEventAsString(kTests[i].ui_keycode,
139 << "Test case " << i;
143 TEST_F(KeyboardDrivenEventRewriterTest, Rewrite) {
144 const int kModifierMask = ui::EF_SHIFT_DOWN;
145 const unsigned int kXState = ShiftMask;
148 ui::KeyboardCode ui_keycode;
151 unsigned int x_state;
153 { ui::VKEY_LEFT, kModifierMask, keycode_left_, kXState },
154 { ui::VKEY_RIGHT, kModifierMask, keycode_right_, kXState },
155 { ui::VKEY_UP, kModifierMask, keycode_up_, kXState },
156 { ui::VKEY_DOWN, kModifierMask, keycode_down_, kXState },
157 { ui::VKEY_RETURN, kModifierMask, keycode_return_, kXState },
158 { ui::VKEY_F6, kModifierMask, keycode_f6_, kXState },
161 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) {
162 EXPECT_EQ(GetExpectedResultAsString(ui::EF_NONE, 0, true),
163 GetRewrittenEventAsString(kTests[i].ui_keycode,
168 << "Test case " << i;
172 } // namespace chromeos