Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(211)

Side by Side Diff: ui/events/event_unittest.cc

Issue 862093002: Split the event library into a cross-platform and native part. Part 1. (Closed) Base URL: https://github.com/domokit/mojo.git@master
Patch Set: Rebase to ToT Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/events/event.cc ('k') | ui/events/event_utils.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "base/memory/scoped_ptr.h" 5 #include "base/memory/scoped_ptr.h"
6 #include "testing/gtest/include/gtest/gtest.h" 6 #include "testing/gtest/include/gtest/gtest.h"
7 #include "ui/events/event.h" 7 #include "ui/events/event.h"
8 #include "ui/events/event_utils.h" 8 #include "ui/events/event_utils.h"
9 #include "ui/events/keycodes/dom4/keycode_converter.h" 9 #include "ui/events/keycodes/dom4/keycode_converter.h"
10 #include "ui/events/test/events_test_utils.h" 10 #include "ui/events/test/events_test_utils.h"
11 11
12 #if defined(USE_X11) 12 #if defined(USE_X11)
13 #include <X11/Xlib.h> 13 #include <X11/Xlib.h>
14 #include "ui/events/test/events_test_utils_x11.h" 14 #include "ui/events/test/events_test_utils_x11.h"
15 #include "ui/gfx/x/x11_types.h" 15 #include "ui/gfx/x/x11_types.h"
16 #endif 16 #endif
17 17
18 namespace ui { 18 namespace ui {
19 19
20 TEST(EventTest, NoNativeEvent) {
21 KeyEvent keyev(ET_KEY_PRESSED, VKEY_SPACE, EF_NONE);
22 EXPECT_FALSE(keyev.HasNativeEvent());
23 }
24
25 TEST(EventTest, NativeEvent) {
26 #if defined(OS_WIN)
27 MSG native_event = { NULL, WM_KEYUP, VKEY_A, 0 };
28 KeyEvent keyev(native_event);
29 EXPECT_TRUE(keyev.HasNativeEvent());
30 #elif defined(USE_X11)
31 ScopedXI2Event event;
32 event.InitKeyEvent(ET_KEY_RELEASED, VKEY_A, EF_NONE);
33 KeyEvent keyev(event);
34 EXPECT_TRUE(keyev.HasNativeEvent());
35 #endif
36 }
37
38 TEST(EventTest, GetCharacter) { 20 TEST(EventTest, GetCharacter) {
39 // Check if Control+Enter returns 10. 21 // Check if Control+Enter returns 10.
40 KeyEvent keyev1(ET_KEY_PRESSED, VKEY_RETURN, EF_CONTROL_DOWN); 22 KeyEvent keyev1(ET_KEY_PRESSED, VKEY_RETURN, EF_CONTROL_DOWN);
41 EXPECT_EQ(10, keyev1.GetCharacter()); 23 EXPECT_EQ(10, keyev1.GetCharacter());
42 // Check if Enter returns 13. 24 // Check if Enter returns 13.
43 KeyEvent keyev2(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE); 25 KeyEvent keyev2(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE);
44 EXPECT_EQ(13, keyev2.GetCharacter()); 26 EXPECT_EQ(13, keyev2.GetCharacter());
45
46 #if defined(USE_X11)
47 // For X11, test the functions with native_event() as well. crbug.com/107837
48 ScopedXI2Event event;
49 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_RETURN, EF_CONTROL_DOWN);
50 KeyEvent keyev3(event);
51 EXPECT_EQ(10, keyev3.GetCharacter());
52
53 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_RETURN, EF_NONE);
54 KeyEvent keyev4(event);
55 EXPECT_EQ(13, keyev4.GetCharacter());
56 #endif
57 } 27 }
58 28
59 TEST(EventTest, ClickCount) { 29 TEST(EventTest, ClickCount) {
60 const gfx::Point origin(0, 0); 30 const gfx::Point origin(0, 0);
61 MouseEvent mouseev(ET_MOUSE_PRESSED, origin, origin, 0, 0); 31 MouseEvent mouseev(ET_MOUSE_PRESSED, origin, origin, 0, 0);
62 for (int i = 1; i <=3 ; ++i) { 32 for (int i = 1; i <=3 ; ++i) {
63 mouseev.SetClickCount(i); 33 mouseev.SetClickCount(i);
64 EXPECT_EQ(i, mouseev.GetClickCount()); 34 EXPECT_EQ(i, mouseev.GetClickCount());
65 } 35 }
66 } 36 }
(...skipping 24 matching lines...) Expand all
91 EXPECT_FALSE(MouseEvent::IsRepeatedClickEvent(mouse_ev1, mouse_ev2)); 61 EXPECT_FALSE(MouseEvent::IsRepeatedClickEvent(mouse_ev1, mouse_ev2));
92 62
93 // Too long a time between clicks. 63 // Too long a time between clicks.
94 test_ev1.set_location(gfx::Point(0, 0)); 64 test_ev1.set_location(gfx::Point(0, 0));
95 test_ev2.set_location(gfx::Point(0, 0)); 65 test_ev2.set_location(gfx::Point(0, 0));
96 test_ev1.set_time_stamp(start); 66 test_ev1.set_time_stamp(start);
97 test_ev2.set_time_stamp(later); 67 test_ev2.set_time_stamp(later);
98 EXPECT_FALSE(MouseEvent::IsRepeatedClickEvent(mouse_ev1, mouse_ev2)); 68 EXPECT_FALSE(MouseEvent::IsRepeatedClickEvent(mouse_ev1, mouse_ev2));
99 } 69 }
100 70
101 // Tests that an event only increases the click count and gets marked as a
102 // double click if a release event was seen for the previous click. This
103 // prevents the same PRESSED event from being processed twice:
104 // http://crbug.com/389162
105 TEST(EventTest, DoubleClickRequiresRelease) {
106 const gfx::Point origin1(0, 0);
107 const gfx::Point origin2(100, 0);
108 scoped_ptr<MouseEvent> ev;
109 base::TimeDelta start = base::TimeDelta::FromMilliseconds(0);
110
111 ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin1, origin1, 0, 0));
112 ev->set_time_stamp(start);
113 EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
114 ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin1, origin1, 0, 0));
115 ev->set_time_stamp(start);
116 EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
117
118 ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin2, origin2, 0, 0));
119 ev->set_time_stamp(start);
120 EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
121 ev.reset(new MouseEvent(ET_MOUSE_RELEASED, origin2, origin2, 0, 0));
122 ev->set_time_stamp(start);
123 EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
124 ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin2, origin2, 0, 0));
125 ev->set_time_stamp(start);
126 EXPECT_EQ(2, MouseEvent::GetRepeatCount(*ev));
127 ev.reset(new MouseEvent(ET_MOUSE_RELEASED, origin2, origin2, 0, 0));
128 ev->set_time_stamp(start);
129 EXPECT_EQ(2, MouseEvent::GetRepeatCount(*ev));
130 MouseEvent::ResetLastClickForTest();
131 }
132
133 // Tests that clicking right and then left clicking does not generate a double
134 // click.
135 TEST(EventTest, SingleClickRightLeft) {
136 const gfx::Point origin(0, 0);
137 scoped_ptr<MouseEvent> ev;
138 base::TimeDelta start = base::TimeDelta::FromMilliseconds(0);
139
140 ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin, origin,
141 ui::EF_RIGHT_MOUSE_BUTTON,
142 ui::EF_RIGHT_MOUSE_BUTTON));
143 ev->set_time_stamp(start);
144 EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
145 ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin, origin,
146 ui::EF_LEFT_MOUSE_BUTTON,
147 ui::EF_LEFT_MOUSE_BUTTON));
148 ev->set_time_stamp(start);
149 EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
150 ev.reset(new MouseEvent(ET_MOUSE_RELEASED, origin, origin,
151 ui::EF_LEFT_MOUSE_BUTTON,
152 ui::EF_LEFT_MOUSE_BUTTON));
153 ev->set_time_stamp(start);
154 EXPECT_EQ(1, MouseEvent::GetRepeatCount(*ev));
155 ev.reset(new MouseEvent(ET_MOUSE_PRESSED, origin, origin,
156 ui::EF_LEFT_MOUSE_BUTTON,
157 ui::EF_LEFT_MOUSE_BUTTON));
158 ev->set_time_stamp(start);
159 EXPECT_EQ(2, MouseEvent::GetRepeatCount(*ev));
160 MouseEvent::ResetLastClickForTest();
161 }
162
163 TEST(EventTest, KeyEvent) { 71 TEST(EventTest, KeyEvent) {
164 static const struct { 72 static const struct {
165 KeyboardCode key_code; 73 KeyboardCode key_code;
166 int flags; 74 int flags;
167 uint16 character; 75 uint16 character;
168 } kTestData[] = { 76 } kTestData[] = {
169 { VKEY_A, 0, 'a' }, 77 { VKEY_A, 0, 'a' },
170 { VKEY_A, EF_SHIFT_DOWN, 'A' }, 78 { VKEY_A, EF_SHIFT_DOWN, 'A' },
171 { VKEY_A, EF_CAPS_LOCK_DOWN, 'A' }, 79 { VKEY_A, EF_CAPS_LOCK_DOWN, 'A' },
172 { VKEY_A, EF_SHIFT_DOWN | EF_CAPS_LOCK_DOWN, 'a' }, 80 { VKEY_A, EF_SHIFT_DOWN | EF_CAPS_LOCK_DOWN, 'a' },
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 } 153 }
246 154
247 TEST(EventTest, KeyEventDirectUnicode) { 155 TEST(EventTest, KeyEventDirectUnicode) {
248 KeyEvent key(0x1234U, ui::VKEY_UNKNOWN, ui::EF_NONE); 156 KeyEvent key(0x1234U, ui::VKEY_UNKNOWN, ui::EF_NONE);
249 EXPECT_EQ(0x1234U, key.GetCharacter()); 157 EXPECT_EQ(0x1234U, key.GetCharacter());
250 EXPECT_EQ(ET_KEY_PRESSED, key.type()); 158 EXPECT_EQ(ET_KEY_PRESSED, key.type());
251 EXPECT_TRUE(key.is_char()); 159 EXPECT_TRUE(key.is_char());
252 } 160 }
253 161
254 TEST(EventTest, NormalizeKeyEventFlags) { 162 TEST(EventTest, NormalizeKeyEventFlags) {
255 #if defined(USE_X11)
256 // Normalize flags when KeyEvent is created from XEvent.
257 ScopedXI2Event event;
258 {
259 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN);
260 KeyEvent keyev(event);
261 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags());
262 }
263 {
264 event.InitKeyEvent(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN);
265 KeyEvent keyev(event);
266 EXPECT_EQ(EF_NONE, keyev.flags());
267 }
268 {
269 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_CONTROL, EF_CONTROL_DOWN);
270 KeyEvent keyev(event);
271 EXPECT_EQ(EF_CONTROL_DOWN, keyev.flags());
272 }
273 {
274 event.InitKeyEvent(ET_KEY_RELEASED, VKEY_CONTROL, EF_CONTROL_DOWN);
275 KeyEvent keyev(event);
276 EXPECT_EQ(EF_NONE, keyev.flags());
277 }
278 {
279 event.InitKeyEvent(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN);
280 KeyEvent keyev(event);
281 EXPECT_EQ(EF_ALT_DOWN, keyev.flags());
282 }
283 {
284 event.InitKeyEvent(ET_KEY_RELEASED, VKEY_MENU, EF_ALT_DOWN);
285 KeyEvent keyev(event);
286 EXPECT_EQ(EF_NONE, keyev.flags());
287 }
288 #endif
289
290 // Do not normalize flags for synthesized events without 163 // Do not normalize flags for synthesized events without
291 // KeyEvent::NormalizeFlags called explicitly. 164 // KeyEvent::NormalizeFlags called explicitly.
292 { 165 {
293 KeyEvent keyev(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN); 166 KeyEvent keyev(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN);
294 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); 167 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags());
295 } 168 }
296 { 169 {
297 KeyEvent keyev(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN); 170 KeyEvent keyev(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN);
298 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); 171 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags());
299 keyev.NormalizeFlags(); 172 keyev.NormalizeFlags();
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
344 KeyEvent key(ET_KEY_PRESSED, VKEY_RETURN, kCodeForSpace, EF_NONE); 217 KeyEvent key(ET_KEY_PRESSED, VKEY_RETURN, kCodeForSpace, EF_NONE);
345 EXPECT_EQ(kCodeForSpace, key.code()); 218 EXPECT_EQ(kCodeForSpace, key.code());
346 } 219 }
347 { 220 {
348 // If the synthetic event is initialized without code, it returns 221 // If the synthetic event is initialized without code, it returns
349 // an empty string. 222 // an empty string.
350 // TODO(komatsu): Fill a fallback value assuming the US keyboard layout. 223 // TODO(komatsu): Fill a fallback value assuming the US keyboard layout.
351 KeyEvent key(ET_KEY_PRESSED, VKEY_SPACE, EF_NONE); 224 KeyEvent key(ET_KEY_PRESSED, VKEY_SPACE, EF_NONE);
352 EXPECT_TRUE(key.code().empty()); 225 EXPECT_TRUE(key.code().empty());
353 } 226 }
354 #if defined(USE_X11)
355 {
356 // KeyEvent converts from the native keycode (XKB) to the code.
357 ScopedXI2Event xevent;
358 xevent.InitKeyEvent(ET_KEY_PRESSED, VKEY_SPACE, kNativeCodeSpace);
359 KeyEvent key(xevent);
360 EXPECT_EQ(kCodeForSpace, key.code());
361 }
362 #endif // USE_X11
363 #if defined(OS_WIN) 227 #if defined(OS_WIN)
364 { 228 {
365 // Test a non extended key. 229 // Test a non extended key.
366 ASSERT_EQ((kNativeCodeSpace & 0xFF), kNativeCodeSpace); 230 ASSERT_EQ((kNativeCodeSpace & 0xFF), kNativeCodeSpace);
367 231
368 const LPARAM lParam = GetLParamFromScanCode(kNativeCodeSpace); 232 const LPARAM lParam = GetLParamFromScanCode(kNativeCodeSpace);
369 MSG native_event = { NULL, WM_KEYUP, VKEY_SPACE, lParam }; 233 MSG native_event = { NULL, WM_KEYUP, VKEY_SPACE, lParam };
370 KeyEvent key(native_event); 234 KeyEvent key(native_event);
371 235
372 // KeyEvent converts from the native keycode (scan code) to the code. 236 // KeyEvent converts from the native keycode (scan code) to the code.
373 EXPECT_EQ(kCodeForSpace, key.code()); 237 EXPECT_EQ(kCodeForSpace, key.code());
374 } 238 }
375 { 239 {
376 const char kCodeForHome[] = "Home"; 240 const char kCodeForHome[] = "Home";
377 const uint16 kNativeCodeHome = 0xe047; 241 const uint16 kNativeCodeHome = 0xe047;
378 242
379 // 'Home' is an extended key with 0xe000 bits. 243 // 'Home' is an extended key with 0xe000 bits.
380 ASSERT_NE((kNativeCodeHome & 0xFF), kNativeCodeHome); 244 ASSERT_NE((kNativeCodeHome & 0xFF), kNativeCodeHome);
381 const LPARAM lParam = GetLParamFromScanCode(kNativeCodeHome); 245 const LPARAM lParam = GetLParamFromScanCode(kNativeCodeHome);
382 246
383 MSG native_event = { NULL, WM_KEYUP, VKEY_HOME, lParam }; 247 MSG native_event = { NULL, WM_KEYUP, VKEY_HOME, lParam };
384 KeyEvent key(native_event); 248 KeyEvent key(native_event);
385 249
386 // KeyEvent converts from the native keycode (scan code) to the code. 250 // KeyEvent converts from the native keycode (scan code) to the code.
387 EXPECT_EQ(kCodeForHome, key.code()); 251 EXPECT_EQ(kCodeForHome, key.code());
388 } 252 }
389 #endif // OS_WIN 253 #endif // OS_WIN
390 } 254 }
391 255
392 #if defined(USE_X11) || defined(OS_WIN)
393 TEST(EventTest, AutoRepeat) {
394 const uint16 kNativeCodeA = ui::KeycodeConverter::CodeToNativeKeycode("KeyA");
395 const uint16 kNativeCodeB = ui::KeycodeConverter::CodeToNativeKeycode("KeyB");
396 #if defined(USE_X11)
397 ScopedXI2Event native_event_a_pressed;
398 native_event_a_pressed.InitKeyEvent(ET_KEY_PRESSED, VKEY_A, kNativeCodeA);
399 ScopedXI2Event native_event_a_released;
400 native_event_a_released.InitKeyEvent(ET_KEY_RELEASED, VKEY_A, kNativeCodeA);
401 ScopedXI2Event native_event_b_pressed;
402 native_event_b_pressed.InitKeyEvent(ET_KEY_PRESSED, VKEY_B, kNativeCodeB);
403 ScopedXI2Event native_event_a_pressed_nonstandard_state;
404 native_event_a_pressed_nonstandard_state.InitKeyEvent(
405 ET_KEY_PRESSED, VKEY_A, kNativeCodeA);
406 // IBUS-GTK uses the mask (1 << 25) to detect reposted event.
407 static_cast<XEvent*>(native_event_a_pressed_nonstandard_state)->xkey.state |=
408 1 << 25;
409 #elif defined(OS_WIN)
410 const LPARAM lParam_a = GetLParamFromScanCode(kNativeCodeA);
411 const LPARAM lParam_b = GetLParamFromScanCode(kNativeCodeB);
412 MSG native_event_a_pressed = { NULL, WM_KEYDOWN, VKEY_A, lParam_a };
413 MSG native_event_a_released = { NULL, WM_KEYUP, VKEY_A, lParam_a };
414 MSG native_event_b_pressed = { NULL, WM_KEYUP, VKEY_B, lParam_b };
415 #endif
416 KeyEvent key_a1(native_event_a_pressed);
417 EXPECT_FALSE(key_a1.IsRepeat());
418 KeyEvent key_a1_released(native_event_a_released);
419 EXPECT_FALSE(key_a1_released.IsRepeat());
420
421 KeyEvent key_a2(native_event_a_pressed);
422 EXPECT_FALSE(key_a2.IsRepeat());
423 KeyEvent key_a2_repeated(native_event_a_pressed);
424 EXPECT_TRUE(key_a2_repeated.IsRepeat());
425 KeyEvent key_a2_released(native_event_a_released);
426 EXPECT_FALSE(key_a2_released.IsRepeat());
427
428 KeyEvent key_a3(native_event_a_pressed);
429 EXPECT_FALSE(key_a3.IsRepeat());
430 KeyEvent key_b(native_event_b_pressed);
431 EXPECT_FALSE(key_b.IsRepeat());
432 KeyEvent key_a3_again(native_event_a_pressed);
433 EXPECT_FALSE(key_a3_again.IsRepeat());
434 KeyEvent key_a3_repeated(native_event_a_pressed);
435 EXPECT_TRUE(key_a3_repeated.IsRepeat());
436 KeyEvent key_a3_repeated2(native_event_a_pressed);
437 EXPECT_TRUE(key_a3_repeated2.IsRepeat());
438 KeyEvent key_a3_released(native_event_a_released);
439 EXPECT_FALSE(key_a3_released.IsRepeat());
440
441 #if defined(USE_X11)
442 KeyEvent key_a4_pressed(native_event_a_pressed);
443 EXPECT_FALSE(key_a4_pressed.IsRepeat());
444
445 KeyEvent key_a4_pressed_nonstandard_state(
446 native_event_a_pressed_nonstandard_state);
447 EXPECT_FALSE(key_a4_pressed_nonstandard_state.IsRepeat());
448 #endif
449 }
450 #endif // USE_X11 || OS_WIN
451
452 } // namespace ui 256 } // namespace ui
OLDNEW
« no previous file with comments | « ui/events/event.cc ('k') | ui/events/event_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698