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 3 // found in the LICENSE file. 4 5 #include "testing/gtest/include/gtest/gtest.h" 6 #include "ui/base/events/event.h" 7 8 #if defined(USE_X11) 9 #include <X11/Xlib.h> 10 #include "ui/base/x/x11_util.h" 11 #endif 12 13 namespace ui { 14 15 TEST(EventTest, NoNativeEvent) { 16 KeyEvent keyev(ET_KEY_PRESSED, VKEY_SPACE, 0, false); 17 EXPECT_FALSE(keyev.HasNativeEvent()); 18 } 19 20 TEST(EventTest, NativeEvent) { 21 #if defined(OS_WIN) 22 MSG native_event = { NULL, WM_KEYUP, VKEY_A, 0 }; 23 KeyEvent keyev(native_event, false); 24 EXPECT_TRUE(keyev.HasNativeEvent()); 25 #elif defined(USE_X11) 26 scoped_ptr<XEvent> native_event(new XEvent); 27 InitXKeyEventForTesting(ET_KEY_RELEASED, VKEY_A, 0, native_event.get()); 28 KeyEvent keyev(native_event.get(), false); 29 EXPECT_TRUE(keyev.HasNativeEvent()); 30 #endif 31 } 32 33 TEST(EventTest, GetCharacter) { 34 // Check if Control+Enter returns 10. 35 KeyEvent keyev1(ET_KEY_PRESSED, VKEY_RETURN, EF_CONTROL_DOWN, false); 36 EXPECT_EQ(10, keyev1.GetCharacter()); 37 EXPECT_EQ(13, keyev1.GetUnmodifiedCharacter()); 38 // Check if Enter returns 13. 39 KeyEvent keyev2(ET_KEY_PRESSED, VKEY_RETURN, 0, false); 40 EXPECT_EQ(13, keyev2.GetCharacter()); 41 EXPECT_EQ(13, keyev2.GetUnmodifiedCharacter()); 42 43 #if defined(USE_X11) 44 // For X11, test the functions with native_event() as well. crbug.com/107837 45 scoped_ptr<XEvent> native_event(new XEvent); 46 47 InitXKeyEventForTesting(ET_KEY_PRESSED, VKEY_RETURN, EF_CONTROL_DOWN, 48 native_event.get()); 49 KeyEvent keyev3(native_event.get(), false); 50 EXPECT_EQ(10, keyev3.GetCharacter()); 51 EXPECT_EQ(13, keyev3.GetUnmodifiedCharacter()); 52 53 InitXKeyEventForTesting(ET_KEY_PRESSED, VKEY_RETURN, 0, native_event.get()); 54 KeyEvent keyev4(native_event.get(), false); 55 EXPECT_EQ(13, keyev4.GetCharacter()); 56 EXPECT_EQ(13, keyev4.GetUnmodifiedCharacter()); 57 #endif 58 } 59 60 TEST(EventTest, ClickCount) { 61 const gfx::Point origin(0, 0); 62 MouseEvent mouseev(ET_MOUSE_PRESSED, origin, origin, 0); 63 for (int i = 1; i <=3 ; ++i) { 64 mouseev.SetClickCount(i); 65 EXPECT_EQ(i, mouseev.GetClickCount()); 66 } 67 } 68 69 TEST(EventTest, Repeated) { 70 const gfx::Point origin(0, 0); 71 MouseEvent mouse_ev1(ET_MOUSE_PRESSED, origin, origin, 0); 72 MouseEvent mouse_ev2(ET_MOUSE_PRESSED, origin, origin, 0); 73 MouseEvent::TestApi test_ev1(&mouse_ev1); 74 MouseEvent::TestApi test_ev2(&mouse_ev2); 75 76 base::TimeDelta start = base::TimeDelta::FromMilliseconds(0); 77 base::TimeDelta soon = start + base::TimeDelta::FromMilliseconds(1); 78 base::TimeDelta later = start + base::TimeDelta::FromMilliseconds(1000); 79 80 // Close point. 81 test_ev1.set_location(gfx::Point(0, 0)); 82 test_ev2.set_location(gfx::Point(1, 0)); 83 test_ev1.set_time_stamp(start); 84 test_ev2.set_time_stamp(soon); 85 EXPECT_TRUE(MouseEvent::IsRepeatedClickEvent(mouse_ev1, mouse_ev2)); 86 87 // Too far. 88 test_ev1.set_location(gfx::Point(0, 0)); 89 test_ev2.set_location(gfx::Point(10, 0)); 90 test_ev1.set_time_stamp(start); 91 test_ev2.set_time_stamp(soon); 92 EXPECT_FALSE(MouseEvent::IsRepeatedClickEvent(mouse_ev1, mouse_ev2)); 93 94 // Too long a time between clicks. 95 test_ev1.set_location(gfx::Point(0, 0)); 96 test_ev2.set_location(gfx::Point(0, 0)); 97 test_ev1.set_time_stamp(start); 98 test_ev2.set_time_stamp(later); 99 EXPECT_FALSE(MouseEvent::IsRepeatedClickEvent(mouse_ev1, mouse_ev2)); 100 } 101 102 // Bug 99129. 103 #if defined(USE_AURA) 104 #define MAYBE_KeyEvent DISABLED_KeyEvent 105 #define MAYBE_KeyEventDirectUnicode DISABLED_KeyEventDirectUnicode 106 #else 107 #define MAYBE_KeyEvent KeyEvent 108 #define MAYBE_KeyEventDirectUnicode KeyEventDirectUnicode 109 #endif 110 111 TEST(EventTest, MAYBE_KeyEvent) { 112 static const struct { 113 KeyboardCode key_code; 114 int flags; 115 uint16 character; 116 uint16 unmodified_character; 117 } kTestData[] = { 118 { VKEY_A, 0, 'a', 'a' }, 119 { VKEY_A, EF_SHIFT_DOWN, 'A', 'A' }, 120 { VKEY_A, EF_CAPS_LOCK_DOWN, 'A', 'a' }, 121 { VKEY_A, EF_SHIFT_DOWN | EF_CAPS_LOCK_DOWN, 'a', 'A' }, 122 { VKEY_A, EF_CONTROL_DOWN, 0x01, 'a' }, 123 { VKEY_A, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x01', 'A' }, 124 { VKEY_Z, 0, 'z', 'z' }, 125 { VKEY_Z, EF_SHIFT_DOWN, 'Z', 'Z' }, 126 { VKEY_Z, EF_CAPS_LOCK_DOWN, 'Z', 'z' }, 127 { VKEY_Z, EF_SHIFT_DOWN | EF_CAPS_LOCK_DOWN, 'z', 'Z' }, 128 { VKEY_Z, EF_CONTROL_DOWN, '\x1A', 'z' }, 129 { VKEY_Z, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1A', 'Z' }, 130 131 { VKEY_2, EF_CONTROL_DOWN, '\0', '2' }, 132 { VKEY_2, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\0', '@' }, 133 { VKEY_6, EF_CONTROL_DOWN, '\0', '6' }, 134 { VKEY_6, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1E', '^' }, 135 { VKEY_OEM_MINUS, EF_CONTROL_DOWN, '\0', '-' }, 136 { VKEY_OEM_MINUS, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\x1F', '_'}, 137 { VKEY_OEM_4, EF_CONTROL_DOWN, '\x1B', '[' }, 138 { VKEY_OEM_4, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\0', '{' }, 139 { VKEY_OEM_5, EF_CONTROL_DOWN, '\x1C', '\\' }, 140 { VKEY_OEM_5, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\0', '|' }, 141 { VKEY_OEM_6, EF_CONTROL_DOWN, '\x1D', ']' }, 142 { VKEY_OEM_6, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\0', '}' }, 143 { VKEY_RETURN, EF_CONTROL_DOWN, '\x0A', '\r' }, 144 145 { VKEY_0, 0, '0', '0' }, 146 { VKEY_0, EF_SHIFT_DOWN, ')', ')' }, 147 { VKEY_0, EF_SHIFT_DOWN | EF_CAPS_LOCK_DOWN, ')', ')' }, 148 { VKEY_0, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\0', ')' }, 149 150 { VKEY_9, 0, '9', '9' }, 151 { VKEY_9, EF_SHIFT_DOWN, '(', '(' }, 152 { VKEY_9, EF_SHIFT_DOWN | EF_CAPS_LOCK_DOWN, '(', '(' }, 153 { VKEY_9, EF_SHIFT_DOWN | EF_CONTROL_DOWN, '\0', '(' }, 154 155 { VKEY_NUMPAD0, EF_CONTROL_DOWN, '\0', '0' }, 156 { VKEY_NUMPAD0, EF_SHIFT_DOWN, '0', '0' }, 157 158 { VKEY_NUMPAD9, EF_CONTROL_DOWN, '\0', '9' }, 159 { VKEY_NUMPAD9, EF_SHIFT_DOWN, '9', '9' }, 160 161 { VKEY_TAB, EF_CONTROL_DOWN, '\0', '\t' }, 162 { VKEY_TAB, EF_SHIFT_DOWN, '\t', '\t' }, 163 164 { VKEY_MULTIPLY, EF_CONTROL_DOWN, '\0', '*' }, 165 { VKEY_MULTIPLY, EF_SHIFT_DOWN, '*', '*' }, 166 { VKEY_ADD, EF_CONTROL_DOWN, '\0', '+' }, 167 { VKEY_ADD, EF_SHIFT_DOWN, '+', '+' }, 168 { VKEY_SUBTRACT, EF_CONTROL_DOWN, '\0', '-' }, 169 { VKEY_SUBTRACT, EF_SHIFT_DOWN, '-', '-' }, 170 { VKEY_DECIMAL, EF_CONTROL_DOWN, '\0', '.' }, 171 { VKEY_DECIMAL, EF_SHIFT_DOWN, '.', '.' }, 172 { VKEY_DIVIDE, EF_CONTROL_DOWN, '\0', '/' }, 173 { VKEY_DIVIDE, EF_SHIFT_DOWN, '/', '/' }, 174 175 { VKEY_OEM_1, EF_CONTROL_DOWN, '\0', ';' }, 176 { VKEY_OEM_1, EF_SHIFT_DOWN, ':', ':' }, 177 { VKEY_OEM_PLUS, EF_CONTROL_DOWN, '\0', '=' }, 178 { VKEY_OEM_PLUS, EF_SHIFT_DOWN, '+', '+' }, 179 { VKEY_OEM_COMMA, EF_CONTROL_DOWN, '\0', ',' }, 180 { VKEY_OEM_COMMA, EF_SHIFT_DOWN, '<', '<' }, 181 { VKEY_OEM_PERIOD, EF_CONTROL_DOWN, '\0', '.' }, 182 { VKEY_OEM_PERIOD, EF_SHIFT_DOWN, '>', '>' }, 183 { VKEY_OEM_3, EF_CONTROL_DOWN, '\0', '`' }, 184 { VKEY_OEM_3, EF_SHIFT_DOWN, '~', '~' }, 185 }; 186 187 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(kTestData); ++i) { 188 KeyEvent key(ET_KEY_PRESSED, 189 kTestData[i].key_code, 190 kTestData[i].flags, 191 false); 192 EXPECT_EQ(kTestData[i].character, key.GetCharacter()) 193 << " Index:" << i << " key_code:" << kTestData[i].key_code; 194 EXPECT_EQ(kTestData[i].unmodified_character, key.GetUnmodifiedCharacter()) 195 << " Index:" << i << " key_code:" << kTestData[i].key_code; 196 } 197 } 198 199 TEST(EventTest, MAYBE_KeyEventDirectUnicode) { 200 KeyEvent key(ET_KEY_PRESSED, VKEY_UNKNOWN, EF_SHIFT_DOWN, false); 201 key.set_character(0x1234U); 202 key.set_unmodified_character(0x4321U); 203 EXPECT_EQ(0x1234U, key.GetCharacter()); 204 EXPECT_EQ(0x4321U, key.GetUnmodifiedCharacter()); 205 KeyEvent key2(ET_KEY_RELEASED, VKEY_UNKNOWN, EF_CONTROL_DOWN, false); 206 key2.set_character(0x4321U); 207 key2.set_unmodified_character(0x1234U); 208 EXPECT_EQ(0x4321U, key2.GetCharacter()); 209 EXPECT_EQ(0x1234U, key2.GetUnmodifiedCharacter()); 210 } 211 212 TEST(EventTest, NormalizeKeyEventFlags) { 213 #if defined(USE_X11) 214 // Normalize flags when KeyEvent is created from XEvent. 215 { 216 scoped_ptr<XEvent> native_event(new XEvent); 217 InitXKeyEventForTesting(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN, 218 native_event.get()); 219 KeyEvent keyev(native_event.get(), false); 220 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); 221 } 222 { 223 scoped_ptr<XEvent> native_event(new XEvent); 224 InitXKeyEventForTesting(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN, 225 native_event.get()); 226 KeyEvent keyev(native_event.get(), false); 227 EXPECT_EQ(EF_NONE, keyev.flags()); 228 } 229 { 230 scoped_ptr<XEvent> native_event(new XEvent); 231 InitXKeyEventForTesting(ET_KEY_PRESSED, VKEY_CONTROL, EF_CONTROL_DOWN, 232 native_event.get()); 233 KeyEvent keyev(native_event.get(), false); 234 EXPECT_EQ(EF_CONTROL_DOWN, keyev.flags()); 235 } 236 { 237 scoped_ptr<XEvent> native_event(new XEvent); 238 InitXKeyEventForTesting(ET_KEY_RELEASED, VKEY_CONTROL, EF_CONTROL_DOWN, 239 native_event.get()); 240 KeyEvent keyev(native_event.get(), false); 241 EXPECT_EQ(EF_NONE, keyev.flags()); 242 } 243 { 244 scoped_ptr<XEvent> native_event(new XEvent); 245 InitXKeyEventForTesting(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN, 246 native_event.get()); 247 KeyEvent keyev(native_event.get(), false); 248 EXPECT_EQ(EF_ALT_DOWN, keyev.flags()); 249 } 250 { 251 scoped_ptr<XEvent> native_event(new XEvent); 252 InitXKeyEventForTesting(ET_KEY_RELEASED, VKEY_MENU, EF_ALT_DOWN, 253 native_event.get()); 254 KeyEvent keyev(native_event.get(), false); 255 EXPECT_EQ(EF_NONE, keyev.flags()); 256 } 257 #endif 258 259 // Do not normalize flags for synthesized events without 260 // KeyEvent::NormalizeFlags called explicitly. 261 { 262 KeyEvent keyev(ET_KEY_PRESSED, VKEY_SHIFT, EF_SHIFT_DOWN, false); 263 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); 264 } 265 { 266 KeyEvent keyev(ET_KEY_RELEASED, VKEY_SHIFT, EF_SHIFT_DOWN, false); 267 EXPECT_EQ(EF_SHIFT_DOWN, keyev.flags()); 268 keyev.NormalizeFlags(); 269 EXPECT_EQ(EF_NONE, keyev.flags()); 270 } 271 { 272 KeyEvent keyev(ET_KEY_PRESSED, VKEY_CONTROL, EF_CONTROL_DOWN, false); 273 EXPECT_EQ(EF_CONTROL_DOWN, keyev.flags()); 274 } 275 { 276 KeyEvent keyev(ET_KEY_RELEASED, VKEY_CONTROL, EF_CONTROL_DOWN, false); 277 EXPECT_EQ(EF_CONTROL_DOWN, keyev.flags()); 278 keyev.NormalizeFlags(); 279 EXPECT_EQ(EF_NONE, keyev.flags()); 280 } 281 { 282 KeyEvent keyev(ET_KEY_PRESSED, VKEY_MENU, EF_ALT_DOWN, false); 283 EXPECT_EQ(EF_ALT_DOWN, keyev.flags()); 284 } 285 { 286 KeyEvent keyev(ET_KEY_RELEASED, VKEY_MENU, EF_ALT_DOWN, false); 287 EXPECT_EQ(EF_ALT_DOWN, keyev.flags()); 288 keyev.NormalizeFlags(); 289 EXPECT_EQ(EF_NONE, keyev.flags()); 290 } 291 } 292 293 } // namespace ui 294