Chromecast: extracts Linux window creation code to a common place.
[chromium-blink-merge.git] / ui / events / gestures / motion_event_aura_unittest.cc
blob6e645dc6ff306dca7a5adb07749c01673bf225c2
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"
14 namespace {
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,
22 int id,
23 float x,
24 float y,
25 float raw_x,
26 float raw_y) {
27 ui::TouchEvent event(type,
28 gfx::PointF(x, y),
30 id,
31 base::TimeDelta::FromMilliseconds(0),
35 0);
36 event.set_root_location(gfx::PointF(raw_x, raw_y));
37 return event;
40 ui::TouchEvent TouchWithTapParams(ui::EventType type,
41 int id,
42 float radius_x,
43 float radius_y,
44 float rotation_angle,
45 float pressure) {
46 ui::TouchEvent event(type,
47 gfx::PointF(1, 1),
49 id,
50 base::TimeDelta::FromMilliseconds(0),
51 radius_x,
52 radius_y,
53 rotation_angle,
54 pressure);
55 event.set_root_location(gfx::PointF(1, 1));
56 return event;
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);
68 } // namespace
70 namespace ui {
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
131 // been removed.
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};
171 float x;
172 float y;
173 float raw_x;
174 float raw_y;
176 x = 14.4f;
177 y = 17.3f;
178 raw_x = x + kRawOffsetX;
179 raw_y = y + kRawOffsetY;
180 TouchEvent press0 =
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));
190 x = 17.8f;
191 y = 12.1f;
192 raw_x = x + kRawOffsetX;
193 raw_y = y + kRawOffsetY;
194 TouchEvent press1 =
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));
216 x = 27.9f;
217 y = 22.3f;
218 raw_x = x + kRawOffsetX;
219 raw_y = y + kRawOffsetY;
220 TouchEvent move1 =
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));
229 x = 34.6f;
230 y = 23.8f;
231 raw_x = x + kRawOffsetX;
232 raw_y = y + kRawOffsetY;
233 TouchEvent move0 =
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};
249 float radius_x;
250 float radius_y;
251 float rotation_angle;
252 float pressure;
254 radius_x = 123.45f;
255 radius_y = 67.89f;
256 rotation_angle = 23.f;
257 pressure = 0.123f;
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));
268 radius_x = 67.89f;
269 radius_y = 123.45f;
270 rotation_angle = 46.f;
271 pressure = 0.456f;
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);
290 EXPECT_FLOAT_EQ(
291 rotation_angle, raw_clone_aura->GetOrientation(1) * 180 / M_PI);
292 EXPECT_FLOAT_EQ(pressure, raw_clone_aura->GetPressure(1));
295 radius_x = 76.98f;
296 radius_y = 321.54f;
297 rotation_angle = 64.f;
298 pressure = 0.654f;
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;
313 int ids[] = {7, 13};
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.
338 int ids[] = {4, 6};
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) {
378 int ids[] = {4, 6};
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) {
409 int ids[] = {7, 11};
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());
423 } // namespace ui