1 // Copyright 2014 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 // MSVC++ requires this to be set before any other includes to get M_PI.
6 #define _USE_MATH_DEFINES
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/events/event.h"
12 #include "ui/events/gestures/motion_event_aura.h"
16 ui::TouchEvent
TouchWithType(ui::EventType type
, int id
) {
17 return ui::TouchEvent(
18 type
, gfx::PointF(0, 0), id
, base::TimeDelta::FromMilliseconds(0));
21 ui::TouchEvent
TouchWithPosition(ui::EventType type
,
27 ui::TouchEvent
event(type
,
31 base::TimeDelta::FromMilliseconds(0),
36 event
.set_root_location(gfx::PointF(raw_x
, raw_y
));
40 ui::TouchEvent
TouchWithTapParams(ui::EventType type
,
46 ui::TouchEvent
event(type
,
50 base::TimeDelta::FromMilliseconds(0),
55 event
.set_root_location(gfx::PointF(1, 1));
59 ui::TouchEvent
TouchWithTime(ui::EventType type
, int id
, int ms
) {
60 return ui::TouchEvent(
61 type
, gfx::PointF(0, 0), id
, base::TimeDelta::FromMilliseconds(ms
));
64 base::TimeTicks
MsToTicks(int ms
) {
65 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(ms
);
72 TEST(MotionEventAuraTest
, PointerCountAndIds
) {
73 // Test that |PointerCount()| returns the correct number of pointers, and ids
74 // are assigned correctly.
75 int ids
[] = {4, 6, 1};
77 MotionEventAura event
;
78 EXPECT_EQ(0U, event
.GetPointerCount());
80 TouchEvent press0
= TouchWithType(ET_TOUCH_PRESSED
, ids
[0]);
81 event
.OnTouch(press0
);
82 EXPECT_EQ(1U, event
.GetPointerCount());
84 EXPECT_EQ(ids
[0], event
.GetPointerId(0));
86 TouchEvent press1
= TouchWithType(ET_TOUCH_PRESSED
, ids
[1]);
87 event
.OnTouch(press1
);
88 EXPECT_EQ(2U, event
.GetPointerCount());
90 EXPECT_EQ(ids
[0], event
.GetPointerId(0));
91 EXPECT_EQ(ids
[1], event
.GetPointerId(1));
93 TouchEvent press2
= TouchWithType(ET_TOUCH_PRESSED
, ids
[2]);
94 event
.OnTouch(press2
);
95 EXPECT_EQ(3U, event
.GetPointerCount());
97 EXPECT_EQ(ids
[0], event
.GetPointerId(0));
98 EXPECT_EQ(ids
[1], event
.GetPointerId(1));
99 EXPECT_EQ(ids
[2], event
.GetPointerId(2));
101 TouchEvent release1
= TouchWithType(ET_TOUCH_RELEASED
, ids
[1]);
102 event
.OnTouch(release1
);
103 event
.CleanupRemovedTouchPoints(release1
);
104 EXPECT_EQ(2U, event
.GetPointerCount());
106 EXPECT_EQ(ids
[0], event
.GetPointerId(0));
107 EXPECT_EQ(ids
[2], event
.GetPointerId(1));
109 // Test cloning of pointer count and id information.
110 // TODO(mustaq): Make a separate clone test
111 scoped_ptr
<MotionEvent
> clone
= event
.Clone();
112 EXPECT_EQ(2U, clone
->GetPointerCount());
113 EXPECT_EQ(ids
[0], clone
->GetPointerId(0));
114 EXPECT_EQ(ids
[2], clone
->GetPointerId(1));
116 TouchEvent release0
= TouchWithType(ET_TOUCH_RELEASED
, ids
[0]);
117 event
.OnTouch(release0
);
118 event
.CleanupRemovedTouchPoints(release0
);
119 EXPECT_EQ(1U, event
.GetPointerCount());
121 EXPECT_EQ(ids
[2], event
.GetPointerId(0));
123 TouchEvent release2
= TouchWithType(ET_TOUCH_RELEASED
, ids
[2]);
124 event
.OnTouch(release2
);
125 event
.CleanupRemovedTouchPoints(release2
);
126 EXPECT_EQ(0U, event
.GetPointerCount());
129 TEST(MotionEventAuraTest
, GetActionIndexAfterRemoval
) {
130 // Test that |GetActionIndex()| returns the correct index when points have
132 int ids
[] = {4, 6, 9};
134 MotionEventAura event
;
135 EXPECT_EQ(0U, event
.GetPointerCount());
137 TouchEvent press0
= TouchWithType(ET_TOUCH_PRESSED
, ids
[0]);
138 event
.OnTouch(press0
);
139 TouchEvent press1
= TouchWithType(ET_TOUCH_PRESSED
, ids
[1]);
140 event
.OnTouch(press1
);
141 TouchEvent press2
= TouchWithType(ET_TOUCH_PRESSED
, ids
[2]);
142 event
.OnTouch(press2
);
143 EXPECT_EQ(3U, event
.GetPointerCount());
145 TouchEvent release1
= TouchWithType(ET_TOUCH_RELEASED
, ids
[1]);
146 event
.OnTouch(release1
);
147 event
.CleanupRemovedTouchPoints(release1
);
148 EXPECT_EQ(1, event
.GetActionIndex());
149 EXPECT_EQ(2U, event
.GetPointerCount());
151 TouchEvent release2
= TouchWithType(ET_TOUCH_RELEASED
, ids
[0]);
152 event
.OnTouch(release2
);
153 event
.CleanupRemovedTouchPoints(release2
);
154 EXPECT_EQ(0, event
.GetActionIndex());
155 EXPECT_EQ(1U, event
.GetPointerCount());
157 TouchEvent release0
= TouchWithType(ET_TOUCH_RELEASED
, ids
[2]);
158 event
.OnTouch(release0
);
159 event
.CleanupRemovedTouchPoints(release0
);
160 EXPECT_EQ(0U, event
.GetPointerCount());
163 TEST(MotionEventAuraTest
, PointerLocations
) {
164 // Test that location information is stored correctly.
165 MotionEventAura event
;
167 const float kRawOffsetX
= 11.1f
;
168 const float kRawOffsetY
= 13.3f
;
170 int ids
[] = {15, 13};
178 raw_x
= x
+ kRawOffsetX
;
179 raw_y
= y
+ kRawOffsetY
;
181 TouchWithPosition(ET_TOUCH_PRESSED
, ids
[0], x
, y
, raw_x
, raw_y
);
182 event
.OnTouch(press0
);
184 EXPECT_EQ(1U, event
.GetPointerCount());
185 EXPECT_FLOAT_EQ(x
, event
.GetX(0));
186 EXPECT_FLOAT_EQ(y
, event
.GetY(0));
187 EXPECT_FLOAT_EQ(raw_x
, event
.GetRawX(0));
188 EXPECT_FLOAT_EQ(raw_y
, event
.GetRawY(0));
192 raw_x
= x
+ kRawOffsetX
;
193 raw_y
= y
+ kRawOffsetY
;
195 TouchWithPosition(ET_TOUCH_PRESSED
, ids
[1], x
, y
, raw_x
, raw_y
);
196 event
.OnTouch(press1
);
198 EXPECT_EQ(2U, event
.GetPointerCount());
199 EXPECT_FLOAT_EQ(x
, event
.GetX(1));
200 EXPECT_FLOAT_EQ(y
, event
.GetY(1));
201 EXPECT_FLOAT_EQ(raw_x
, event
.GetRawX(1));
202 EXPECT_FLOAT_EQ(raw_y
, event
.GetRawY(1));
204 // Test cloning of pointer location information.
205 scoped_ptr
<MotionEvent
> clone
= event
.Clone();
207 const MotionEventAura
* raw_clone_aura
=
208 static_cast<MotionEventAura
*>(clone
.get());
209 EXPECT_EQ(2U, raw_clone_aura
->GetPointerCount());
210 EXPECT_FLOAT_EQ(x
, raw_clone_aura
->GetX(1));
211 EXPECT_FLOAT_EQ(y
, raw_clone_aura
->GetY(1));
212 EXPECT_FLOAT_EQ(raw_x
, raw_clone_aura
->GetRawX(1));
213 EXPECT_FLOAT_EQ(raw_y
, raw_clone_aura
->GetRawY(1));
218 raw_x
= x
+ kRawOffsetX
;
219 raw_y
= y
+ kRawOffsetY
;
221 TouchWithPosition(ET_TOUCH_MOVED
, ids
[1], x
, y
, raw_x
, raw_y
);
222 event
.OnTouch(move1
);
224 EXPECT_FLOAT_EQ(x
, event
.GetX(1));
225 EXPECT_FLOAT_EQ(y
, event
.GetY(1));
226 EXPECT_FLOAT_EQ(raw_x
, event
.GetRawX(1));
227 EXPECT_FLOAT_EQ(raw_y
, event
.GetRawY(1));
231 raw_x
= x
+ kRawOffsetX
;
232 raw_y
= y
+ kRawOffsetY
;
234 TouchWithPosition(ET_TOUCH_MOVED
, ids
[0], x
, y
, raw_x
, raw_y
);
235 event
.OnTouch(move0
);
237 EXPECT_FLOAT_EQ(x
, event
.GetX(0));
238 EXPECT_FLOAT_EQ(y
, event
.GetY(0));
239 EXPECT_FLOAT_EQ(raw_x
, event
.GetRawX(0));
240 EXPECT_FLOAT_EQ(raw_y
, event
.GetRawY(0));
243 TEST(MotionEventAuraTest
, TapParams
) {
244 // Test that touch params are stored correctly.
245 MotionEventAura event
;
247 int ids
[] = {15, 13};
251 float rotation_angle
;
256 rotation_angle
= 23.f
;
258 TouchEvent press0
= TouchWithTapParams(
259 ET_TOUCH_PRESSED
, ids
[0], radius_x
, radius_y
, rotation_angle
, pressure
);
260 event
.OnTouch(press0
);
262 EXPECT_EQ(1U, event
.GetPointerCount());
263 EXPECT_FLOAT_EQ(radius_x
, event
.GetTouchMajor(0) / 2);
264 EXPECT_FLOAT_EQ(radius_y
, event
.GetTouchMinor(0) / 2);
265 EXPECT_FLOAT_EQ(rotation_angle
, event
.GetOrientation(0) * 180 / M_PI
+ 90);
266 EXPECT_FLOAT_EQ(pressure
, event
.GetPressure(0));
270 rotation_angle
= 46.f
;
272 TouchEvent press1
= TouchWithTapParams(
273 ET_TOUCH_PRESSED
, ids
[1], radius_x
, radius_y
, rotation_angle
, pressure
);
274 event
.OnTouch(press1
);
276 EXPECT_EQ(2U, event
.GetPointerCount());
277 EXPECT_FLOAT_EQ(radius_y
, event
.GetTouchMajor(1) / 2);
278 EXPECT_FLOAT_EQ(radius_x
, event
.GetTouchMinor(1) / 2);
279 EXPECT_FLOAT_EQ(rotation_angle
, event
.GetOrientation(1) * 180 / M_PI
);
280 EXPECT_FLOAT_EQ(pressure
, event
.GetPressure(1));
282 // Test cloning of tap params
283 scoped_ptr
<MotionEvent
> clone
= event
.Clone();
285 const MotionEventAura
* raw_clone_aura
=
286 static_cast<MotionEventAura
*>(clone
.get());
287 EXPECT_EQ(2U, raw_clone_aura
->GetPointerCount());
288 EXPECT_FLOAT_EQ(radius_y
, raw_clone_aura
->GetTouchMajor(1) / 2);
289 EXPECT_FLOAT_EQ(radius_x
, raw_clone_aura
->GetTouchMinor(1) / 2);
291 rotation_angle
, raw_clone_aura
->GetOrientation(1) * 180 / M_PI
);
292 EXPECT_FLOAT_EQ(pressure
, raw_clone_aura
->GetPressure(1));
297 rotation_angle
= 64.f
;
299 TouchEvent move1
= TouchWithTapParams(
300 ET_TOUCH_MOVED
, ids
[1], radius_x
, radius_y
, rotation_angle
, pressure
);
301 event
.OnTouch(move1
);
303 EXPECT_EQ(2U, event
.GetPointerCount());
304 EXPECT_FLOAT_EQ(radius_y
, event
.GetTouchMajor(1) / 2);
305 EXPECT_FLOAT_EQ(radius_x
, event
.GetTouchMinor(1) / 2);
306 EXPECT_FLOAT_EQ(rotation_angle
, event
.GetOrientation(1) * 180 / M_PI
);
307 EXPECT_FLOAT_EQ(pressure
, event
.GetPressure(1));
310 TEST(MotionEventAuraTest
, Timestamps
) {
311 // Test that timestamp information is stored and converted correctly.
312 MotionEventAura event
;
314 int times_in_ms
[] = {59436, 60263, 82175};
316 TouchEvent press0
= TouchWithTime(
317 ui::ET_TOUCH_PRESSED
, ids
[0], times_in_ms
[0]);
318 event
.OnTouch(press0
);
319 EXPECT_EQ(MsToTicks(times_in_ms
[0]), event
.GetEventTime());
321 TouchEvent press1
= TouchWithTime(
322 ui::ET_TOUCH_PRESSED
, ids
[1], times_in_ms
[1]);
323 event
.OnTouch(press1
);
324 EXPECT_EQ(MsToTicks(times_in_ms
[1]), event
.GetEventTime());
326 TouchEvent move0
= TouchWithTime(
327 ui::ET_TOUCH_MOVED
, ids
[0], times_in_ms
[2]);
328 event
.OnTouch(move0
);
329 EXPECT_EQ(MsToTicks(times_in_ms
[2]), event
.GetEventTime());
331 // Test cloning of timestamp information.
332 scoped_ptr
<MotionEvent
> clone
= event
.Clone();
333 EXPECT_EQ(MsToTicks(times_in_ms
[2]), clone
->GetEventTime());
336 TEST(MotionEventAuraTest
, CachedAction
) {
337 // Test that the cached action and cached action index are correct.
339 MotionEventAura event
;
341 TouchEvent press0
= TouchWithType(ET_TOUCH_PRESSED
, ids
[0]);
342 event
.OnTouch(press0
);
343 EXPECT_EQ(MotionEvent::ACTION_DOWN
, event
.GetAction());
344 EXPECT_EQ(1U, event
.GetPointerCount());
346 TouchEvent press1
= TouchWithType(ET_TOUCH_PRESSED
, ids
[1]);
347 event
.OnTouch(press1
);
348 EXPECT_EQ(MotionEvent::ACTION_POINTER_DOWN
, event
.GetAction());
349 EXPECT_EQ(1, event
.GetActionIndex());
350 EXPECT_EQ(2U, event
.GetPointerCount());
352 // Test cloning of CachedAction information.
353 scoped_ptr
<MotionEvent
> clone
= event
.Clone();
354 EXPECT_EQ(MotionEvent::ACTION_POINTER_DOWN
, clone
->GetAction());
355 EXPECT_EQ(1, clone
->GetActionIndex());
357 TouchEvent move0
= TouchWithType(ET_TOUCH_MOVED
, ids
[0]);
358 event
.OnTouch(move0
);
359 EXPECT_EQ(MotionEvent::ACTION_MOVE
, event
.GetAction());
360 EXPECT_EQ(2U, event
.GetPointerCount());
362 TouchEvent release0
= TouchWithType(ET_TOUCH_RELEASED
, ids
[0]);
363 event
.OnTouch(release0
);
364 EXPECT_EQ(MotionEvent::ACTION_POINTER_UP
, event
.GetAction());
365 EXPECT_EQ(2U, event
.GetPointerCount());
366 event
.CleanupRemovedTouchPoints(release0
);
367 EXPECT_EQ(1U, event
.GetPointerCount());
369 TouchEvent release1
= TouchWithType(ET_TOUCH_RELEASED
, ids
[1]);
370 event
.OnTouch(release1
);
371 EXPECT_EQ(MotionEvent::ACTION_UP
, event
.GetAction());
372 EXPECT_EQ(1U, event
.GetPointerCount());
373 event
.CleanupRemovedTouchPoints(release1
);
374 EXPECT_EQ(0U, event
.GetPointerCount());
377 TEST(MotionEventAuraTest
, Cancel
) {
379 MotionEventAura event
;
381 TouchEvent press0
= TouchWithType(ET_TOUCH_PRESSED
, ids
[0]);
382 event
.OnTouch(press0
);
383 EXPECT_EQ(MotionEvent::ACTION_DOWN
, event
.GetAction());
384 EXPECT_EQ(1U, event
.GetPointerCount());
386 TouchEvent press1
= TouchWithType(ET_TOUCH_PRESSED
, ids
[1]);
387 event
.OnTouch(press1
);
388 EXPECT_EQ(MotionEvent::ACTION_POINTER_DOWN
, event
.GetAction());
389 EXPECT_EQ(1, event
.GetActionIndex());
390 EXPECT_EQ(2U, event
.GetPointerCount());
392 scoped_ptr
<MotionEvent
> cancel
= event
.Cancel();
393 EXPECT_EQ(MotionEvent::ACTION_CANCEL
, cancel
->GetAction());
394 EXPECT_EQ(2U, static_cast<MotionEventAura
*>(cancel
.get())->GetPointerCount());
397 TEST(MotionEventAuraTest
, ToolType
) {
398 MotionEventAura event
;
400 // For now, all pointers have an unknown tool type.
401 // TODO(jdduke): Expand this test when ui::TouchEvent identifies the source
402 // touch type, crbug.com/404128.
403 event
.OnTouch(TouchWithType(ET_TOUCH_PRESSED
, 7));
404 ASSERT_EQ(1U, event
.GetPointerCount());
405 EXPECT_EQ(MotionEvent::TOOL_TYPE_UNKNOWN
, event
.GetToolType(0));
408 TEST(MotionEventAuraTest
, Flags
) {
410 MotionEventAura event
;
412 TouchEvent press0
= TouchWithType(ET_TOUCH_PRESSED
, ids
[0]);
413 press0
.set_flags(EF_CONTROL_DOWN
);
414 event
.OnTouch(press0
);
415 EXPECT_EQ(EF_CONTROL_DOWN
, event
.GetFlags());
417 TouchEvent press1
= TouchWithType(ET_TOUCH_PRESSED
, ids
[1]);
418 press1
.set_flags(EF_CONTROL_DOWN
| EF_CAPS_LOCK_DOWN
);
419 event
.OnTouch(press1
);
420 EXPECT_EQ(EF_CONTROL_DOWN
| EF_CAPS_LOCK_DOWN
, event
.GetFlags());