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.
5 #import <Cocoa/Cocoa.h>
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"
14 using namespace cocoa_test_event_utils;
18 class EventsMacTest : public ui::CocoaTest {
23 DISALLOW_COPY_AND_ASSIGN(EventsMacTest);
26 TEST_F(EventsMacTest, EventTypeFromNative) {
27 NSEvent* native_event = nil;
28 ui::EventType type = ui::ET_UNKNOWN;
30 native_event = MouseEventWithType(NSLeftMouseDown, 0);
31 type = ui::EventTypeFromNative(native_event);
32 EXPECT_EQ(ui::ET_MOUSE_PRESSED, type);
34 native_event = MouseEventWithType(NSLeftMouseUp, 0);
35 type = ui::EventTypeFromNative(native_event);
36 EXPECT_EQ(ui::ET_MOUSE_RELEASED, type);
38 native_event = MouseEventWithType(NSRightMouseDown, 0);
39 type = ui::EventTypeFromNative(native_event);
40 EXPECT_EQ(ui::ET_MOUSE_PRESSED, type);
42 native_event = MouseEventWithType(NSRightMouseUp, 0);
43 type = ui::EventTypeFromNative(native_event);
44 EXPECT_EQ(ui::ET_MOUSE_RELEASED, type);
46 native_event = MouseEventWithType(NSMouseMoved, 0);
47 type = ui::EventTypeFromNative(native_event);
48 EXPECT_EQ(ui::ET_MOUSE_MOVED, type);
50 native_event = MouseEventWithType(NSLeftMouseDragged, 0);
51 type = ui::EventTypeFromNative(native_event);
52 EXPECT_EQ(ui::ET_MOUSE_DRAGGED, type);
54 native_event = MouseEventWithType(NSRightMouseDragged, 0);
55 type = ui::EventTypeFromNative(native_event);
56 EXPECT_EQ(ui::ET_MOUSE_DRAGGED, type);
58 native_event = EnterExitEventWithType(NSMouseEntered);
59 type = ui::EventTypeFromNative(native_event);
60 EXPECT_EQ(ui::ET_MOUSE_ENTERED, type);
62 native_event = EnterExitEventWithType(NSMouseExited);
63 type = ui::EventTypeFromNative(native_event);
64 EXPECT_EQ(ui::ET_MOUSE_EXITED, type);
66 native_event = KeyEventWithType(NSKeyDown, 0);
67 type = ui::EventTypeFromNative(native_event);
68 EXPECT_EQ(ui::ET_KEY_PRESSED, type);
70 native_event = KeyEventWithType(NSKeyUp, 0);
71 type = ui::EventTypeFromNative(native_event);
72 EXPECT_EQ(ui::ET_KEY_RELEASED, type);
74 native_event = KeyEventWithType(NSFlagsChanged, 0);
75 type = ui::EventTypeFromNative(native_event);
76 EXPECT_EQ(ui::ET_KEY_PRESSED, type);
78 native_event = OtherEventWithType(NSAppKitDefined);
79 type = ui::EventTypeFromNative(native_event);
80 EXPECT_EQ(ui::ET_UNKNOWN, type);
82 native_event = OtherEventWithType(NSSystemDefined);
83 type = ui::EventTypeFromNative(native_event);
84 EXPECT_EQ(ui::ET_UNKNOWN, type);
86 native_event = OtherEventWithType(NSApplicationDefined);
87 type = ui::EventTypeFromNative(native_event);
88 EXPECT_EQ(ui::ET_UNKNOWN, type);
90 native_event = OtherEventWithType(NSPeriodic);
91 type = ui::EventTypeFromNative(native_event);
92 EXPECT_EQ(ui::ET_UNKNOWN, type);
94 native_event = EnterExitEventWithType(NSCursorUpdate);
95 type = ui::EventTypeFromNative(native_event);
96 EXPECT_EQ(ui::ET_UNKNOWN, type);
98 native_event = MouseEventWithType(NSOtherMouseDown, 0);
99 type = ui::EventTypeFromNative(native_event);
100 EXPECT_EQ(ui::ET_MOUSE_PRESSED, type);
102 native_event = MouseEventWithType(NSOtherMouseUp, 0);
103 type = ui::EventTypeFromNative(native_event);
104 EXPECT_EQ(ui::ET_MOUSE_RELEASED, type);
106 native_event = MouseEventWithType(NSOtherMouseDragged, 0);
107 type = ui::EventTypeFromNative(native_event);
108 EXPECT_EQ(ui::ET_MOUSE_DRAGGED, type);
111 TEST_F(EventsMacTest, EventFlagsFromNative) {
112 NSEvent* native_event = nil;
116 native_event = KeyEventWithType(NSKeyDown, 0);
117 flags = ui::EventFlagsFromNative(native_event);
121 native_event = KeyEventWithType(NSKeyDown,
122 NSAlphaShiftKeyMask |
127 flags = ui::EventFlagsFromNative(native_event);
128 EXPECT_EQ(ui::EF_CAPS_LOCK_DOWN |
130 ui::EF_CONTROL_DOWN |
136 native_event = MouseEventWithType(NSLeftMouseDown, 0);
137 flags = ui::EventFlagsFromNative(native_event);
138 EXPECT_EQ(ui::EF_LEFT_MOUSE_BUTTON, flags);
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);
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);
151 TEST_F(EventsMacTest, EventLocationFromNative) {
152 NSWindow* window = [[NSWindow alloc]
153 initWithContentRect:NSMakeRect(10, 25, 200, 205)
154 styleMask:NSTitledWindowMask
155 backing:NSBackingStoreBuffered
157 [window orderFront:nil];
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)
165 timestamp:[NSDate timeIntervalSinceReferenceDate]
166 windowNumber:[window windowNumber]
167 context:[window graphicsContext]
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);
176 [window orderOut:nil];
180 TEST_F(EventsMacTest, KeyboardCodeFromNative) {
181 NSEvent* native_event = nil;
182 ui::KeyboardCode code = ui::VKEY_UNKNOWN;
184 // Simple "x". No modifiers.
186 [NSEvent keyEventWithType:NSKeyDown
189 timestamp:[NSDate timeIntervalSinceReferenceDate]
193 charactersIgnoringModifiers:@"x"
196 code = ui::KeyboardCodeFromNative(native_event);
197 EXPECT_EQ(ui::VKEY_X, code);
201 [NSEvent keyEventWithType:NSKeyDown
203 modifierFlags:NSAlternateKeyMask
204 timestamp:[NSDate timeIntervalSinceReferenceDate]
207 characters:@"\0x2248" // opt-x
208 charactersIgnoringModifiers:@"x"
211 code = ui::KeyboardCodeFromNative(native_event);
212 EXPECT_EQ(ui::VKEY_X, code);
214 // Option/Alt (alone).
216 [NSEvent keyEventWithType:NSFlagsChanged
218 modifierFlags:NSAlternateKeyMask
219 timestamp:[NSDate timeIntervalSinceReferenceDate]
223 charactersIgnoringModifiers:@""
226 code = ui::KeyboardCodeFromNative(native_event);
227 EXPECT_EQ(ui::VKEY_MENU, code);
230 TEST_F(EventsMacTest, IsMouseEvent) {
231 NSEvent* native_event = nil;
233 native_event = MouseEventWithType(NSLeftMouseDown, 0);
234 EXPECT_TRUE(ui::IsMouseEvent(native_event));
236 native_event = MouseEventWithType(NSLeftMouseUp, 0);
237 EXPECT_TRUE(ui::IsMouseEvent(native_event));
239 native_event = MouseEventWithType(NSRightMouseDown, 0);
240 EXPECT_TRUE(ui::IsMouseEvent(native_event));
242 native_event = MouseEventWithType(NSRightMouseUp, 0);
243 EXPECT_TRUE(ui::IsMouseEvent(native_event));
245 native_event = MouseEventWithType(NSMouseMoved, 0);
246 EXPECT_TRUE(ui::IsMouseEvent(native_event));
248 native_event = MouseEventWithType(NSLeftMouseDragged, 0);
249 EXPECT_TRUE(ui::IsMouseEvent(native_event));
251 native_event = MouseEventWithType(NSRightMouseDragged, 0);
252 EXPECT_TRUE(ui::IsMouseEvent(native_event));
254 native_event = EnterExitEventWithType(NSMouseEntered);
255 EXPECT_TRUE(ui::IsMouseEvent(native_event));
257 native_event = EnterExitEventWithType(NSMouseExited);
258 EXPECT_TRUE(ui::IsMouseEvent(native_event));
260 native_event = KeyEventWithType(NSKeyDown, 0);
261 EXPECT_FALSE(ui::IsMouseEvent(native_event));
263 native_event = KeyEventWithType(NSKeyUp, 0);
264 EXPECT_FALSE(ui::IsMouseEvent(native_event));
266 native_event = KeyEventWithType(NSFlagsChanged, 0);
267 EXPECT_FALSE(ui::IsMouseEvent(native_event));
269 native_event = OtherEventWithType(NSAppKitDefined);
270 EXPECT_FALSE(ui::IsMouseEvent(native_event));
272 native_event = OtherEventWithType(NSSystemDefined);
273 EXPECT_FALSE(ui::IsMouseEvent(native_event));
275 native_event = OtherEventWithType(NSApplicationDefined);
276 EXPECT_FALSE(ui::IsMouseEvent(native_event));
278 native_event = OtherEventWithType(NSPeriodic);
279 EXPECT_FALSE(ui::IsMouseEvent(native_event));
281 native_event = EnterExitEventWithType(NSCursorUpdate);
282 EXPECT_FALSE(ui::IsMouseEvent(native_event));
284 native_event = MouseEventWithType(NSOtherMouseDown, 0);
285 EXPECT_TRUE(ui::IsMouseEvent(native_event));
287 native_event = MouseEventWithType(NSOtherMouseUp, 0);
288 EXPECT_TRUE(ui::IsMouseEvent(native_event));
290 native_event = MouseEventWithType(NSOtherMouseDragged, 0);
291 EXPECT_TRUE(ui::IsMouseEvent(native_event));
294 TEST_F(EventsMacTest, CreateNoopEvent) {
295 NSEvent* native_event = ui::CreateNoopEvent();
296 EXPECT_TRUE(native_event != nil);