/**
   * Verify that the first event sent while the page is scrolling will be converted to a
   * touchcancel. The touchcancel event should stay in the pending queue. Acking the touchcancel
   * event will consume all the touch events of the current session.
   */
  @SmallTest
  @Feature({"Gestures"})
  public void testTouchEventsCanceledWhileScrolling() {
    final int deltaY = 84;
    final long downTime = SystemClock.uptimeMillis();

    MockMotionEventDelegate delegate = new MockMotionEventDelegate();
    ContentViewGestureHandler gestureHandler =
        new ContentViewGestureHandler(
            getInstrumentation().getTargetContext(),
            delegate,
            new MockZoomManager(getInstrumentation().getTargetContext(), null));
    gestureHandler.hasTouchEventHandlers(true);
    MotionEvent event = motionEvent(MotionEvent.ACTION_DOWN, downTime, downTime);
    assertTrue(gestureHandler.onTouchEvent(event));
    gestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);

    event =
        MotionEvent.obtain(
            downTime,
            downTime + 5,
            MotionEvent.ACTION_MOVE,
            FAKE_COORD_X,
            FAKE_COORD_Y - deltaY / 2,
            0);
    assertTrue(gestureHandler.onTouchEvent(event));
    gestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);

    // This event will be converted to touchcancel and put into the pending
    // queue.
    event =
        MotionEvent.obtain(
            downTime,
            downTime + 10,
            MotionEvent.ACTION_MOVE,
            FAKE_COORD_X,
            FAKE_COORD_Y - deltaY,
            0);
    assertTrue(gestureHandler.onTouchEvent(event));
    assertEquals(1, gestureHandler.getNumberOfPendingMotionEventsForTesting());
    assertTrue(
        gestureHandler.isEventCancelledForTesting(
            gestureHandler.peekFirstInPendingMotionEventsForTesting()));

    event = motionEvent(MotionEvent.ACTION_POINTER_DOWN, downTime + 15, downTime + 15);
    assertTrue(gestureHandler.onTouchEvent(event));
    assertEquals(2, gestureHandler.getNumberOfPendingMotionEventsForTesting());

    // Acking the touchcancel will drain all the events.
    gestureHandler.confirmTouchEvent(ContentViewGestureHandler.INPUT_EVENT_ACK_STATE_NOT_CONSUMED);
    assertEquals(0, gestureHandler.getNumberOfPendingMotionEventsForTesting());
  }