OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include <string> |
| 6 |
5 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
6 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
7 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
8 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h" | 10 #include "chrome/browser/chromeos/events/keyboard_driven_event_rewriter.h" |
9 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
10 #include "ui/events/event.h" | 12 #include "ui/events/event.h" |
11 #include "ui/events/test/events_test_utils_x11.h" | |
12 | |
13 #include <X11/keysym.h> | |
14 #include <X11/XF86keysym.h> | |
15 #include <X11/Xlib.h> | |
16 | 13 |
17 namespace chromeos { | 14 namespace chromeos { |
18 | 15 |
19 class KeyboardDrivenEventRewriterTest : public testing::Test { | 16 class KeyboardDrivenEventRewriterTest : public testing::Test { |
20 public: | 17 public: |
21 KeyboardDrivenEventRewriterTest() | 18 KeyboardDrivenEventRewriterTest() {} |
22 : display_(gfx::GetXDisplay()), | |
23 keycode_a_(XKeysymToKeycode(display_, XK_a)), | |
24 keycode_up_(XKeysymToKeycode(display_, XK_Up)), | |
25 keycode_down_(XKeysymToKeycode(display_, XK_Down)), | |
26 keycode_left_(XKeysymToKeycode(display_, XK_Left)), | |
27 keycode_right_(XKeysymToKeycode(display_, XK_Right)), | |
28 keycode_return_(XKeysymToKeycode(display_, XK_Return)), | |
29 keycode_f6_(XKeysymToKeycode(display_, XK_F6)) { | |
30 } | |
31 | 19 |
32 virtual ~KeyboardDrivenEventRewriterTest() {} | 20 virtual ~KeyboardDrivenEventRewriterTest() {} |
33 | 21 |
34 protected: | 22 protected: |
35 std::string GetRewrittenEventAsString(ui::KeyboardCode ui_keycode, | 23 std::string GetRewrittenEventAsString(ui::KeyboardCode ui_keycode, |
36 int ui_flags, | 24 int ui_flags, |
37 ui::EventType ui_type, | 25 ui::EventType ui_type) { |
38 KeyCode x_keycode, | 26 ui::KeyEvent keyevent(ui_type, ui_keycode, ui_flags, false); |
39 unsigned int x_state) { | 27 scoped_ptr<ui::Event> rewritten_event; |
40 ui::ScopedXI2Event xev; | 28 ui::EventRewriteStatus status = |
41 xev.InitKeyEvent(ui_type, ui_keycode, ui_flags); | 29 rewriter_.RewriteForTesting(keyevent, &rewritten_event); |
42 XEvent* xevent = xev; | 30 return base::StringPrintf( |
43 xevent->xkey.keycode = x_keycode; | 31 "ui_flags=%d status=%d", |
44 xevent->xkey.state = x_state; | 32 rewritten_event ? rewritten_event->flags() : keyevent.flags(), |
45 bool changed = rewriter_.RewriteForTesting(xevent); | 33 status); |
46 ui::KeyEvent keyevent(xev, false /* is_char */); | |
47 return base::StringPrintf("ui_flags=%d x_state=%u changed=%d", | |
48 keyevent.flags(), | |
49 xevent->xkey.state, | |
50 changed); | |
51 } | 34 } |
52 | 35 |
53 std::string GetExpectedResultAsString(int ui_flags, | 36 std::string GetExpectedResultAsString(int ui_flags, |
54 unsigned int x_state, | 37 ui::EventRewriteStatus status) { |
55 bool changed) { | 38 return base::StringPrintf("ui_flags=%d status=%u", ui_flags, status); |
56 return base::StringPrintf( | |
57 "ui_flags=%d x_state=%u changed=%d", ui_flags, x_state, changed); | |
58 } | 39 } |
59 | 40 |
60 XDisplay* display_; | |
61 const KeyCode keycode_a_; | |
62 const KeyCode keycode_up_; | |
63 const KeyCode keycode_down_; | |
64 const KeyCode keycode_left_; | |
65 const KeyCode keycode_right_; | |
66 const KeyCode keycode_return_; | |
67 const KeyCode keycode_f6_; | |
68 | |
69 KeyboardDrivenEventRewriter rewriter_; | 41 KeyboardDrivenEventRewriter rewriter_; |
70 | 42 |
71 private: | 43 private: |
72 DISALLOW_COPY_AND_ASSIGN(KeyboardDrivenEventRewriterTest); | 44 DISALLOW_COPY_AND_ASSIGN(KeyboardDrivenEventRewriterTest); |
73 }; | 45 }; |
74 | 46 |
75 TEST_F(KeyboardDrivenEventRewriterTest, PassThrough) { | 47 TEST_F(KeyboardDrivenEventRewriterTest, PassThrough) { |
76 struct { | 48 struct { |
77 ui::KeyboardCode ui_keycode; | 49 ui::KeyboardCode ui_keycode; |
78 int ui_flags; | 50 int ui_flags; |
79 KeyCode x_keycode; | |
80 unsigned int x_state; | |
81 } kTests[] = { | 51 } kTests[] = { |
82 { ui::VKEY_A, ui::EF_NONE, keycode_a_, 0 }, | 52 { ui::VKEY_A, ui::EF_NONE }, |
83 { ui::VKEY_A, ui::EF_CONTROL_DOWN, keycode_a_, ControlMask }, | 53 { ui::VKEY_A, ui::EF_CONTROL_DOWN }, |
84 { ui::VKEY_A, ui::EF_ALT_DOWN, keycode_a_, Mod1Mask }, | 54 { ui::VKEY_A, ui::EF_ALT_DOWN }, |
85 { ui::VKEY_A, ui::EF_SHIFT_DOWN, keycode_a_, ShiftMask }, | 55 { ui::VKEY_A, ui::EF_SHIFT_DOWN }, |
86 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 56 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
87 keycode_a_, ControlMask | Mod1Mask }, | 57 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN }, |
88 { ui::VKEY_A, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN, | |
89 keycode_a_, ControlMask | Mod1Mask | ShiftMask }, | |
90 | 58 |
91 { ui::VKEY_LEFT, ui::EF_NONE, keycode_left_, 0 }, | 59 { ui::VKEY_LEFT, ui::EF_NONE }, |
92 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN, keycode_left_, ControlMask }, | 60 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN }, |
93 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 61 { ui::VKEY_LEFT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
94 keycode_left_, ControlMask | Mod1Mask }, | |
95 | 62 |
96 { ui::VKEY_RIGHT, ui::EF_NONE, keycode_right_, 0 }, | 63 { ui::VKEY_RIGHT, ui::EF_NONE }, |
97 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN, keycode_right_, ControlMask }, | 64 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN }, |
98 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 65 { ui::VKEY_RIGHT, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
99 keycode_right_, ControlMask | Mod1Mask }, | |
100 | 66 |
101 { ui::VKEY_UP, ui::EF_NONE, keycode_up_, 0 }, | 67 { ui::VKEY_UP, ui::EF_NONE }, |
102 { ui::VKEY_UP, ui::EF_CONTROL_DOWN, keycode_up_, ControlMask }, | 68 { ui::VKEY_UP, ui::EF_CONTROL_DOWN }, |
103 { ui::VKEY_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 69 { ui::VKEY_UP, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
104 keycode_up_, ControlMask | Mod1Mask }, | |
105 | 70 |
106 { ui::VKEY_DOWN, ui::EF_NONE, keycode_down_, 0 }, | 71 { ui::VKEY_DOWN, ui::EF_NONE }, |
107 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN, keycode_down_, ControlMask }, | 72 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN }, |
108 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 73 { ui::VKEY_DOWN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
109 keycode_down_, ControlMask | Mod1Mask }, | |
110 | 74 |
111 { ui::VKEY_RETURN, ui::EF_NONE, keycode_return_, 0 }, | 75 { ui::VKEY_RETURN, ui::EF_NONE }, |
112 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN, keycode_return_, ControlMask }, | 76 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN }, |
113 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN, | 77 { ui::VKEY_RETURN, ui::EF_CONTROL_DOWN | ui::EF_ALT_DOWN }, |
114 keycode_return_, ControlMask | Mod1Mask }, | |
115 }; | 78 }; |
116 | 79 |
117 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { | 80 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { |
118 EXPECT_EQ(GetExpectedResultAsString(kTests[i].ui_flags, | 81 EXPECT_EQ(GetExpectedResultAsString(kTests[i].ui_flags, |
119 kTests[i].x_state, | 82 ui::EVENT_REWRITE_CONTINUE), |
120 false), | |
121 GetRewrittenEventAsString(kTests[i].ui_keycode, | 83 GetRewrittenEventAsString(kTests[i].ui_keycode, |
122 kTests[i].ui_flags, | 84 kTests[i].ui_flags, |
123 ui::ET_KEY_PRESSED, | 85 ui::ET_KEY_PRESSED)) |
124 kTests[i].x_keycode, | |
125 kTests[i].x_state)) | |
126 << "Test case " << i; | 86 << "Test case " << i; |
127 } | 87 } |
128 } | 88 } |
129 | 89 |
130 TEST_F(KeyboardDrivenEventRewriterTest, Rewrite) { | 90 TEST_F(KeyboardDrivenEventRewriterTest, Rewrite) { |
131 const int kModifierMask = ui::EF_SHIFT_DOWN; | 91 const int kModifierMask = ui::EF_SHIFT_DOWN; |
132 const unsigned int kXState = ShiftMask; | |
133 | 92 |
134 struct { | 93 struct { |
135 ui::KeyboardCode ui_keycode; | 94 ui::KeyboardCode ui_keycode; |
136 int ui_flags; | 95 int ui_flags; |
137 KeyCode x_keycode; | |
138 unsigned int x_state; | |
139 } kTests[] = { | 96 } kTests[] = { |
140 { ui::VKEY_LEFT, kModifierMask, keycode_left_, kXState }, | 97 { ui::VKEY_LEFT, kModifierMask }, |
141 { ui::VKEY_RIGHT, kModifierMask, keycode_right_, kXState }, | 98 { ui::VKEY_RIGHT, kModifierMask }, |
142 { ui::VKEY_UP, kModifierMask, keycode_up_, kXState }, | 99 { ui::VKEY_UP, kModifierMask }, |
143 { ui::VKEY_DOWN, kModifierMask, keycode_down_, kXState }, | 100 { ui::VKEY_DOWN, kModifierMask }, |
144 { ui::VKEY_RETURN, kModifierMask, keycode_return_, kXState }, | 101 { ui::VKEY_RETURN, kModifierMask }, |
145 { ui::VKEY_F6, kModifierMask, keycode_f6_, kXState }, | 102 { ui::VKEY_F6, kModifierMask }, |
146 }; | 103 }; |
147 | 104 |
148 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { | 105 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTests); ++i) { |
149 EXPECT_EQ(GetExpectedResultAsString(ui::EF_NONE, 0, true), | 106 EXPECT_EQ(GetExpectedResultAsString(ui::EF_NONE, |
| 107 ui::EVENT_REWRITE_REWRITTEN), |
150 GetRewrittenEventAsString(kTests[i].ui_keycode, | 108 GetRewrittenEventAsString(kTests[i].ui_keycode, |
151 kTests[i].ui_flags, | 109 kTests[i].ui_flags, |
152 ui::ET_KEY_PRESSED, | 110 ui::ET_KEY_PRESSED)) |
153 kTests[i].x_keycode, | |
154 kTests[i].x_state)) | |
155 << "Test case " << i; | 111 << "Test case " << i; |
156 } | 112 } |
157 } | 113 } |
158 | 114 |
159 } // namespace chromeos | 115 } // namespace chromeos |
OLD | NEW |