1 // Copyright (c) 2011 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 #import <Cocoa/Cocoa.h> 6 7 #include "testing/gtest/include/gtest/gtest.h" 8 #include "ui/base/events/event_constants.h" 9 #include "ui/base/events/event_utils.h" 10 #include "ui/base/test/cocoa_test_event_utils.h" 11 #import "ui/base/test/ui_cocoa_test_helper.h" 12 #include "ui/gfx/point.h" 13 14 using namespace cocoa_test_event_utils; 15 16 namespace { 17 18 class EventsMacTest : public ui::CocoaTest { 19 public: 20 EventsMacTest() {} 21 22 private: 23 DISALLOW_COPY_AND_ASSIGN(EventsMacTest); 24 }; 25 26 TEST_F(EventsMacTest, EventTypeFromNative) { 27 NSEvent* native_event = nil; 28 ui::EventType type = ui::ET_UNKNOWN; 29 30 native_event = MouseEventWithType(NSLeftMouseDown, 0); 31 type = ui::EventTypeFromNative(native_event); 32 EXPECT_EQ(ui::ET_MOUSE_PRESSED, type); 33 34 native_event = MouseEventWithType(NSLeftMouseUp, 0); 35 type = ui::EventTypeFromNative(native_event); 36 EXPECT_EQ(ui::ET_MOUSE_RELEASED, type); 37 38 native_event = MouseEventWithType(NSRightMouseDown, 0); 39 type = ui::EventTypeFromNative(native_event); 40 EXPECT_EQ(ui::ET_MOUSE_PRESSED, type); 41 42 native_event = MouseEventWithType(NSRightMouseUp, 0); 43 type = ui::EventTypeFromNative(native_event); 44 EXPECT_EQ(ui::ET_MOUSE_RELEASED, type); 45 46 native_event = MouseEventWithType(NSMouseMoved, 0); 47 type = ui::EventTypeFromNative(native_event); 48 EXPECT_EQ(ui::ET_MOUSE_MOVED, type); 49 50 native_event = MouseEventWithType(NSLeftMouseDragged, 0); 51 type = ui::EventTypeFromNative(native_event); 52 EXPECT_EQ(ui::ET_MOUSE_DRAGGED, type); 53 54 native_event = MouseEventWithType(NSRightMouseDragged, 0); 55 type = ui::EventTypeFromNative(native_event); 56 EXPECT_EQ(ui::ET_MOUSE_DRAGGED, type); 57 58 native_event = EnterExitEventWithType(NSMouseEntered); 59 type = ui::EventTypeFromNative(native_event); 60 EXPECT_EQ(ui::ET_MOUSE_ENTERED, type); 61 62 native_event = EnterExitEventWithType(NSMouseExited); 63 type = ui::EventTypeFromNative(native_event); 64 EXPECT_EQ(ui::ET_MOUSE_EXITED, type); 65 66 native_event = KeyEventWithType(NSKeyDown, 0); 67 type = ui::EventTypeFromNative(native_event); 68 EXPECT_EQ(ui::ET_KEY_PRESSED, type); 69 70 native_event = KeyEventWithType(NSKeyUp, 0); 71 type = ui::EventTypeFromNative(native_event); 72 EXPECT_EQ(ui::ET_KEY_RELEASED, type); 73 74 native_event = KeyEventWithType(NSFlagsChanged, 0); 75 type = ui::EventTypeFromNative(native_event); 76 EXPECT_EQ(ui::ET_KEY_PRESSED, type); 77 78 native_event = OtherEventWithType(NSAppKitDefined); 79 type = ui::EventTypeFromNative(native_event); 80 EXPECT_EQ(ui::ET_UNKNOWN, type); 81 82 native_event = OtherEventWithType(NSSystemDefined); 83 type = ui::EventTypeFromNative(native_event); 84 EXPECT_EQ(ui::ET_UNKNOWN, type); 85 86 native_event = OtherEventWithType(NSApplicationDefined); 87 type = ui::EventTypeFromNative(native_event); 88 EXPECT_EQ(ui::ET_UNKNOWN, type); 89 90 native_event = OtherEventWithType(NSPeriodic); 91 type = ui::EventTypeFromNative(native_event); 92 EXPECT_EQ(ui::ET_UNKNOWN, type); 93 94 native_event = EnterExitEventWithType(NSCursorUpdate); 95 type = ui::EventTypeFromNative(native_event); 96 EXPECT_EQ(ui::ET_UNKNOWN, type); 97 98 native_event = MouseEventWithType(NSOtherMouseDown, 0); 99 type = ui::EventTypeFromNative(native_event); 100 EXPECT_EQ(ui::ET_MOUSE_PRESSED, type); 101 102 native_event = MouseEventWithType(NSOtherMouseUp, 0); 103 type = ui::EventTypeFromNative(native_event); 104 EXPECT_EQ(ui::ET_MOUSE_RELEASED, type); 105 106 native_event = MouseEventWithType(NSOtherMouseDragged, 0); 107 type = ui::EventTypeFromNative(native_event); 108 EXPECT_EQ(ui::ET_MOUSE_DRAGGED, type); 109 } 110 111 TEST_F(EventsMacTest, EventFlagsFromNative) { 112 NSEvent* native_event = nil; 113 int flags = 0; 114 115 // No key flags. 116 native_event = KeyEventWithType(NSKeyDown, 0); 117 flags = ui::EventFlagsFromNative(native_event); 118 EXPECT_EQ(0, flags); 119 120 // All key flags. 121 native_event = KeyEventWithType(NSKeyDown, 122 NSAlphaShiftKeyMask | 123 NSShiftKeyMask | 124 NSControlKeyMask | 125 NSAlternateKeyMask | 126 NSCommandKeyMask); 127 flags = ui::EventFlagsFromNative(native_event); 128 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN | 129 ui::EF_SHIFT_DOWN | 130 ui::EF_CONTROL_DOWN | 131 ui::EF_ALT_DOWN | 132 ui::EF_COMMAND_DOWN, 133 flags); 134 135 // Left mouse flags. 136 native_event = MouseEventWithType(NSLeftMouseDown, 0); 137 flags = ui::EventFlagsFromNative(native_event); 138 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, flags); 139 140 // Right mouse flags. 141 native_event = MouseEventWithType(NSRightMouseDown, 0); 142 flags = ui::EventFlagsFromNative(native_event); 143 EXPECT_EQ(ui::EF_RIGHT_MOUSE_BUTTON, flags); 144 145 // Center mouse flags. 146 native_event = MouseEventWithType(NSOtherMouseDown, 0); 147 flags = ui::EventFlagsFromNative(native_event); 148 EXPECT_EQ(ui::EF_MIDDLE_MOUSE_BUTTON, flags); 149 } 150 151 TEST_F(EventsMacTest, EventLocationFromNative) { 152 NSWindow* window = [[NSWindow alloc] 153 initWithContentRect:NSMakeRect(10, 25, 200, 205) 154 styleMask:NSTitledWindowMask 155 backing:NSBackingStoreBuffered 156 defer:NO]; 157 [window orderFront:nil]; 158 159 // Construct mouse event from window number having position at bottom-left. 160 // Cocoa origin is at bottom-left. ui::Event origin is top-left. 161 NSEvent* native_event = 162 [NSEvent mouseEventWithType:NSLeftMouseDown 163 location:NSMakePoint(10, 15) 164 modifierFlags:0 165 timestamp:[NSDate timeIntervalSinceReferenceDate] 166 windowNumber:[window windowNumber] 167 context:[window graphicsContext] 168 eventNumber:0 169 clickCount:1 170 pressure:0.0f]; 171 172 // Expect resulting event to be positioned relative to top-left. 173 gfx::Point location = ui::EventLocationFromNative(native_event); 174 EXPECT_EQ(gfx::Point(10, 190), location); 175 176 [window orderOut:nil]; 177 [window close]; 178 } 179 180 TEST_F(EventsMacTest, KeyboardCodeFromNative) { 181 NSEvent* native_event = nil; 182 ui::KeyboardCode code = ui::VKEY_UNKNOWN; 183 184 // Simple "x". No modifiers. 185 native_event = 186 [NSEvent keyEventWithType:NSKeyDown 187 location:NSZeroPoint 188 modifierFlags:0 189 timestamp:[NSDate timeIntervalSinceReferenceDate] 190 windowNumber:0 191 context:nil 192 characters:@"x" 193 charactersIgnoringModifiers:@"x" 194 isARepeat:NO 195 keyCode:0x58]; 196 code = ui::KeyboardCodeFromNative(native_event); 197 EXPECT_EQ(ui::VKEY_X, code); 198 199 // Option/Alt "x". 200 native_event = 201 [NSEvent keyEventWithType:NSKeyDown 202 location:NSZeroPoint 203 modifierFlags:NSAlternateKeyMask 204 timestamp:[NSDate timeIntervalSinceReferenceDate] 205 windowNumber:0 206 context:nil 207 characters:@"\0x2248" // opt-x 208 charactersIgnoringModifiers:@"x" 209 isARepeat:NO 210 keyCode:0x58]; 211 code = ui::KeyboardCodeFromNative(native_event); 212 EXPECT_EQ(ui::VKEY_X, code); 213 214 // Option/Alt (alone). 215 native_event = 216 [NSEvent keyEventWithType:NSFlagsChanged 217 location:NSZeroPoint 218 modifierFlags:NSAlternateKeyMask 219 timestamp:[NSDate timeIntervalSinceReferenceDate] 220 windowNumber:0 221 context:nil 222 characters:@"" 223 charactersIgnoringModifiers:@"" 224 isARepeat:NO 225 keyCode:0x3a]; 226 code = ui::KeyboardCodeFromNative(native_event); 227 EXPECT_EQ(ui::VKEY_MENU, code); 228 } 229 230 TEST_F(EventsMacTest, IsMouseEvent) { 231 NSEvent* native_event = nil; 232 233 native_event = MouseEventWithType(NSLeftMouseDown, 0); 234 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 235 236 native_event = MouseEventWithType(NSLeftMouseUp, 0); 237 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 238 239 native_event = MouseEventWithType(NSRightMouseDown, 0); 240 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 241 242 native_event = MouseEventWithType(NSRightMouseUp, 0); 243 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 244 245 native_event = MouseEventWithType(NSMouseMoved, 0); 246 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 247 248 native_event = MouseEventWithType(NSLeftMouseDragged, 0); 249 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 250 251 native_event = MouseEventWithType(NSRightMouseDragged, 0); 252 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 253 254 native_event = EnterExitEventWithType(NSMouseEntered); 255 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 256 257 native_event = EnterExitEventWithType(NSMouseExited); 258 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 259 260 native_event = KeyEventWithType(NSKeyDown, 0); 261 EXPECT_FALSE(ui::IsMouseEvent(native_event)); 262 263 native_event = KeyEventWithType(NSKeyUp, 0); 264 EXPECT_FALSE(ui::IsMouseEvent(native_event)); 265 266 native_event = KeyEventWithType(NSFlagsChanged, 0); 267 EXPECT_FALSE(ui::IsMouseEvent(native_event)); 268 269 native_event = OtherEventWithType(NSAppKitDefined); 270 EXPECT_FALSE(ui::IsMouseEvent(native_event)); 271 272 native_event = OtherEventWithType(NSSystemDefined); 273 EXPECT_FALSE(ui::IsMouseEvent(native_event)); 274 275 native_event = OtherEventWithType(NSApplicationDefined); 276 EXPECT_FALSE(ui::IsMouseEvent(native_event)); 277 278 native_event = OtherEventWithType(NSPeriodic); 279 EXPECT_FALSE(ui::IsMouseEvent(native_event)); 280 281 native_event = EnterExitEventWithType(NSCursorUpdate); 282 EXPECT_FALSE(ui::IsMouseEvent(native_event)); 283 284 native_event = MouseEventWithType(NSOtherMouseDown, 0); 285 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 286 287 native_event = MouseEventWithType(NSOtherMouseUp, 0); 288 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 289 290 native_event = MouseEventWithType(NSOtherMouseDragged, 0); 291 EXPECT_TRUE(ui::IsMouseEvent(native_event)); 292 } 293 294 TEST_F(EventsMacTest, CreateNoopEvent) { 295 NSEvent* native_event = ui::CreateNoopEvent(); 296 EXPECT_TRUE(native_event != nil); 297 } 298 299 } // namespace 300