touch_disposition_gesture_filter_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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(
172        type, base::TimeTicks(), 0, 0, GestureEventData::Details());
173  }
174
175 private:
176  scoped_ptr<TouchDispositionGestureFilter> queue_;
177  MockMotionEvent touch_event_;
178  GestureEventDataPacket pending_gesture_packet_;
179  size_t sent_gesture_count_;
180  GestureList sent_gestures_;
181};
182
183TEST_F(TouchDispositionGestureFilterTest, BasicNoGestures) {
184  PressTouchPoint(1, 1);
185  EXPECT_FALSE(GesturesSent());
186
187  MoveTouchPoint(0, 2, 2);
188  EXPECT_FALSE(GesturesSent());
189
190  // No gestures should be dispatched by the ack, as the queued packets
191  // contained no gestures.
192  SendTouchConsumedAck();
193  EXPECT_FALSE(GesturesSent());
194
195  // Release the touch gesture.
196  ReleaseTouchPoint();
197  SendTouchConsumedAck();
198  SendTouchConsumedAck();
199  EXPECT_FALSE(GesturesSent());
200}
201
202TEST_F(TouchDispositionGestureFilterTest, BasicGestures) {
203  // An unconsumed touch's gesture should be sent.
204  PushGesture(ET_GESTURE_SCROLL_BEGIN);
205  PressTouchPoint(1, 1);
206  EXPECT_FALSE(GesturesSent());
207  SendTouchNotConsumedAck();
208  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
209                            GetAndResetSentGestures()));
210
211  // Multiple gestures can be queued for a single event.
212  PushGesture(ET_SCROLL_FLING_START);
213  PushGesture(ET_SCROLL_FLING_CANCEL);
214  ReleaseTouchPoint();
215  EXPECT_FALSE(GesturesSent());
216  SendTouchNotConsumedAck();
217  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START,
218                                     ET_SCROLL_FLING_CANCEL),
219                            GetAndResetSentGestures()));
220}
221
222TEST_F(TouchDispositionGestureFilterTest, BasicGesturesConsumed) {
223  // A consumed touch's gesture should not be sent.
224  PushGesture(ET_GESTURE_SCROLL_BEGIN);
225  PressTouchPoint(1, 1);
226  SendTouchConsumedAck();
227  EXPECT_FALSE(GesturesSent());
228
229  PushGesture(ET_SCROLL_FLING_START);
230  PushGesture(ET_SCROLL_FLING_CANCEL);
231  ReleaseTouchPoint();
232  SendTouchConsumedAck();
233  EXPECT_FALSE(GesturesSent());
234}
235
236TEST_F(TouchDispositionGestureFilterTest, ConsumedThenNotConsumed) {
237  // A consumed touch's gesture should not be sent.
238  PushGesture(ET_GESTURE_SCROLL_BEGIN);
239  PressTouchPoint(1, 1);
240  SendTouchConsumedAck();
241  EXPECT_FALSE(GesturesSent());
242
243  // Even if the subsequent touch is not consumed, continue dropping gestures.
244  PushGesture(ET_GESTURE_SCROLL_UPDATE);
245  MoveTouchPoint(0, 2, 2);
246  SendTouchNotConsumedAck();
247  EXPECT_FALSE(GesturesSent());
248
249  // Even if the subsequent touch had no consumer, continue dropping gestures.
250  PushGesture(ET_SCROLL_FLING_START);
251  ReleaseTouchPoint();
252  SendTouchNotConsumedAck();
253  EXPECT_FALSE(GesturesSent());
254}
255
256TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenConsumed) {
257  // A not consumed touch's gesture should be sent.
258  PushGesture(ET_GESTURE_SCROLL_BEGIN);
259  PressTouchPoint(1, 1);
260  SendTouchNotConsumedAck();
261  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
262                            GetAndResetSentGestures()));
263
264  // A newly consumed gesture should not be sent.
265  PushGesture(ET_GESTURE_PINCH_BEGIN);
266  PressTouchPoint(10, 10);
267  SendTouchConsumedAck();
268  EXPECT_FALSE(GesturesSent());
269
270  // And subsequent non-consumed pinch updates should not be sent.
271  PushGesture(ET_GESTURE_SCROLL_UPDATE);
272  PushGesture(ET_GESTURE_PINCH_UPDATE);
273  MoveTouchPoint(0, 2, 2);
274  SendTouchNotConsumedAck();
275  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
276                            GetAndResetSentGestures()));
277
278  // End events dispatched only when their start events were.
279  PushGesture(ET_GESTURE_PINCH_END);
280  ReleaseTouchPoint();
281  SendTouchNotConsumedAck();
282  EXPECT_FALSE(GesturesSent());
283
284  PushGesture(ET_GESTURE_SCROLL_END);
285  ReleaseTouchPoint();
286  SendTouchConsumedAck();
287  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
288                            GetAndResetSentGestures()));
289}
290
291TEST_F(TouchDispositionGestureFilterTest, ScrollAlternatelyConsumed) {
292  // A consumed touch's gesture should not be sent.
293  PushGesture(ET_GESTURE_SCROLL_BEGIN);
294  PressTouchPoint(1, 1);
295  SendTouchNotConsumedAck();
296  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
297                            GetAndResetSentGestures()));
298
299  for (size_t i = 0; i < 3; ++i) {
300    PushGesture(ET_GESTURE_SCROLL_UPDATE);
301    MoveTouchPoint(0, 2, 2);
302    SendTouchConsumedAck();
303    EXPECT_FALSE(GesturesSent());
304
305    PushGesture(ET_GESTURE_SCROLL_UPDATE);
306    MoveTouchPoint(0, 3, 3);
307    SendTouchNotConsumedAck();
308    EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
309                              GetAndResetSentGestures()));
310  }
311
312  PushGesture(ET_GESTURE_SCROLL_END);
313  ReleaseTouchPoint();
314  SendTouchConsumedAck();
315  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
316                            GetAndResetSentGestures()));
317}
318
319TEST_F(TouchDispositionGestureFilterTest, NotConsumedThenNoConsumer) {
320  // An unconsumed touch's gesture should be sent.
321  PushGesture(ET_GESTURE_SCROLL_BEGIN);
322  PressTouchPoint(1, 1);
323  SendTouchNotConsumedAck();
324  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
325                            GetAndResetSentGestures()));
326
327  // If the subsequent touch has no consumer (e.g., a secondary pointer is
328  // pressed but not on a touch handling rect), send the gesture.
329  PushGesture(ET_GESTURE_PINCH_BEGIN);
330  PressTouchPoint(2, 2);
331  SendTouchNotConsumedAck();
332  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
333                            GetAndResetSentGestures()));
334
335  // End events should be dispatched when their start events were, independent
336  // of the ack state.
337  PushGesture(ET_GESTURE_PINCH_END);
338  ReleaseTouchPoint();
339  SendTouchConsumedAck();
340  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
341                            GetAndResetSentGestures()));
342
343  PushGesture(ET_GESTURE_SCROLL_END);
344  ReleaseTouchPoint();
345  SendTouchConsumedAck();
346  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
347                            GetAndResetSentGestures()));
348}
349
350TEST_F(TouchDispositionGestureFilterTest, EndingEventsSent) {
351  PushGesture(ET_GESTURE_SCROLL_BEGIN);
352  PressTouchPoint(1, 1);
353  SendTouchNotConsumedAck();
354  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
355                            GetAndResetSentGestures()));
356
357  PushGesture(ET_GESTURE_PINCH_BEGIN);
358  PressTouchPoint(2, 2);
359  SendTouchNotConsumedAck();
360  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
361                            GetAndResetSentGestures()));
362
363  // Consuming the touchend event can't suppress the match end gesture.
364  PushGesture(ET_GESTURE_PINCH_END);
365  ReleaseTouchPoint();
366  SendTouchConsumedAck();
367  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
368                            GetAndResetSentGestures()));
369
370  // But other events in the same packet are still suppressed.
371  PushGesture(ET_GESTURE_SCROLL_UPDATE);
372  PushGesture(ET_GESTURE_SCROLL_END);
373  ReleaseTouchPoint();
374  SendTouchConsumedAck();
375  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
376                            GetAndResetSentGestures()));
377
378  // ET_GESTURE_SCROLL_END and ET_SCROLL_FLING_START behave the same in this
379  // regard.
380  PushGesture(ET_GESTURE_SCROLL_BEGIN);
381  PressTouchPoint(1, 1);
382  SendTouchNotConsumedAck();
383  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
384                            GetAndResetSentGestures()));
385
386  PushGesture(ET_SCROLL_FLING_START);
387  ReleaseTouchPoint();
388  SendTouchConsumedAck();
389  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
390                            GetAndResetSentGestures()));
391}
392
393TEST_F(TouchDispositionGestureFilterTest, EndingEventsNotSent) {
394  // Consuming a begin event ensures no end events are sent.
395  PushGesture(ET_GESTURE_SCROLL_BEGIN);
396  PressTouchPoint(1, 1);
397  SendTouchConsumedAck();
398  EXPECT_FALSE(GesturesSent());
399
400  PushGesture(ET_GESTURE_PINCH_BEGIN);
401  PressTouchPoint(2, 2);
402  SendTouchNotConsumedAck();
403  EXPECT_FALSE(GesturesSent());
404
405  PushGesture(ET_GESTURE_PINCH_END);
406  ReleaseTouchPoint();
407  SendTouchNotConsumedAck();
408  EXPECT_FALSE(GesturesSent());
409
410  PushGesture(ET_GESTURE_SCROLL_END);
411  ReleaseTouchPoint();
412  SendTouchNotConsumedAck();
413  EXPECT_FALSE(GesturesSent());
414}
415
416TEST_F(TouchDispositionGestureFilterTest, UpdateEventsSuppressedPerEvent) {
417  PushGesture(ET_GESTURE_SCROLL_BEGIN);
418  PressTouchPoint(1, 1);
419  SendTouchNotConsumedAck();
420  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
421                            GetAndResetSentGestures()));
422
423  // Consuming a single scroll or pinch update should suppress only that event.
424  PushGesture(ET_GESTURE_SCROLL_UPDATE);
425  MoveTouchPoint(0, 2, 2);
426  SendTouchConsumedAck();
427  EXPECT_FALSE(GesturesSent());
428
429  PushGesture(ET_GESTURE_PINCH_BEGIN);
430  PressTouchPoint(2, 2);
431  SendTouchNotConsumedAck();
432  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_BEGIN),
433                            GetAndResetSentGestures()));
434
435  PushGesture(ET_GESTURE_PINCH_UPDATE);
436  MoveTouchPoint(1, 2, 3);
437  SendTouchConsumedAck();
438  EXPECT_FALSE(GesturesSent());
439
440  // Subsequent updates should not be affected.
441  PushGesture(ET_GESTURE_SCROLL_UPDATE);
442  MoveTouchPoint(0, 4, 4);
443  SendTouchNotConsumedAck();
444  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_UPDATE),
445                            GetAndResetSentGestures()));
446
447  PushGesture(ET_GESTURE_PINCH_UPDATE);
448  MoveTouchPoint(0, 4, 5);
449  SendTouchNotConsumedAck();
450  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_UPDATE),
451                            GetAndResetSentGestures()));
452
453  PushGesture(ET_GESTURE_PINCH_END);
454  ReleaseTouchPoint();
455  SendTouchConsumedAck();
456  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_PINCH_END),
457                            GetAndResetSentGestures()));
458
459  PushGesture(ET_GESTURE_SCROLL_END);
460  ReleaseTouchPoint();
461  SendTouchConsumedAck();
462  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
463                            GetAndResetSentGestures()));
464}
465
466TEST_F(TouchDispositionGestureFilterTest, UpdateEventsDependOnBeginEvents) {
467  PushGesture(ET_GESTURE_SCROLL_BEGIN);
468  PressTouchPoint(1, 1);
469  SendTouchConsumedAck();
470  EXPECT_FALSE(GesturesSent());
471
472  // Scroll and pinch gestures depend on the scroll begin gesture being
473  // dispatched.
474  PushGesture(ET_GESTURE_SCROLL_UPDATE);
475  MoveTouchPoint(0, 2, 2);
476  SendTouchNotConsumedAck();
477  EXPECT_FALSE(GesturesSent());
478
479  PushGesture(ET_GESTURE_PINCH_BEGIN);
480  PressTouchPoint(2, 2);
481  SendTouchNotConsumedAck();
482  EXPECT_FALSE(GesturesSent());
483
484  PushGesture(ET_GESTURE_PINCH_UPDATE);
485  MoveTouchPoint(1, 2, 3);
486  SendTouchConsumedAck();
487  EXPECT_FALSE(GesturesSent());
488
489  PushGesture(ET_GESTURE_PINCH_END);
490  ReleaseTouchPoint();
491  SendTouchNotConsumedAck();
492  EXPECT_FALSE(GesturesSent());
493
494  PushGesture(ET_GESTURE_SCROLL_END);
495  ReleaseTouchPoint();
496  SendTouchNotConsumedAck();
497  EXPECT_FALSE(GesturesSent());
498}
499
500TEST_F(TouchDispositionGestureFilterTest, MultipleTouchSequences) {
501  // Queue two touch-to-gestures sequences.
502  PushGesture(ET_GESTURE_TAP_DOWN);
503  PressTouchPoint(1, 1);
504  PushGesture(ET_GESTURE_TAP);
505  ReleaseTouchPoint();
506  PushGesture(ET_GESTURE_SCROLL_BEGIN);
507  PressTouchPoint(1, 1);
508  PushGesture(ET_GESTURE_SCROLL_END);
509  ReleaseTouchPoint();
510
511  // The first gesture sequence should not be allowed.
512  SendTouchConsumedAck();
513  SendTouchNotConsumedAck();
514  EXPECT_FALSE(GesturesSent());
515
516  // The subsequent sequence should "reset" allowance.
517  SendTouchNotConsumedAck();
518  SendTouchNotConsumedAck();
519  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
520                                     ET_GESTURE_SCROLL_END),
521                            GetAndResetSentGestures()));
522}
523
524TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnNewTouchSequence) {
525  // Simulate a fling.
526  PushGesture(ET_GESTURE_SCROLL_BEGIN);
527  PressTouchPoint(1, 1);
528  SendTouchNotConsumedAck();
529  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
530                            GetAndResetSentGestures()));
531  PushGesture(ET_SCROLL_FLING_START);
532  ReleaseTouchPoint();
533  SendTouchNotConsumedAck();
534  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_START),
535                            GetAndResetSentGestures()));
536
537  // A new touch seqeuence should cancel the outstanding fling.
538  PressTouchPoint(1, 1);
539  SendTouchNotConsumedAck();
540  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL),
541                            GetAndResetSentGestures()));
542  ReleaseTouchPoint();
543  SendTouchNotConsumedAck();
544  EXPECT_FALSE(GesturesSent());
545}
546
547TEST_F(TouchDispositionGestureFilterTest, ScrollEndedOnNewTouchSequence) {
548  // Simulate a scroll.
549  PushGesture(ET_GESTURE_SCROLL_BEGIN);
550  PressTouchPoint(1, 1);
551  SendTouchNotConsumedAck();
552  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN),
553                            GetAndResetSentGestures()));
554  ReleaseTouchPoint();
555  SendTouchNotConsumedAck();
556
557  // A new touch seqeuence should end the outstanding scroll.
558  PressTouchPoint(1, 1);
559  SendTouchConsumedAck();
560  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_END),
561                            GetAndResetSentGestures()));
562}
563
564TEST_F(TouchDispositionGestureFilterTest, FlingCancelledOnScrollBegin) {
565  // Simulate a fling sequence.
566  PushGesture(ET_GESTURE_SCROLL_BEGIN);
567  PushGesture(ET_SCROLL_FLING_START);
568  PressTouchPoint(1, 1);
569  SendTouchNotConsumedAck();
570  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
571                                     ET_SCROLL_FLING_START),
572                            GetAndResetSentGestures()));
573
574  // The new fling should cancel the preceding one.
575  PushGesture(ET_GESTURE_SCROLL_BEGIN);
576  PushGesture(ET_SCROLL_FLING_START);
577  ReleaseTouchPoint();
578  SendTouchNotConsumedAck();
579  EXPECT_TRUE(GesturesMatch(Gestures(ET_SCROLL_FLING_CANCEL,
580                                     ET_GESTURE_SCROLL_BEGIN,
581                                     ET_SCROLL_FLING_START),
582                            GetAndResetSentGestures()));
583}
584
585TEST_F(TouchDispositionGestureFilterTest, FlingNotCancelledIfGFCEventReceived) {
586  // Simulate a fling that is started then cancelled.
587  PushGesture(ET_GESTURE_SCROLL_BEGIN);
588  PressTouchPoint(1, 1);
589  SendTouchNotConsumedAck();
590  PushGesture(ET_SCROLL_FLING_START);
591  MoveTouchPoint(0, 1, 1);
592  SendTouchNotConsumedAck();
593  PushGesture(ET_SCROLL_FLING_CANCEL);
594  ReleaseTouchPoint();
595  SendTouchNotConsumedAck();
596  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
597                                     ET_SCROLL_FLING_START,
598                                     ET_SCROLL_FLING_CANCEL),
599                            GetAndResetSentGestures()));
600
601  // A new touch sequence will not inject a ET_SCROLL_FLING_CANCEL, as the fling
602  // has already been cancelled.
603  PressTouchPoint(1, 1);
604  SendTouchNotConsumedAck();
605  ReleaseTouchPoint();
606  SendTouchNotConsumedAck();
607  EXPECT_FALSE(GesturesSent());
608}
609
610TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenScrollBegins) {
611  PushGesture(ET_GESTURE_TAP_DOWN);
612  PressTouchPoint(1, 1);
613  SendTouchNotConsumedAck();
614  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
615                            GetAndResetSentGestures()));
616
617  // If the subsequent touch turns into a scroll, the tap should be cancelled.
618  PushGesture(ET_GESTURE_SCROLL_BEGIN);
619  MoveTouchPoint(0, 2, 2);
620  SendTouchNotConsumedAck();
621  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
622                                     ET_GESTURE_SCROLL_BEGIN),
623                            GetAndResetSentGestures()));
624}
625
626TEST_F(TouchDispositionGestureFilterTest, TapCancelledWhenTouchConsumed) {
627  PushGesture(ET_GESTURE_TAP_DOWN);
628  PressTouchPoint(1, 1);
629  SendTouchNotConsumedAck();
630  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
631                            GetAndResetSentGestures()));
632
633  // If the subsequent touch is consumed, the tap should be cancelled.
634  PushGesture(ET_GESTURE_SCROLL_BEGIN);
635  MoveTouchPoint(0, 2, 2);
636  SendTouchConsumedAck();
637  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL),
638                            GetAndResetSentGestures()));
639}
640
641TEST_F(TouchDispositionGestureFilterTest,
642       TapNotCancelledIfTapEndingEventReceived) {
643  PushGesture(ET_GESTURE_TAP_DOWN);
644  PressTouchPoint(1, 1);
645  PressTouchPoint(2, 2);
646  SendTouchNotConsumedAck();
647  SendTouchNotConsumedAck();
648  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
649                            GetAndResetSentGestures()));
650
651  PushGesture(ET_GESTURE_TAP);
652  ReleaseTouchPoint();
653  SendTouchNotConsumedAck();
654  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP),
655                            GetAndResetSentGestures()));
656
657  // The tap should not be cancelled as it was terminated by a |ET_GESTURE_TAP|.
658  ReleaseTouchPoint();
659  SendTouchConsumedAck();
660  EXPECT_FALSE(GesturesSent());
661}
662
663TEST_F(TouchDispositionGestureFilterTest, TimeoutGestures) {
664  // If the sequence is allowed, and there are no preceding gestures, the
665  // timeout gestures should be forwarded immediately.
666  PressTouchPoint(1, 1);
667  SendTouchNotConsumedAck();
668  EXPECT_FALSE(GesturesSent());
669
670  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
671  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SHOW_PRESS),
672                            GetAndResetSentGestures()));
673
674  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
675  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS),
676                            GetAndResetSentGestures()));
677
678  ReleaseTouchPoint();
679  SendTouchNotConsumedAck();
680
681  // If the sequence is disallowed, and there are no preceding gestures, the
682  // timeout gestures should be dropped immediately.
683  PressTouchPoint(1, 1);
684  SendTouchConsumedAck();
685  EXPECT_FALSE(GesturesSent());
686
687  SendTimeoutGesture(ET_GESTURE_SHOW_PRESS);
688  EXPECT_FALSE(GesturesSent());
689  ReleaseTouchPoint();
690  SendTouchNotConsumedAck();
691
692  // If the sequence has a pending ack, the timeout gestures should
693  // remain queued until the ack is received.
694  PressTouchPoint(1, 1);
695  EXPECT_FALSE(GesturesSent());
696
697  SendTimeoutGesture(ET_GESTURE_LONG_PRESS);
698  EXPECT_FALSE(GesturesSent());
699
700  SendTouchNotConsumedAck();
701  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_LONG_PRESS),
702                            GetAndResetSentGestures()));
703}
704
705TEST_F(TouchDispositionGestureFilterTest, SpuriousAcksIgnored) {
706  // Acks received when the queue is empty will be safely ignored.
707  ASSERT_TRUE(IsEmpty());
708  SendTouchConsumedAck();
709  EXPECT_FALSE(GesturesSent());
710
711  PushGesture(ET_GESTURE_SCROLL_BEGIN);
712  PressTouchPoint(1, 1);
713  PushGesture(ET_GESTURE_SCROLL_UPDATE);
714  MoveTouchPoint(0, 3,3);
715  SendTouchNotConsumedAck();
716  SendTouchNotConsumedAck();
717  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_SCROLL_BEGIN,
718                                     ET_GESTURE_SCROLL_UPDATE),
719                            GetAndResetSentGestures()));
720
721  // Even if all packets have been dispatched, the filter may not be empty as
722  // there could be follow-up timeout events.  Spurious acks in such cases
723  // should also be safely ignored.
724  ASSERT_FALSE(IsEmpty());
725  SendTouchConsumedAck();
726  EXPECT_FALSE(GesturesSent());
727}
728
729TEST_F(TouchDispositionGestureFilterTest, PacketWithInvalidTypeIgnored) {
730  GestureEventDataPacket packet;
731  EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_TYPE,
732            SendGesturePacket(packet));
733  EXPECT_TRUE(IsEmpty());
734}
735
736TEST_F(TouchDispositionGestureFilterTest, PacketsWithInvalidOrderIgnored) {
737  EXPECT_EQ(TouchDispositionGestureFilter::INVALID_PACKET_ORDER,
738            SendTimeoutGesture(ET_GESTURE_SHOW_PRESS));
739  EXPECT_TRUE(IsEmpty());
740}
741
742TEST_F(TouchDispositionGestureFilterTest, ConsumedTouchCancel) {
743  // An unconsumed touch's gesture should be sent.
744  PushGesture(ET_GESTURE_TAP_DOWN);
745  PressTouchPoint(1, 1);
746  EXPECT_FALSE(GesturesSent());
747  SendTouchNotConsumedAck();
748  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_DOWN),
749                            GetAndResetSentGestures()));
750
751  PushGesture(ET_GESTURE_TAP_CANCEL);
752  PushGesture(ET_GESTURE_SCROLL_END);
753  CancelTouchPoint();
754  EXPECT_FALSE(GesturesSent());
755  SendTouchConsumedAck();
756  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_CANCEL,
757                                     ET_GESTURE_SCROLL_END),
758                            GetAndResetSentGestures()));
759}
760
761TEST_F(TouchDispositionGestureFilterTest, TimeoutEventAfterRelease) {
762  PressTouchPoint(1, 1);
763  SendTouchNotConsumedAck();
764  EXPECT_FALSE(GesturesSent());
765  PushGesture(ET_GESTURE_TAP_UNCONFIRMED);
766  ReleaseTouchPoint();
767  SendTouchNotConsumedAck();
768  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP_UNCONFIRMED),
769                            GetAndResetSentGestures()));
770
771  SendTimeoutGesture(ET_GESTURE_TAP);
772  EXPECT_TRUE(GesturesMatch(Gestures(ET_GESTURE_TAP),
773                            GetAndResetSentGestures()));
774}
775
776}  // namespace ui
777