touch_disposition_gesture_filter_unittest.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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#include "base/basictypes.h"
6#include "base/memory/scoped_ptr.h"
7#include "testing/gtest/include/gtest/gtest.h"
8#include "ui/events/gesture_detection/mock_motion_event.h"
9#include "ui/events/gesture_detection/touch_disposition_gesture_filter.h"
10
11namespace ui {
12
13class TouchDispositionGestureFilterTest
14    : public testing::Test,
15      public TouchDispositionGestureFilterClient {
16 public:
17  TouchDispositionGestureFilterTest() : sent_gesture_count_(0) {}
18  virtual ~TouchDispositionGestureFilterTest() {}
19
20  // testing::Test
21  virtual void SetUp() OVERRIDE {
22    queue_.reset(new TouchDispositionGestureFilter(this));
23  }
24
25  virtual void TearDown() OVERRIDE {
26    queue_.reset();
27  }
28
29  // TouchDispositionGestureFilterClient
30  virtual void ForwardGestureEvent(const GestureEventData& event) OVERRIDE {
31    ++sent_gesture_count_;
32    sent_gestures_.push_back(event.type);
33  }
34
35 protected:
36  typedef std::vector<EventType> GestureList;
37
38  ::testing::AssertionResult GesturesMatch(const GestureList& expected,
39                                           const GestureList& actual) {
40    if (expected.size() != actual.size()) {
41      return ::testing::AssertionFailure()
42          << "actual.size(" << actual.size()
43          << ") != expected.size(" << expected.size() << ")";
44    }
45
46    for (size_t i = 0; i < expected.size(); ++i) {
47      if (expected[i] != actual[i]) {
48        return ::testing::AssertionFailure()
49            << "actual[" << i << "] ("
50            << actual[i]
51            << ") != expected[" << i << "] ("
52            << expected[i] << ")";
53      }
54    }
55
56    return ::testing::AssertionSuccess();
57  }
58
59  GestureList Gestures(EventType type) {
60    return GestureList(1, type);
61  }
62
63  GestureList Gestures(EventType type0, EventType type1) {
64    GestureList gestures(2);
65    gestures[0] = type0;
66    gestures[1] = type1;
67    return gestures;
68  }
69
70  GestureList Gestures(EventType type0,
71                       EventType type1,
72                       EventType type2) {
73    GestureList gestures(3);
74    gestures[0] = type0;
75    gestures[1] = type1;
76    gestures[2] = type2;
77    return gestures;
78  }
79
80  GestureList Gestures(EventType type0,
81                       EventType type1,
82                       EventType type2,
83                       EventType type3) {
84    GestureList gestures(4);
85    gestures[0] = type0;
86    gestures[1] = type1;
87    gestures[2] = type2;
88    gestures[3] = type3;
89    return gestures;
90  }
91
92  void SendTouchGestures() {
93    GestureEventDataPacket gesture_packet;
94    std::swap(gesture_packet, pending_gesture_packet_);
95    EXPECT_EQ(TouchDispositionGestureFilter::SUCCESS,
96              SendTouchGestures(touch_event_, gesture_packet));
97  }
98
99  TouchDispositionGestureFilter::PacketResult
100  SendTouchGestures(const MotionEvent& touch,
101                    const GestureEventDataPacket& packet) {
102    GestureEventDataPacket touch_packet =
103        GestureEventDataPacket::FromTouch(touch);
104    for (size_t i = 0; i < packet.gesture_count(); ++i)
105      touch_packet.Push(packet.gesture(i));
106    return queue_->OnGesturePacket(touch_packet);
107  }
108
109  TouchDispositionGestureFilter::PacketResult
110  SendTimeoutGesture(EventType type) {
111    return queue_->OnGesturePacket(
112        GestureEventDataPacket::FromTouchTimeout(CreateGesture(type)));
113  }
114
115  TouchDispositionGestureFilter::PacketResult
116  SendGesturePacket(const GestureEventDataPacket& packet) {
117    return queue_->OnGesturePacket(packet);
118  }
119
120  void SendTouchEventAck(bool event_consumed) {
121    queue_->OnTouchEventAck(event_consumed);
122  }
123
124  void SendTouchConsumedAck() {
125    SendTouchEventAck(true);
126  }
127
128  void SendTouchNotConsumedAck() {
129    SendTouchEventAck(false);
130  }
131
132  void PushGesture(EventType type) {
133    pending_gesture_packet_.Push(CreateGesture(type));
134  }
135
136  void PressTouchPoint(int x, int y) {
137    touch_event_.PressPoint(x, y);
138    SendTouchGestures();
139  }
140
141  void MoveTouchPoint(size_t index, int x, int y) {
142    touch_event_.MovePoint(index, x, y);
143    SendTouchGestures();
144  }
145
146  void ReleaseTouchPoint() {
147    touch_event_.ReleasePoint();
148    SendTouchGestures();
149  }
150
151  void CancelTouchPoint() {
152    touch_event_.CancelPoint();
153    SendTouchGestures();
154  }
155
156  bool GesturesSent() const {
157    return !sent_gestures_.empty();
158  }
159
160  bool IsEmpty() const {
161    return queue_->IsEmpty();
162  }
163
164  GestureList GetAndResetSentGestures() {
165    GestureList sent_gestures;
166    sent_gestures.swap(sent_gestures_);
167    return sent_gestures;
168  }
169
170  static GestureEventData CreateGesture(EventType type) {
171    return GestureEventData(type, base::TimeTicks(), 0, 0);
172  }
173
174 private:
175  scoped_ptr<TouchDispositionGestureFilter> queue_;
176  MockMotionEvent touch_event_;
177  GestureEventDataPacket pending_gesture_packet_;
178  size_t sent_gesture_count_;
179  GestureList sent_gestures_;
180};
181
182TEST_F(TouchDispositionGestureFilterTest, BasicNoGestures) {
183  PressTouchPoint(1, 1);
184  EXPECT_FALSE(GesturesSent());
185
186  MoveTouchPoint(0, 2, 2);
187  EXPECT_FALSE(GesturesSent());
188
189  // No gestures should be dispatched by the ack, as the queued packets
190  // contained no gestures.
191  SendTouchConsumedAck();
192  EXPECT_FALSE(GesturesSent());
193
194  // Release the touch gesture.
195  ReleaseTouchPoint();
196  SendTouchConsumedAck();
197  SendTouchConsumedAck();
198  EXPECT_FALSE(GesturesSent());
199}
200
201TEST_F(TouchDispositionGestureFilterTest, BasicGestures) {
202  // An unconsumed touch's gesture should be sent.
203  PushGesture(ET_GESTURE_SCROLL_BEGIN);
204  PressTouchPoint(1, 1);
205  EXPECT_FALSE(GesturesSent());
206  SendTouchNotConsumedAck();
207  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
208                            GetAndResetSentGestures()));
209
210  // Multiple gestures can be queued for a single event.
211  PushGesture(ET_SCROLL_FLING_START);
212  PushGesture(ET_SCROLL_FLING_CANCEL);
213  ReleaseTouchPoint();
214  EXPECT_FALSE(GesturesSent());
215  SendTouchNotConsumedAck();
216  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START,
217                                     ET_SCROLL_FLING_CANCEL),
218                            GetAndResetSentGestures()));
219}
220
221TEST_F(TouchDispositionGestureFilterTest, BasicGesturesConsumed) {
222  // A consumed touch's gesture should not be sent.
223  PushGesture(ET_GESTURE_SCROLL_BEGIN);
224  PressTouchPoint(1, 1);
225  SendTouchConsumedAck();
226  EXPECT_FALSE(GesturesSent());
227
228  PushGesture(ET_SCROLL_FLING_START);
229  PushGesture(ET_SCROLL_FLING_CANCEL);
230  ReleaseTouchPoint();
231  SendTouchConsumedAck();
232  EXPECT_FALSE(GesturesSent());
233}
234
235TEST_F(TouchDispositionGestureFilterTest, ConsumedThenNotConsumed) {
236  // A consumed touch's gesture should not be sent.
237  PushGesture(ET_GESTURE_SCROLL_BEGIN);
238  PressTouchPoint(1, 1);
239  SendTouchConsumedAck();
240  EXPECT_FALSE(GesturesSent());
241
242  // Even if the subsequent touch is not consumed, continue dropping gestures.
243  PushGesture(ET_GESTURE_SCROLL_UPDATE);
244  MoveTouchPoint(0, 2, 2);
245  SendTouchNotConsumedAck();
246  EXPECT_FALSE(GesturesSent());
247
248  // Even if the subsequent touch had no consumer, continue dropping gestures.
249  PushGesture(ET_SCROLL_FLING_START);
250  ReleaseTouchPoint();
251  SendTouchNotConsumedAck();
252  EXPECT_FALSE(GesturesSent());
253}
254
255TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenConsumed) {
256  // A not consumed touch's gesture should be sent.
257  PushGesture(ET_GESTURE_SCROLL_BEGIN);
258  PressTouchPoint(1, 1);
259  SendTouchNotConsumedAck();
260  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
261                            GetAndResetSentGestures()));
262
263  // A newly consumed gesture should not be sent.
264  PushGesture(ET_GESTURE_PINCH_BEGIN);
265  PressTouchPoint(10, 10);
266  SendTouchConsumedAck();
267  EXPECT_FALSE(GesturesSent());
268
269  // And subsequent non-consumed pinch updates should not be sent.
270  PushGesture(ET_GESTURE_SCROLL_UPDATE);
271  PushGesture(ET_GESTURE_PINCH_UPDATE);
272  MoveTouchPoint(0, 2, 2);
273  SendTouchNotConsumedAck();
274  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
275                            GetAndResetSentGestures()));
276
277  // End events dispatched only when their start events were.
278  PushGesture(ET_GESTURE_PINCH_END);
279  ReleaseTouchPoint();
280  SendTouchNotConsumedAck();
281  EXPECT_FALSE(GesturesSent());
282
283  PushGesture(ET_GESTURE_SCROLL_END);
284  ReleaseTouchPoint();
285  SendTouchConsumedAck();
286  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
287                            GetAndResetSentGestures()));
288}
289
290TEST_F(TouchDispositionGestureFilterTest, ScrollAlternatelyConsumed) {
291  // A consumed touch's gesture should not be sent.
292  PushGesture(ET_GESTURE_SCROLL_BEGIN);
293  PressTouchPoint(1, 1);
294  SendTouchNotConsumedAck();
295  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
296                            GetAndResetSentGestures()));
297
298  for (size_t i = 0; i < 3; ++i) {
299    PushGesture(ET_GESTURE_SCROLL_UPDATE);
300    MoveTouchPoint(0, 2, 2);
301    SendTouchConsumedAck();
302    EXPECT_FALSE(GesturesSent());
303
304    PushGesture(ET_GESTURE_SCROLL_UPDATE);
305    MoveTouchPoint(0, 3, 3);
306    SendTouchNotConsumedAck();
307    EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
308                              GetAndResetSentGestures()));
309  }
310
311  PushGesture(ET_GESTURE_SCROLL_END);
312  ReleaseTouchPoint();
313  SendTouchConsumedAck();
314  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
315                            GetAndResetSentGestures()));
316}
317
318TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenNoConsumer) {
319  // An unconsumed touch's gesture should be sent.
320  PushGesture(ET_GESTURE_SCROLL_BEGIN);
321  PressTouchPoint(1, 1);
322  SendTouchNotConsumedAck();
323  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
324                            GetAndResetSentGestures()));
325
326  // If the subsequent touch has no consumer (e.g., a secondary pointer is
327  // pressed but not on a touch handling rect), send the gesture.
328  PushGesture(ET_GESTURE_PINCH_BEGIN);
329  PressTouchPoint(2, 2);
330  SendTouchNotConsumedAck();
331  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
332                            GetAndResetSentGestures()));
333
334  // End events should be dispatched when their start events were, independent
335  // of the ack state.
336  PushGesture(ET_GESTURE_PINCH_END);
337  ReleaseTouchPoint();
338  SendTouchConsumedAck();
339  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
340                            GetAndResetSentGestures()));
341
342  PushGesture(ET_GESTURE_SCROLL_END);
343  ReleaseTouchPoint();
344  SendTouchConsumedAck();
345  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
346                            GetAndResetSentGestures()));
347}
348
349TEST_F(TouchDispositionGestureFilterTest, EndingEventsSent) {
350  PushGesture(ET_GESTURE_SCROLL_BEGIN);
351  PressTouchPoint(1, 1);
352  SendTouchNotConsumedAck();
353  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
354                            GetAndResetSentGestures()));
355
356  PushGesture(ET_GESTURE_PINCH_BEGIN);
357  PressTouchPoint(2, 2);
358  SendTouchNotConsumedAck();
359  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
360                            GetAndResetSentGestures()));
361
362  // Consuming the touchend event can't suppress the match end gesture.
363  PushGesture(ET_GESTURE_PINCH_END);
364  ReleaseTouchPoint();
365  SendTouchConsumedAck();
366  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
367                            GetAndResetSentGestures()));
368
369  // But other events in the same packet are still suppressed.
370  PushGesture(ET_GESTURE_SCROLL_UPDATE);
371  PushGesture(ET_GESTURE_SCROLL_END);
372  ReleaseTouchPoint();
373  SendTouchConsumedAck();
374  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
375                            GetAndResetSentGestures()));
376
377  // ET_GESTURE_SCROLL_END and ET_SCROLL_FLING_START behave the same in this
378  // regard.
379  PushGesture(ET_GESTURE_SCROLL_BEGIN);
380  PressTouchPoint(1, 1);
381  SendTouchNotConsumedAck();
382  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
383                            GetAndResetSentGestures()));
384
385  PushGesture(ET_SCROLL_FLING_START);
386  ReleaseTouchPoint();
387  SendTouchConsumedAck();
388  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
389                            GetAndResetSentGestures()));
390}
391
392TEST_F(TouchDispositionGestureFilterTest, EndingEventsNotSent) {
393  // Consuming a begin event ensures no end events are sent.
394  PushGesture(ET_GESTURE_SCROLL_BEGIN);
395  PressTouchPoint(1, 1);
396  SendTouchConsumedAck();
397  EXPECT_FALSE(GesturesSent());
398
399  PushGesture(ET_GESTURE_PINCH_BEGIN);
400  PressTouchPoint(2, 2);
401  SendTouchNotConsumedAck();
402  EXPECT_FALSE(GesturesSent());
403
404  PushGesture(ET_GESTURE_PINCH_END);
405  ReleaseTouchPoint();
406  SendTouchNotConsumedAck();
407  EXPECT_FALSE(GesturesSent());
408
409  PushGesture(ET_GESTURE_SCROLL_END);
410  ReleaseTouchPoint();
411  SendTouchNotConsumedAck();
412  EXPECT_FALSE(GesturesSent());
413}
414
415TEST_F(TouchDispositionGestureFilterTest, UpdateEventsSuppressedPerEvent) {
416  PushGesture(ET_GESTURE_SCROLL_BEGIN);
417  PressTouchPoint(1, 1);
418  SendTouchNotConsumedAck();
419  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
420                            GetAndResetSentGestures()));
421
422  // Consuming a single scroll or pinch update should suppress only that event.
423  PushGesture(ET_GESTURE_SCROLL_UPDATE);
424  MoveTouchPoint(0, 2, 2);
425  SendTouchConsumedAck();
426  EXPECT_FALSE(GesturesSent());
427
428  PushGesture(ET_GESTURE_PINCH_BEGIN);
429  PressTouchPoint(2, 2);
430  SendTouchNotConsumedAck();
431  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
432                            GetAndResetSentGestures()));
433
434  PushGesture(ET_GESTURE_PINCH_UPDATE);
435  MoveTouchPoint(1, 2, 3);
436  SendTouchConsumedAck();
437  EXPECT_FALSE(GesturesSent());
438
439  // Subsequent updates should not be affected.
440  PushGesture(ET_GESTURE_SCROLL_UPDATE);
441  MoveTouchPoint(0, 4, 4);
442  SendTouchNotConsumedAck();
443  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
444                            GetAndResetSentGestures()));
445
446  PushGesture(ET_GESTURE_PINCH_UPDATE);
447  MoveTouchPoint(0, 4, 5);
448  SendTouchNotConsumedAck();
449  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_UPDATE),
450                            GetAndResetSentGestures()));
451
452  PushGesture(ET_GESTURE_PINCH_END);
453  ReleaseTouchPoint();
454  SendTouchConsumedAck();
455  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
456                            GetAndResetSentGestures()));
457
458  PushGesture(ET_GESTURE_SCROLL_END);
459  ReleaseTouchPoint();
460  SendTouchConsumedAck();
461  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
462                            GetAndResetSentGestures()));
463}
464
465TEST_F(TouchDispositionGestureFilterTest, UpdateEventsDependOnBeginEvents) {
466  PushGesture(ET_GESTURE_SCROLL_BEGIN);
467  PressTouchPoint(1, 1);
468  SendTouchConsumedAck();
469  EXPECT_FALSE(GesturesSent());
470
471  // Scroll and pinch gestures depend on the scroll begin gesture being
472  // dispatched.
473  PushGesture(ET_GESTURE_SCROLL_UPDATE);
474  MoveTouchPoint(0, 2, 2);
475  SendTouchNotConsumedAck();
476  EXPECT_FALSE(GesturesSent());
477
478  PushGesture(ET_GESTURE_PINCH_BEGIN);
479  PressTouchPoint(2, 2);
480  SendTouchNotConsumedAck();
481  EXPECT_FALSE(GesturesSent());
482
483  PushGesture(ET_GESTURE_PINCH_UPDATE);
484  MoveTouchPoint(1, 2, 3);
485  SendTouchConsumedAck();
486  EXPECT_FALSE(GesturesSent());
487
488  PushGesture(ET_GESTURE_PINCH_END);
489  ReleaseTouchPoint();
490  SendTouchNotConsumedAck();
491  EXPECT_FALSE(GesturesSent());
492
493  PushGesture(ET_GESTURE_SCROLL_END);
494  ReleaseTouchPoint();
495  SendTouchNotConsumedAck();
496  EXPECT_FALSE(GesturesSent());
497}
498
499TEST_F(TouchDispositionGestureFilterTest, MultipleTouchSequences) {
500  // Queue two touch-to-gestures sequences.
501  PushGesture(ET_GESTURE_TAP_DOWN);
502  PressTouchPoint(1, 1);
503  PushGesture(ET_GESTURE_TAP);
504  ReleaseTouchPoint();
505  PushGesture(ET_GESTURE_SCROLL_BEGIN);
506  PressTouchPoint(1, 1);
507  PushGesture(ET_GESTURE_SCROLL_END);
508  ReleaseTouchPoint();
509
510  // The first gesture sequence should not be allowed.
511  SendTouchConsumedAck();
512  SendTouchNotConsumedAck();
513  EXPECT_FALSE(GesturesSent());
514
515  // The subsequent sequence should "reset" allowance.
516  SendTouchNotConsumedAck();
517  SendTouchNotConsumedAck();
518  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
519                                     ET_GESTURE_SCROLL_END),
520                            GetAndResetSentGestures()));
521}
522
523TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnNewTouchSequence) {
524  // Simulate a fling.
525  PushGesture(ET_GESTURE_SCROLL_BEGIN);
526  PressTouchPoint(1, 1);
527  SendTouchNotConsumedAck();
528  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
529                            GetAndResetSentGestures()));
530  PushGesture(ET_SCROLL_FLING_START);
531  ReleaseTouchPoint();
532  SendTouchNotConsumedAck();
533  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
534                            GetAndResetSentGestures()));
535
536  // A new touch seqeuence should cancel the outstanding fling.
537  PressTouchPoint(1, 1);
538  SendTouchNotConsumedAck();
539  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL),
540                            GetAndResetSentGestures()));
541  ReleaseTouchPoint();
542  SendTouchNotConsumedAck();
543  EXPECT_FALSE(GesturesSent());
544}
545
546TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnNewTouchSequence) {
547  // Simulate a scroll.
548  PushGesture(ET_GESTURE_SCROLL_BEGIN);
549  PressTouchPoint(1, 1);
550  SendTouchNotConsumedAck();
551  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
552                            GetAndResetSentGestures()));
553  ReleaseTouchPoint();
554  SendTouchNotConsumedAck();
555
556  // A new touch seqeuence should end the outstanding scroll.
557  PressTouchPoint(1, 1);
558  SendTouchConsumedAck();
559  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
560                            GetAndResetSentGestures()));
561}
562
563TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnScrollBegin) {
564  // Simulate a fling sequence.
565  PushGesture(ET_GESTURE_SCROLL_BEGIN);
566  PushGesture(ET_SCROLL_FLING_START);
567  PressTouchPoint(1, 1);
568  SendTouchNotConsumedAck();
569  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
570                                     ET_SCROLL_FLING_START),
571                            GetAndResetSentGestures()));
572
573  // The new fling should cancel the preceding one.
574  PushGesture(ET_GESTURE_SCROLL_BEGIN);
575  PushGesture(ET_SCROLL_FLING_START);
576  ReleaseTouchPoint();
577  SendTouchNotConsumedAck();
578  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL,
579                                     ET_GESTURE_SCROLL_BEGIN,
580                                     ET_SCROLL_FLING_START),
581                            GetAndResetSentGestures()));
582}
583
584TEST_F(TouchDispositionGestureFilterTest, FlingNotCancelledIfGFCEventReceived) {
585  // Simulate a fling that is started then cancelled.
586  PushGesture(ET_GESTURE_SCROLL_BEGIN);
587  PressTouchPoint(1, 1);
588  SendTouchNotConsumedAck();
589  PushGesture(ET_SCROLL_FLING_START);
590  MoveTouchPoint(0, 1, 1);
591  SendTouchNotConsumedAck();
592  PushGesture(ET_SCROLL_FLING_CANCEL);
593  ReleaseTouchPoint();
594  SendTouchNotConsumedAck();
595  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
596                                     ET_SCROLL_FLING_START,
597                                     ET_SCROLL_FLING_CANCEL),
598                            GetAndResetSentGestures()));
599
600  // A new touch sequence will not inject a ET_SCROLL_FLING_CANCEL, as the fling
601  // has already been cancelled.
602  PressTouchPoint(1, 1);
603  SendTouchNotConsumedAck();
604  ReleaseTouchPoint();
605  SendTouchNotConsumedAck();
606  EXPECT_FALSE(GesturesSent());
607}
608
609TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenScrollBegins) {
610  PushGesture(ET_GESTURE_TAP_DOWN);
611  PressTouchPoint(1, 1);
612  SendTouchNotConsumedAck();
613  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
614                            GetAndResetSentGestures()));
615
616  // If the subsequent touch turns into a scroll, the tap should be cancelled.
617  PushGesture(ET_GESTURE_SCROLL_BEGIN);
618  MoveTouchPoint(0, 2, 2);
619  SendTouchNotConsumedAck();
620  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
621                                     ET_GESTURE_SCROLL_BEGIN),
622                            GetAndResetSentGestures()));
623}
624
625TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenTouchConsumed) {
626  PushGesture(ET_GESTURE_TAP_DOWN);
627  PressTouchPoint(1, 1);
628  SendTouchNotConsumedAck();
629  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
630                            GetAndResetSentGestures()));
631
632  // If the subsequent touch is consumed, the tap should be cancelled.
633  PushGesture(ET_GESTURE_SCROLL_BEGIN);
634  MoveTouchPoint(0, 2, 2);
635  SendTouchConsumedAck();
636  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
637                            GetAndResetSentGestures()));
638}
639
640TEST_F(TouchDispositionGestureFilterTest,
641       TapNotCancelledIfTapEndingEventReceived) {
642  PushGesture(ET_GESTURE_TAP_DOWN);
643  PressTouchPoint(1, 1);
644  PressTouchPoint(2, 2);
645  SendTouchNotConsumedAck();
646  SendTouchNotConsumedAck();
647  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
648                            GetAndResetSentGestures()));
649
650  PushGesture(ET_GESTURE_TAP);
651  ReleaseTouchPoint();
652  SendTouchNotConsumedAck();
653  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP),
654                            GetAndResetSentGestures()));
655
656  // The tap should not be cancelled as it was terminated by a |ET_GESTURE_TAP|.
657  ReleaseTouchPoint();
658  SendTouchConsumedAck();
659  EXPECT_FALSE(GesturesSent());
660}
661
662TEST_F(TouchDispositionGestureFilterTest, TimeoutGestures) {
663  // If the sequence is allowed, and there are no preceding gestures, the
664  // timeout gestures should be forwarded immediately.
665  PressTouchPoint(1, 1);
666  SendTouchNotConsumedAck();
667  EXPECT_FALSE(GesturesSent());
668
669  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
670  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
671                            GetAndResetSentGestures()));
672
673  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
674  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS),
675                            GetAndResetSentGestures()));
676
677  ReleaseTouchPoint();
678  SendTouchNotConsumedAck();
679
680  // If the sequence is disallowed, and there are no preceding gestures, the
681  // timeout gestures should be dropped immediately.
682  PressTouchPoint(1, 1);
683  SendTouchConsumedAck();
684  EXPECT_FALSE(GesturesSent());
685
686  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
687  EXPECT_FALSE(GesturesSent());
688  ReleaseTouchPoint();
689  SendTouchNotConsumedAck();
690
691  // If the sequence has a pending ack, the timeout gestures should
692  // remain queued until the ack is received.
693  PressTouchPoint(1, 1);
694  EXPECT_FALSE(GesturesSent());
695
696  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
697  EXPECT_FALSE(GesturesSent());
698
699  SendTouchNotConsumedAck();
700  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS),
701                            GetAndResetSentGestures()));
702}
703
704TEST_F(TouchDispositionGestureFilterTest, SpuriousAcksIgnored) {
705  // Acks received when the queue is empty will be safely ignored.
706  ASSERT_TRUE(IsEmpty());
707  SendTouchConsumedAck();
708  EXPECT_FALSE(GesturesSent());
709
710  PushGesture(ET_GESTURE_SCROLL_BEGIN);
711  PressTouchPoint(1, 1);
712  PushGesture(ET_GESTURE_SCROLL_UPDATE);
713  MoveTouchPoint(0, 3,3);
714  SendTouchNotConsumedAck();
715  SendTouchNotConsumedAck();
716  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
717                                     ET_GESTURE_SCROLL_UPDATE),
718                            GetAndResetSentGestures()));
719
720  // Even if all packets have been dispatched, the filter may not be empty as
721  // there could be follow-up timeout events.  Spurious acks in such cases
722  // should also be safely ignored.
723  ASSERT_FALSE(IsEmpty());
724  SendTouchConsumedAck();
725  EXPECT_FALSE(GesturesSent());
726}
727
728TEST_F(TouchDispositionGestureFilterTest, PacketWithInvalidTypeIgnored) {
729  GestureEventDataPacket packet;
730  EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_TYPE,
731            SendGesturePacket(packet));
732  EXPECT_TRUE(IsEmpty());
733}
734
735TEST_F(TouchDispositionGestureFilterTest, PacketsWithInvalidOrderIgnored) {
736  EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_ORDER,
737            SendTimeoutGesture(ET_GESTURE_SHOW_PRESS));
738  EXPECT_TRUE(IsEmpty());
739}
740
741TEST_F(TouchDispositionGestureFilterTest, ConsumedTouchCancel) {
742  // An unconsumed touch's gesture should be sent.
743  PushGesture(ET_GESTURE_TAP_DOWN);
744  PressTouchPoint(1, 1);
745  EXPECT_FALSE(GesturesSent());
746  SendTouchNotConsumedAck();
747  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
748                            GetAndResetSentGestures()));
749
750  PushGesture(ET_GESTURE_TAP_CANCEL);
751  PushGesture(ET_GESTURE_SCROLL_END);
752  CancelTouchPoint();
753  EXPECT_FALSE(GesturesSent());
754  SendTouchConsumedAck();
755  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
756                                     ET_GESTURE_SCROLL_END),
757                            GetAndResetSentGestures()));
758}
759
760TEST_F(TouchDispositionGestureFilterTest, TimeoutEventAfterRelease) {
761  PressTouchPoint(1, 1);
762  SendTouchNotConsumedAck();
763  EXPECT_FALSE(GesturesSent());
764  PushGesture(ET_GESTURE_TAP_UNCONFIRMED);
765  ReleaseTouchPoint();
766  SendTouchNotConsumedAck();
767  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_UNCONFIRMED),
768                            GetAndResetSentGestures()));
769
770  SendTimeoutGesture(ET_GESTURE_TAP);
771  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP),
772                            GetAndResetSentGestures()));
773}
774
775}  // namespace ui
776