Explicitly add python-numpy dependency to install-build-deps.
[chromium-blink-merge.git] / ui / events / gestures / motion_event_aura_unittest.cc
blobd1fdadf906fc452ab97db0874a618c3baa991d3c
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
8 #include <cmath>
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/events/event.h"
12 #include "ui/events/gestures/motion_event_aura.h"
13 #include "ui/events/test/motion_event_test_utils.h"
15 namespace {
17 ui::TouchEvent TouchWithType(ui::EventType type, int id) {
18 return ui::TouchEvent(
19 type, gfx::PointF(0, 0), id, base::TimeDelta::FromMilliseconds(0));
22 ui::TouchEvent TouchWithPosition(ui::EventType type,
23 int id,
24 float x,
25 float y,
26 float raw_x,
27 float raw_y) {
28 ui::TouchEvent event(type,
29 gfx::PointF(x, y),
31 id,
32 base::TimeDelta::FromMilliseconds(0),
36 0);
37 event.set_root_location(gfx::PointF(raw_x, raw_y));
38 return event;
41 ui::TouchEvent TouchWithTapParams(ui::EventType type,
42 int id,
43 float radius_x,
44 float radius_y,
45 float rotation_angle,
46 float pressure) {
47 ui::TouchEvent event(type,
48 gfx::PointF(1, 1),
50 id,
51 base::TimeDelta::FromMilliseconds(0),
52 radius_x,
53 radius_y,
54 rotation_angle,
55 pressure);
56 event.set_root_location(gfx::PointF(1, 1));
57 return event;
60 ui::TouchEvent TouchWithTime(ui::EventType type, int id, int ms) {
61 return ui::TouchEvent(
62 type, gfx::PointF(0, 0), id, base::TimeDelta::FromMilliseconds(ms));
65 base::TimeTicks MsToTicks(int ms) {
66 return base::TimeTicks() + base::TimeDelta::FromMilliseconds(ms);
69 } // namespace
71 namespace ui {
73 TEST(MotionEventAuraTest, PointerCountAndIds) {
74 // Test that |PointerCount()| returns the correct number of pointers, and ids
75 // are assigned correctly.
76 int ids[] = {4, 6, 1};
78 MotionEventAura event;
79 EXPECT_EQ(0U, event.GetPointerCount());
81 TouchEvent press0 = TouchWithType(ET_TOUCH_PRESSED, ids[0]);
82 event.OnTouch(press0);
83 EXPECT_EQ(1U, event.GetPointerCount());
85 EXPECT_EQ(ids[0], event.GetPointerId(0));
87 TouchEvent press1 = TouchWithType(ET_TOUCH_PRESSED, ids[1]);
88 event.OnTouch(press1);
89 EXPECT_EQ(2U, event.GetPointerCount());
91 EXPECT_EQ(ids[0], event.GetPointerId(0));
92 EXPECT_EQ(ids[1], event.GetPointerId(1));
94 TouchEvent press2 = TouchWithType(ET_TOUCH_PRESSED, ids[2]);
95 event.OnTouch(press2);
96 EXPECT_EQ(3U, event.GetPointerCount());
98 EXPECT_EQ(ids[0], event.GetPointerId(0));
99 EXPECT_EQ(ids[1], event.GetPointerId(1));
100 EXPECT_EQ(ids[2], event.GetPointerId(2));
102 TouchEvent release1 = TouchWithType(ET_TOUCH_RELEASED, ids[1]);
103 event.OnTouch(release1);
104 event.CleanupRemovedTouchPoints(release1);
105 EXPECT_EQ(2U, event.GetPointerCount());
107 EXPECT_EQ(ids[0], event.GetPointerId(0));
108 EXPECT_EQ(ids[2], event.GetPointerId(1));
110 // Test cloning of pointer count and id information.
111 // TODO(mustaq): Make a separate clone test
112 scoped_ptr<MotionEvent> clone = event.Clone();
113 EXPECT_EQ(2U, clone->GetPointerCount());
114 EXPECT_EQ(ids[0], clone->GetPointerId(0));
115 EXPECT_EQ(ids[2], clone->GetPointerId(1));
116 EXPECT_EQ(test::ToString(event), test::ToString(*clone));
118 TouchEvent release0 = TouchWithType(ET_TOUCH_RELEASED, ids[0]);
119 event.OnTouch(release0);
120 event.CleanupRemovedTouchPoints(release0);
121 EXPECT_EQ(1U, event.GetPointerCount());
123 EXPECT_EQ(ids[2], event.GetPointerId(0));
125 TouchEvent release2 = TouchWithType(ET_TOUCH_RELEASED, ids[2]);
126 event.OnTouch(release2);
127 event.CleanupRemovedTouchPoints(release2);
128 EXPECT_EQ(0U, event.GetPointerCount());
131 TEST(MotionEventAuraTest, GetActionIndexAfterRemoval) {
132 // Test that |GetActionIndex()| returns the correct index when points have
133 // been removed.
134 int ids[] = {4, 6, 9};
136 MotionEventAura event;
137 EXPECT_EQ(0U, event.GetPointerCount());
139 TouchEvent press0 = TouchWithType(ET_TOUCH_PRESSED, ids[0]);
140 event.OnTouch(press0);
141 TouchEvent press1 = TouchWithType(ET_TOUCH_PRESSED, ids[1]);
142 event.OnTouch(press1);
143 EXPECT_EQ(1, event.GetActionIndex());
144 TouchEvent press2 = TouchWithType(ET_TOUCH_PRESSED, ids[2]);
145 event.OnTouch(press2);
146 EXPECT_EQ(2, event.GetActionIndex());
147 EXPECT_EQ(3U, event.GetPointerCount());
149 TouchEvent release1 = TouchWithType(ET_TOUCH_RELEASED, ids[1]);
150 event.OnTouch(release1);
151 EXPECT_EQ(1, event.GetActionIndex());
152 event.CleanupRemovedTouchPoints(release1);
153 EXPECT_EQ(2U, event.GetPointerCount());
155 TouchEvent release2 = TouchWithType(ET_TOUCH_RELEASED, ids[0]);
156 event.OnTouch(release2);
157 EXPECT_EQ(0, event.GetActionIndex());
158 event.CleanupRemovedTouchPoints(release2);
159 EXPECT_EQ(1U, event.GetPointerCount());
161 TouchEvent release0 = TouchWithType(ET_TOUCH_RELEASED, ids[2]);
162 event.OnTouch(release0);
163 event.CleanupRemovedTouchPoints(release0);
164 EXPECT_EQ(0U, event.GetPointerCount());
167 TEST(MotionEventAuraTest, PointerLocations) {
168 // Test that location information is stored correctly.
169 MotionEventAura event;
171 const float kRawOffsetX = 11.1f;
172 const float kRawOffsetY = 13.3f;
174 int ids[] = {15, 13};
175 float x;
176 float y;
177 float raw_x;
178 float raw_y;
180 x = 14.4f;
181 y = 17.3f;
182 raw_x = x + kRawOffsetX;
183 raw_y = y + kRawOffsetY;
184 TouchEvent press0 =
185 TouchWithPosition(ET_TOUCH_PRESSED, ids[0], x, y, raw_x, raw_y);
186 event.OnTouch(press0);
188 EXPECT_EQ(1U, event.GetPointerCount());
189 EXPECT_FLOAT_EQ(x, event.GetX(0));
190 EXPECT_FLOAT_EQ(y, event.GetY(0));
191 EXPECT_FLOAT_EQ(raw_x, event.GetRawX(0));
192 EXPECT_FLOAT_EQ(raw_y, event.GetRawY(0));
194 x = 17.8f;
195 y = 12.1f;
196 raw_x = x + kRawOffsetX;
197 raw_y = y + kRawOffsetY;
198 TouchEvent press1 =
199 TouchWithPosition(ET_TOUCH_PRESSED, ids[1], x, y, raw_x, raw_y);
200 event.OnTouch(press1);
202 EXPECT_EQ(2U, event.GetPointerCount());
203 EXPECT_FLOAT_EQ(x, event.GetX(1));
204 EXPECT_FLOAT_EQ(y, event.GetY(1));
205 EXPECT_FLOAT_EQ(raw_x, event.GetRawX(1));
206 EXPECT_FLOAT_EQ(raw_y, event.GetRawY(1));
208 // Test cloning of pointer location information.
209 scoped_ptr<MotionEvent> clone = event.Clone();
211 EXPECT_EQ(test::ToString(event), test::ToString(*clone));
212 EXPECT_EQ(2U, clone->GetPointerCount());
213 EXPECT_FLOAT_EQ(x, clone->GetX(1));
214 EXPECT_FLOAT_EQ(y, clone->GetY(1));
215 EXPECT_FLOAT_EQ(raw_x, clone->GetRawX(1));
216 EXPECT_FLOAT_EQ(raw_y, clone->GetRawY(1));
219 x = 27.9f;
220 y = 22.3f;
221 raw_x = x + kRawOffsetX;
222 raw_y = y + kRawOffsetY;
223 TouchEvent move1 =
224 TouchWithPosition(ET_TOUCH_MOVED, ids[1], x, y, raw_x, raw_y);
225 event.OnTouch(move1);
227 EXPECT_FLOAT_EQ(x, event.GetX(1));
228 EXPECT_FLOAT_EQ(y, event.GetY(1));
229 EXPECT_FLOAT_EQ(raw_x, event.GetRawX(1));
230 EXPECT_FLOAT_EQ(raw_y, event.GetRawY(1));
232 x = 34.6f;
233 y = 23.8f;
234 raw_x = x + kRawOffsetX;
235 raw_y = y + kRawOffsetY;
236 TouchEvent move0 =
237 TouchWithPosition(ET_TOUCH_MOVED, ids[0], x, y, raw_x, raw_y);
238 event.OnTouch(move0);
240 EXPECT_FLOAT_EQ(x, event.GetX(0));
241 EXPECT_FLOAT_EQ(y, event.GetY(0));
242 EXPECT_FLOAT_EQ(raw_x, event.GetRawX(0));
243 EXPECT_FLOAT_EQ(raw_y, event.GetRawY(0));
246 TEST(MotionEventAuraTest, TapParams) {
247 // Test that touch params are stored correctly.
248 MotionEventAura event;
250 int ids[] = {15, 13};
252 float radius_x;
253 float radius_y;
254 float rotation_angle;
255 float pressure;
257 radius_x = 123.45f;
258 radius_y = 67.89f;
259 rotation_angle = 23.f;
260 pressure = 0.123f;
261 TouchEvent press0 = TouchWithTapParams(
262 ET_TOUCH_PRESSED, ids[0], radius_x, radius_y, rotation_angle, pressure);
263 event.OnTouch(press0);
265 EXPECT_EQ(1U, event.GetPointerCount());
266 EXPECT_FLOAT_EQ(radius_x, event.GetTouchMajor(0) / 2);
267 EXPECT_FLOAT_EQ(radius_y, event.GetTouchMinor(0) / 2);
268 EXPECT_FLOAT_EQ(rotation_angle, event.GetOrientation(0) * 180 / M_PI + 90);
269 EXPECT_FLOAT_EQ(pressure, event.GetPressure(0));
271 radius_x = 67.89f;
272 radius_y = 123.45f;
273 rotation_angle = 46.f;
274 pressure = 0.456f;
275 TouchEvent press1 = TouchWithTapParams(
276 ET_TOUCH_PRESSED, ids[1], radius_x, radius_y, rotation_angle, pressure);
277 event.OnTouch(press1);
279 EXPECT_EQ(2U, event.GetPointerCount());
280 EXPECT_FLOAT_EQ(radius_y, event.GetTouchMajor(1) / 2);
281 EXPECT_FLOAT_EQ(radius_x, event.GetTouchMinor(1) / 2);
282 EXPECT_FLOAT_EQ(rotation_angle, event.GetOrientation(1) * 180 / M_PI);
283 EXPECT_FLOAT_EQ(pressure, event.GetPressure(1));
285 // Test cloning of tap params
286 scoped_ptr<MotionEvent> clone = event.Clone();
288 EXPECT_EQ(test::ToString(event), test::ToString(*clone));
289 EXPECT_EQ(2U, clone->GetPointerCount());
290 EXPECT_FLOAT_EQ(radius_y, clone->GetTouchMajor(1) / 2);
291 EXPECT_FLOAT_EQ(radius_x, clone->GetTouchMinor(1) / 2);
292 EXPECT_FLOAT_EQ(rotation_angle, clone->GetOrientation(1) * 180 / M_PI);
293 EXPECT_FLOAT_EQ(pressure, clone->GetPressure(1));
296 radius_x = 76.98f;
297 radius_y = 321.54f;
298 rotation_angle = 64.f;
299 pressure = 0.654f;
300 TouchEvent move1 = TouchWithTapParams(
301 ET_TOUCH_MOVED, ids[1], radius_x, radius_y, rotation_angle, pressure);
302 event.OnTouch(move1);
304 EXPECT_EQ(2U, event.GetPointerCount());
305 EXPECT_FLOAT_EQ(radius_y, event.GetTouchMajor(1) / 2);
306 EXPECT_FLOAT_EQ(radius_x, event.GetTouchMinor(1) / 2);
307 EXPECT_FLOAT_EQ(rotation_angle, event.GetOrientation(1) * 180 / M_PI);
308 EXPECT_FLOAT_EQ(pressure, event.GetPressure(1));
311 TEST(MotionEventAuraTest, Timestamps) {
312 // Test that timestamp information is stored and converted correctly.
313 MotionEventAura event;
314 int ids[] = {7, 13};
315 int times_in_ms[] = {59436, 60263, 82175};
317 TouchEvent press0 = TouchWithTime(
318 ui::ET_TOUCH_PRESSED, ids[0], times_in_ms[0]);
319 event.OnTouch(press0);
320 EXPECT_EQ(MsToTicks(times_in_ms[0]), event.GetEventTime());
322 TouchEvent press1 = TouchWithTime(
323 ui::ET_TOUCH_PRESSED, ids[1], times_in_ms[1]);
324 event.OnTouch(press1);
325 EXPECT_EQ(MsToTicks(times_in_ms[1]), event.GetEventTime());
327 TouchEvent move0 = TouchWithTime(
328 ui::ET_TOUCH_MOVED, ids[0], times_in_ms[2]);
329 event.OnTouch(move0);
330 EXPECT_EQ(MsToTicks(times_in_ms[2]), event.GetEventTime());
332 // Test cloning of timestamp information.
333 scoped_ptr<MotionEvent> clone = event.Clone();
334 EXPECT_EQ(MsToTicks(times_in_ms[2]), clone->GetEventTime());
337 TEST(MotionEventAuraTest, CachedAction) {
338 // Test that the cached action and cached action index are correct.
339 int ids[] = {4, 6};
340 MotionEventAura event;
342 TouchEvent press0 = TouchWithType(ET_TOUCH_PRESSED, ids[0]);
343 event.OnTouch(press0);
344 EXPECT_EQ(MotionEvent::ACTION_DOWN, event.GetAction());
345 EXPECT_EQ(1U, event.GetPointerCount());
347 TouchEvent press1 = TouchWithType(ET_TOUCH_PRESSED, ids[1]);
348 event.OnTouch(press1);
349 EXPECT_EQ(MotionEvent::ACTION_POINTER_DOWN, event.GetAction());
350 EXPECT_EQ(1, event.GetActionIndex());
351 EXPECT_EQ(2U, event.GetPointerCount());
353 // Test cloning of CachedAction information.
354 scoped_ptr<MotionEvent> clone = event.Clone();
355 EXPECT_EQ(MotionEvent::ACTION_POINTER_DOWN, clone->GetAction());
356 EXPECT_EQ(1, clone->GetActionIndex());
358 TouchEvent move0 = TouchWithType(ET_TOUCH_MOVED, ids[0]);
359 event.OnTouch(move0);
360 EXPECT_EQ(MotionEvent::ACTION_MOVE, event.GetAction());
361 EXPECT_EQ(2U, event.GetPointerCount());
363 TouchEvent release0 = TouchWithType(ET_TOUCH_RELEASED, ids[0]);
364 event.OnTouch(release0);
365 EXPECT_EQ(MotionEvent::ACTION_POINTER_UP, event.GetAction());
366 EXPECT_EQ(2U, event.GetPointerCount());
367 event.CleanupRemovedTouchPoints(release0);
368 EXPECT_EQ(1U, event.GetPointerCount());
370 TouchEvent release1 = TouchWithType(ET_TOUCH_RELEASED, ids[1]);
371 event.OnTouch(release1);
372 EXPECT_EQ(MotionEvent::ACTION_UP, event.GetAction());
373 EXPECT_EQ(1U, event.GetPointerCount());
374 event.CleanupRemovedTouchPoints(release1);
375 EXPECT_EQ(0U, event.GetPointerCount());
378 TEST(MotionEventAuraTest, Cancel) {
379 int ids[] = {4, 6};
380 MotionEventAura event;
382 TouchEvent press0 = TouchWithType(ET_TOUCH_PRESSED, ids[0]);
383 event.OnTouch(press0);
384 EXPECT_EQ(MotionEvent::ACTION_DOWN, event.GetAction());
385 EXPECT_EQ(1U, event.GetPointerCount());
387 TouchEvent press1 = TouchWithType(ET_TOUCH_PRESSED, ids[1]);
388 event.OnTouch(press1);
389 EXPECT_EQ(MotionEvent::ACTION_POINTER_DOWN, event.GetAction());
390 EXPECT_EQ(1, event.GetActionIndex());
391 EXPECT_EQ(2U, event.GetPointerCount());
393 scoped_ptr<MotionEvent> cancel = event.Cancel();
394 EXPECT_EQ(MotionEvent::ACTION_CANCEL, cancel->GetAction());
395 EXPECT_EQ(2U, cancel->GetPointerCount());
398 TEST(MotionEventAuraTest, ToolType) {
399 MotionEventAura event;
401 // For now, all pointers have an unknown tool type.
402 // TODO(jdduke): Expand this test when ui::TouchEvent identifies the source
403 // touch type, crbug.com/404128.
404 event.OnTouch(TouchWithType(ET_TOUCH_PRESSED, 7));
405 ASSERT_EQ(1U, event.GetPointerCount());
406 EXPECT_EQ(MotionEvent::TOOL_TYPE_UNKNOWN, event.GetToolType(0));
409 TEST(MotionEventAuraTest, Flags) {
410 int ids[] = {7, 11};
411 MotionEventAura event;
413 TouchEvent press0 = TouchWithType(ET_TOUCH_PRESSED, ids[0]);
414 press0.set_flags(EF_CONTROL_DOWN);
415 event.OnTouch(press0);
416 EXPECT_EQ(EF_CONTROL_DOWN, event.GetFlags());
418 TouchEvent press1 = TouchWithType(ET_TOUCH_PRESSED, ids[1]);
419 press1.set_flags(EF_CONTROL_DOWN | EF_CAPS_LOCK_DOWN);
420 event.OnTouch(press1);
421 EXPECT_EQ(EF_CONTROL_DOWN | EF_CAPS_LOCK_DOWN, event.GetFlags());
424 } // namespace ui