Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / ui / events / gestures / motion_event_aura_unittest.cc
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.
4
5 // MSVC++ requires this to be set before any other includes to get M_PI.
6 #define _USE_MATH_DEFINES
7
8 #include <cmath>
9
10 #include "testing/gtest/include/gtest/gtest.h"
11 #include "ui/events/event.h"
12 #include "ui/events/gestures/motion_event_aura.h"
13
14 namespace {
15
16 ui::TouchEvent TouchWithType(ui::EventType type, int id) {
17   return ui::TouchEvent(
18       type, gfx::PointF(0, 0), id, base::TimeDelta::FromMilliseconds(0));
19 }
20
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),
29                        0,
30                        id,
31                        base::TimeDelta::FromMilliseconds(0),
32                        0,
33                        0,
34                        0,
35                        0);
36   event.set_root_location(gfx::PointF(raw_x, raw_y));
37   return event;
38 }
39
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),
48                        0,
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;
57 }
58
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));
62 }
63
64 base::TimeTicks MsToTicks(int ms) {
65   return base::TimeTicks() + base::TimeDelta::FromMilliseconds(ms);
66 }
67
68 }  // namespace
69
70 namespace ui {
71
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};
76
77   MotionEventAura event;
78   EXPECT_EQ(0U, event.GetPointerCount());
79
80   TouchEvent press0 = TouchWithType(ET_TOUCH_PRESSED, ids[0]);
81   event.OnTouch(press0);
82   EXPECT_EQ(1U, event.GetPointerCount());
83
84   EXPECT_EQ(ids[0], event.GetPointerId(0));
85
86   TouchEvent press1 = TouchWithType(ET_TOUCH_PRESSED, ids[1]);
87   event.OnTouch(press1);
88   EXPECT_EQ(2U, event.GetPointerCount());
89
90   EXPECT_EQ(ids[0], event.GetPointerId(0));
91   EXPECT_EQ(ids[1], event.GetPointerId(1));
92
93   TouchEvent press2 = TouchWithType(ET_TOUCH_PRESSED, ids[2]);
94   event.OnTouch(press2);
95   EXPECT_EQ(3U, event.GetPointerCount());
96
97   EXPECT_EQ(ids[0], event.GetPointerId(0));
98   EXPECT_EQ(ids[1], event.GetPointerId(1));
99   EXPECT_EQ(ids[2], event.GetPointerId(2));
100
101   TouchEvent release1 = TouchWithType(ET_TOUCH_RELEASED, ids[1]);
102   event.OnTouch(release1);
103   event.CleanupRemovedTouchPoints(release1);
104   EXPECT_EQ(2U, event.GetPointerCount());
105
106   EXPECT_EQ(ids[0], event.GetPointerId(0));
107   EXPECT_EQ(ids[2], event.GetPointerId(1));
108
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));
115
116   TouchEvent release0 = TouchWithType(ET_TOUCH_RELEASED, ids[0]);
117   event.OnTouch(release0);
118   event.CleanupRemovedTouchPoints(release0);
119   EXPECT_EQ(1U, event.GetPointerCount());
120
121   EXPECT_EQ(ids[2], event.GetPointerId(0));
122
123   TouchEvent release2 = TouchWithType(ET_TOUCH_RELEASED, ids[2]);
124   event.OnTouch(release2);
125   event.CleanupRemovedTouchPoints(release2);
126   EXPECT_EQ(0U, event.GetPointerCount());
127 }
128
129 TEST(MotionEventAuraTest, GetActionIndexAfterRemoval) {
130   // Test that |GetActionIndex()| returns the correct index when points have
131   // been removed.
132   int ids[] = {4, 6, 9};
133
134   MotionEventAura event;
135   EXPECT_EQ(0U, event.GetPointerCount());
136
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());
144
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());
150
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());
156
157   TouchEvent release0 = TouchWithType(ET_TOUCH_RELEASED, ids[2]);
158   event.OnTouch(release0);
159   event.CleanupRemovedTouchPoints(release0);
160   EXPECT_EQ(0U, event.GetPointerCount());
161 }
162
163 TEST(MotionEventAuraTest, PointerLocations) {
164   // Test that location information is stored correctly.
165   MotionEventAura event;
166
167   const float kRawOffsetX = 11.1f;
168   const float kRawOffsetY = 13.3f;
169
170   int ids[] = {15, 13};
171   float x;
172   float y;
173   float raw_x;
174   float raw_y;
175
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);
183
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));
189
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);
197
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));
203
204   // Test cloning of pointer location information.
205   scoped_ptr<MotionEvent> clone = event.Clone();
206   {
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));
214   }
215
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);
223
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));
228
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);
236
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));
241 }
242
243 TEST(MotionEventAuraTest, TapParams) {
244   // Test that touch params are stored correctly.
245   MotionEventAura event;
246
247   int ids[] = {15, 13};
248
249   float radius_x;
250   float radius_y;
251   float rotation_angle;
252   float pressure;
253
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);
261
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));
267
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);
275
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));
281
282   // Test cloning of tap params
283   scoped_ptr<MotionEvent> clone = event.Clone();
284   {
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));
293   }
294
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);
302
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));
308 }
309
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};
315
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());
320
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());
325
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());
330
331   // Test cloning of timestamp information.
332   scoped_ptr<MotionEvent> clone = event.Clone();
333   EXPECT_EQ(MsToTicks(times_in_ms[2]), clone->GetEventTime());
334 }
335
336 TEST(MotionEventAuraTest, CachedAction) {
337   // Test that the cached action and cached action index are correct.
338   int ids[] = {4, 6};
339   MotionEventAura event;
340
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());
345
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());
351
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());
356
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());
361
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());
368
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());
375 }
376
377 TEST(MotionEventAuraTest, Cancel) {
378   int ids[] = {4, 6};
379   MotionEventAura event;
380
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());
385
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());
391
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());
395 }
396
397 TEST(MotionEventAuraTest, ToolType) {
398   MotionEventAura event;
399
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));
406 }
407
408 TEST(MotionEventAuraTest, Flags) {
409   int ids[] = {7, 11};
410   MotionEventAura event;
411
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());
416
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());
421 }
422
423 }  // namespace ui