15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// found in the LICENSE file.
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/basictypes.h"
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/logging.h"
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/time/time.h"
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/gesture_detection/motion_event_buffer.h"
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "ui/events/test/mock_motion_event.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using base::TimeDelta;
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using base::TimeTicks;
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)using ui::test::MockMotionEvent;
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace ui {
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kSmallDeltaMs = 1;
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kLargeDeltaMs = 50;
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const int kResampleDeltaMs = 5;
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const float kVelocityEpsilon = 0.01f;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)const float kDeltaEpsilon = 0.1f;
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define EXPECT_EVENT_EQ(A, B)         \
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {                                   \
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SCOPED_TRACE(testing::Message()); \
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ExpectEquals((A), (B));           \
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define EXPECT_EVENT_IGNORING_HISTORY_EQ(A, B) \
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {                                            \
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SCOPED_TRACE(testing::Message());          \
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ExpectEqualsIgnoringHistory((A), (B));     \
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define EXPECT_EVENT_HISTORY_EQ(A, I, B)     \
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  {                                          \
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    SCOPED_TRACE(testing::Message());        \
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ExpectEqualsHistoryIndex((A), (I), (B)); \
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MotionEventBufferTest : public testing::Test,
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              public MotionEventBufferClient {
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public:
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBufferTest() : needs_flush_(false) {}
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual ~MotionEventBufferTest() {}
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // MotionEventBufferClient implementation.
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void ForwardMotionEvent(const MotionEvent& event) OVERRIDE {
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    forwarded_events_.push_back(event.Clone().release());
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  virtual void SetNeedsFlush() OVERRIDE { needs_flush_ = true; }
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool GetAndResetNeedsFlush() {
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    bool needs_flush = needs_flush_;
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    needs_flush_ = false;
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return needs_flush;
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> GetAndResetForwardedEvents() {
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ScopedVector<MotionEvent> forwarded_events;
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    forwarded_events.swap(forwarded_events_);
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return forwarded_events.Pass();
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const MotionEvent* GetLastEvent() const {
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return forwarded_events_.empty() ? NULL : forwarded_events_.back();
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static base::TimeDelta LargeDelta() {
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return base::TimeDelta::FromMilliseconds(kLargeDeltaMs);
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static base::TimeDelta SmallDelta() {
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return base::TimeDelta::FromMilliseconds(kSmallDeltaMs);
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static base::TimeDelta ResampleDelta() {
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return base::TimeDelta::FromMilliseconds(kResampleDeltaMs);
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void ExpectEqualsImpl(const MotionEvent& a,
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               const MotionEvent& b,
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               bool ignore_history) {
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(a.GetId(), b.GetId());
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(a.GetAction(), b.GetAction());
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(a.GetActionIndex(), b.GetActionIndex());
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(a.GetButtonState(), b.GetButtonState());
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(a.GetEventTime(), b.GetEventTime());
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_EQ(a.GetPointerCount(), b.GetPointerCount());
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for (size_t i = 0; i < a.GetPointerCount(); ++i) {
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int bi = b.FindPointerIndexOfId(a.GetPointerId(i));
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ASSERT_NE(bi, -1);
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetX(i), b.GetX(bi));
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetY(i), b.GetY(bi));
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetRawX(i), b.GetRawX(bi));
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetRawY(i), b.GetRawY(bi));
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetTouchMajor(i), b.GetTouchMajor(bi));
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(a.GetTouchMinor(i), b.GetTouchMinor(bi));
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      EXPECT_EQ(a.GetOrientation(i), b.GetOrientation(bi));
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetPressure(i), b.GetPressure(bi));
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetToolType(i), b.GetToolType(bi));
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (ignore_history)
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      return;
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_EQ(a.GetHistorySize(), b.GetHistorySize());
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for (size_t h = 0; h < a.GetHistorySize(); ++h)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ExpectEqualsHistoryIndex(a, h, b);
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Verify that all public data of |a|, excluding history, equals that of |b|.
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void ExpectEqualsIgnoringHistory(const MotionEvent& a,
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                          const MotionEvent& b) {
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const bool ignore_history = true;
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ExpectEqualsImpl(a, b, ignore_history);
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Verify that all public data of |a| equals that of |b|.
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void ExpectEquals(const MotionEvent& a, const MotionEvent& b) {
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const bool ignore_history = false;
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ExpectEqualsImpl(a, b, ignore_history);
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Verify that the historical data of |a| given by |historical_index|
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // corresponds to the *raw* data of |b|.
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void ExpectEqualsHistoryIndex(const MotionEvent& a,
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       size_t history_index,
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                       const MotionEvent& b) {
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ASSERT_LT(history_index, a.GetHistorySize());
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_EQ(a.GetPointerCount(), b.GetPointerCount());
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_TRUE(a.GetHistoricalEventTime(history_index) == b.GetEventTime());
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for (size_t i = 0; i < a.GetPointerCount(); ++i) {
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      int bi = b.FindPointerIndexOfId(a.GetPointerId(i));
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      ASSERT_NE(bi, -1);
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetHistoricalX(i, history_index), b.GetX(bi));
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetHistoricalY(i, history_index), b.GetY(bi));
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      EXPECT_EQ(a.GetHistoricalTouchMajor(i, history_index),
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                b.GetTouchMajor(bi));
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected:
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunResample(base::TimeDelta flush_time_delta,
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   base::TimeDelta event_time_delta) {
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    for (base::TimeDelta offset; offset < event_time_delta;
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)         offset += event_time_delta / 3) {
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      SCOPED_TRACE(testing::Message()
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   << "Resample(offset="
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   << static_cast<int>(offset.InMilliseconds()) << "ms)");
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      RunResample(flush_time_delta, event_time_delta, offset);
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Given an event and flush sampling frequency, inject a stream of events,
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // flushing at appropriate points in the stream. Verify that the continuous
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // velocity sampled by the *input* stream matches the discrete velocity
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // as computed from the resampled *output* stream.
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void RunResample(base::TimeDelta flush_time_delta,
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   base::TimeDelta event_time_delta,
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                   base::TimeDelta event_time_offset) {
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::TimeTicks event_time = base::TimeTicks::Now();
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::TimeTicks flush_time =
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        event_time + flush_time_delta - event_time_offset;
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::TimeTicks max_event_time =
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        event_time + base::TimeDelta::FromSecondsD(0.5f);
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    const size_t min_expected_events =
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        static_cast<size_t>((max_event_time - flush_time) /
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            std::max(event_time_delta, flush_time_delta));
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    MotionEventBuffer buffer(this, true);
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gfx::Vector2dF velocity(33.f, -11.f);
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    gfx::PointF position(17.f, 42.f);
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    scoped_ptr<MotionEvent> last_flushed_event;
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    size_t events = 0;
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    float last_dx = 0, last_dy = 0;
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    base::TimeDelta last_dt;
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    while (event_time < max_event_time) {
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      position += gfx::ScaleVector2d(velocity, event_time_delta.InSecondsF());
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MockMotionEvent move(
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          MotionEvent::ACTION_MOVE, event_time, position.x(), position.y());
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      buffer.OnMotionEvent(move);
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      event_time += event_time_delta;
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      while (flush_time < event_time) {
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        buffer.Flush(flush_time);
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        flush_time += flush_time_delta;
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        const MotionEvent* current_flushed_event = GetLastEvent();
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (current_flushed_event) {
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          if (!last_flushed_event) {
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            last_flushed_event = current_flushed_event->Clone();
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            continue;
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          }
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          base::TimeDelta dt = current_flushed_event->GetEventTime() -
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               last_flushed_event->GetEventTime();
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          EXPECT_GE(dt.ToInternalValue(), 0);
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          // A time delta of 0 is possible if the flush rate is greater than the
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          // event rate, in which case we can simply skip forward.
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          if (dt == base::TimeDelta())
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            continue;
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          const float dx =
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              current_flushed_event->GetX() - last_flushed_event->GetX();
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          const float dy =
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)              current_flushed_event->GetY() - last_flushed_event->GetY();
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          const float dt_s = (current_flushed_event->GetEventTime() -
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                              last_flushed_event->GetEventTime()).InSecondsF();
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          // The discrete velocity should mirror the constant velocity.
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          EXPECT_NEAR(velocity.x(), dx / dt_s, kVelocityEpsilon);
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          EXPECT_NEAR(velocity.y(), dy / dt_s, kVelocityEpsilon);
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          // The impulse delta for each frame should remain constant.
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          if (last_dy)
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            EXPECT_NEAR(dx, last_dx, kDeltaEpsilon);
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          if (last_dy)
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            EXPECT_NEAR(dy, last_dy, kDeltaEpsilon);
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          // The timestamp delta should remain constant.
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          if (last_dt != base::TimeDelta())
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            EXPECT_TRUE((dt - last_dt).InMillisecondsF() < kDeltaEpsilon);
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          last_dx = dx;
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          last_dy = dy;
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          last_dt = dt;
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          last_flushed_event = current_flushed_event->Clone();
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)          events += GetAndResetForwardedEvents().size();
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      }
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    events += GetAndResetForwardedEvents().size();
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    EXPECT_GE(events, min_expected_events);
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private:
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> forwarded_events_;
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  bool needs_flush_;
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)};
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, BufferEmpty) {
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(base::TimeTicks::Now());
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetLastEvent());
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, BufferWithOneMoveNotResampled) {
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move(MotionEvent::ACTION_MOVE, event_time, 4.f, 4.f);
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move);
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetLastEvent());
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(event_time + ResampleDelta());
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move, *GetLastEvent());
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, GetAndResetForwardedEvents().size());
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, BufferFlushedOnNonActionMove) {
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetLastEvent());
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f);
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetLastEvent());
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The third move should remain buffered.
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move2(MotionEvent::ACTION_MOVE, event_time, 3.f, 3.f);
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move2);
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetLastEvent());
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The up should flush the buffer.
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent up(MotionEvent::ACTION_UP, event_time, 4.f, 4.f);
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(up);
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The flushed events should include the up and the moves, with the latter
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // combined into a single event with history.
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(2U, events.size());
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(up, *events.back());
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2U, events.front()->GetHistorySize());
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), move2);
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 1, move1);
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, BufferFlushedOnIncompatibleActionMove) {
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetLastEvent());
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move has a different pointer count, flushing the first.
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f, 3.f, 3.f);
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move0, *GetLastEvent());
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The third move has differing tool types, flushing the second.
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move2(move1);
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  move2.SetToolType(0, MotionEvent::TOOL_TYPE_STYLUS);
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move2);
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move1, *GetLastEvent());
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The flushed event should only include the latest move event.
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(event_time);
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(3U, events.size());
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move2, *events.back());
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Events with different pointer ids should not combine.
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PointerProperties pointer0(5.f, 5.f);
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  pointer0.id = 1;
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PointerProperties pointer1(10.f, 10.f);
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  pointer1.id = 2;
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventGeneric move3(MotionEvent::ACTION_MOVE, event_time, pointer0);
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  move3.PushPointer(pointer1);
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move3);
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventGeneric move4(MotionEvent::ACTION_MOVE, event_time, pointer0);
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  pointer1.id = 7;
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  move4.PushPointer(pointer1);
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move2);
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move3, *GetLastEvent());
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, OnlyActionMoveBuffered) {
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent down(MotionEvent::ACTION_DOWN, event_time, 1.f, 1.f);
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(down);
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(down, *GetLastEvent());
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetAndResetForwardedEvents();
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent up(MotionEvent::ACTION_UP, event_time, 2.f, 2.f);
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(up);
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(up, *GetLastEvent());
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetAndResetForwardedEvents();
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent cancel(MotionEvent::ACTION_CANCEL, event_time, 3.f, 3.f);
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(cancel);
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(cancel, *GetLastEvent());
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetAndResetForwardedEvents();
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move(MotionEvent::ACTION_MOVE, event_time, 4.f, 4.f);
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move);
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetLastEvent());
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = move.GetEventTime() + ResampleDelta();
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move, *GetLastEvent());
4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, OutOfOrderPointersBuffered) {
4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PointerProperties p0(1.f, 2.f);
4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p0.id = 1;
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  PointerProperties p1(2.f, 1.f);
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  p1.id = 2;
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventGeneric move0(MotionEvent::ACTION_MOVE, event_time, p0);
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  move0.PushPointer(p1);
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered even if the logical pointers are
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // in a different order.
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventGeneric move1(MotionEvent::ACTION_MOVE, event_time, p1);
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  move1.PushPointer(p0);
4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // As the two events are logically the same but for ordering and time, the
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // synthesized event should yield a logically identical event.
4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = move1.GetEventTime() + ResampleDelta();
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events.size());
4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_IGNORING_HISTORY_EQ(move1, *events.front());
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, FlushedEventsNeverLaterThanFlushTime) {
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += LargeDelta();
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f);
4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // A flush occurring too early should not forward any events.
4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = move0.GetEventTime() - ResampleDelta();
4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // With resampling enabled, a flush occurring before the resample
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // offset should not forward any events.
4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flush_time = move0.GetEventTime();
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Only the first event should get flushed, as the flush timestamp precedes
4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the second's timestamp by a sufficient amount (preventing interpolation).
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flush_time = move0.GetEventTime() + ResampleDelta();
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event.
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetLastEvent()->GetEventTime() <= flush_time);
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetAndResetForwardedEvents();
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Flushing again with a similar timestamp should have no effect other than
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // triggering another flush request.
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flush_time += base::TimeDelta::FromMilliseconds(1);
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetLastEvent());
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Flushing after the second move's time should trigger forwarding.
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flush_time = move1.GetEventTime() + ResampleDelta();
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move1, *GetLastEvent());
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, NoResamplingWhenDisabled) {
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  const bool resampling_enabled = false;
5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, resampling_enabled);
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Queue two events.
5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 15.f, 30.f);
5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Flush at a time between the first and second events.
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks interpolated_time =
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move0.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime()) / 2;
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = interpolated_time;
5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event, with the second remaining buffered
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // and no resampling having occurred.
5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events.size());
5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move0, *events.front());
5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should be flushed without resampling.
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flush_time = move1.GetEventTime();
5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move1, *GetLastEvent());
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  GetAndResetForwardedEvents();
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Now queue two more events.
5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  move0 = MockMotionEvent(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
5405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  move1 = MockMotionEvent(MotionEvent::ACTION_MOVE, event_time, 10.f, 20.f);
5455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
5485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Sample at a time beyond the first and second events.
5505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flush_time =
5515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime());
5525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
5535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
5545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
5555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event, with the first event in the history
5575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // and the second event as the actual event data (no resampling).
5585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  events = GetAndResetForwardedEvents();
5595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events.size());
5605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, events.front()->GetHistorySize());
5615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), move1);
5625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
5635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, NoResamplingWithOutOfOrderActionMove) {
5665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
5675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
5715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(10);
5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 10.f, 20.f);
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Sample at a time beyond the first and second events.
5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks extrapolated_time =
5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime());
5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = extrapolated_time + ResampleDelta();
5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event, with the event extrapolated from
5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the two events.
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks expected_time =
5925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime()) / 2;
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events0 = GetAndResetForwardedEvents();
5945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events0.size());
5955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2U, events0.front()->GetHistorySize());
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(expected_time, events0.front()->GetEventTime());
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Try enqueuing an event *after* the second event but *before* the
6005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // extrapolated event. It should be dropped.
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time = move1.GetEventTime() + base::TimeDelta::FromMilliseconds(1);
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move2(MotionEvent::ACTION_MOVE, event_time, 15.f, 25.f);
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
6065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Finally queue an event *after* the extrapolated event.
6085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time = expected_time + base::TimeDelta::FromMilliseconds(1);
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move3(MotionEvent::ACTION_MOVE, event_time, 15.f, 25.f);
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move3);
6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
6135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The flushed event should simply be the latest event.
6155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flush_time = event_time + ResampleDelta();
6165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
6175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
6185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events1 = GetAndResetForwardedEvents();
6195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events1.size());
6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move3, *events1.front());
6215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
6225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, NoResamplingWithSmallTimeDeltaBetweenMoves) {
6255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
6265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
6275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The first move should be buffered.
6295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
6305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
6335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
6355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += SmallDelta();
6365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f);
6375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
6385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
6395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
6405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = event_time + ResampleDelta();
6425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
6435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
6445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event, and no resampling should have
6465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // occured between the first and the second as they were temporally too close.
6475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
6485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events.size());
6495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, events.front()->GetHistorySize());
6505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), move1);
6515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
6525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, NoResamplingWithMismatchBetweenMoves) {
6555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
6565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
6575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The first move should be buffered.
6595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
6615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
6625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
6635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
6655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += SmallDelta();
6665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f);
6675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
6685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
6695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
6705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = event_time + ResampleDelta();
6725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
6735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
6745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event, and no resampling should have
6765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // occured between the first and the second as they were temporally too close.
6775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
6785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events.size());
6795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, events.front()->GetHistorySize());
6805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), move1);
6815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
6825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
6835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, Interpolation) {
6855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
6865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
6875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
6895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
6905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
6915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
6925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
6945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
6955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 15.f, 30.f);
6965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
6975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
6985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
6995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Sample at a time between the first and second events.
7015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks interpolated_time =
7025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move0.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime()) / 3;
7035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = interpolated_time + ResampleDelta();
7045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
7055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
7065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
7075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event, with the event interpolated between
7095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the two events. The second event should remain buffered.
7105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  float alpha = (interpolated_time - move0.GetEventTime()).InMillisecondsF() /
7115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                (move1.GetEventTime() - move0.GetEventTime()).InMillisecondsF();
7125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent interpolated_event(
7135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MotionEvent::ACTION_MOVE,
7145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      interpolated_time,
7155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move0.GetX(0) + (move1.GetX(0) - move0.GetX(0)) * alpha,
7165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move0.GetY(0) + (move1.GetY(0) - move0.GetY(0)) * alpha);
7175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
7185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events.size());
7195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(1U, events.front()->GetHistorySize());
7205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), interpolated_event);
7215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
7225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should be flushed without resampling.
7245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  flush_time = move1.GetEventTime() + ResampleDelta();
7255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
7265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
7275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_EQ(move1, *GetLastEvent());
7285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, Extrapolation) {
7315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
7325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
7335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
7355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
7365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
7375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
7385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
7405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(5);
7415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 10.f, 20.f);
7425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
7435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
7445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
7455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Sample at a time beyond the first and second events.
7475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks extrapolated_time =
7485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime());
7495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = extrapolated_time + ResampleDelta();
7505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
7515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
7525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
7535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event, with the event extrapolated from
7555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the two events. The first and second events should be in the history.
7565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Note that the maximum extrapolation is limited by *half* of the time delta
7575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // between the two events, hence we divide the relative delta by 2 in
7585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // determining the extrapolated event.
7595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks expected_time =
7605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime()) / 2;
7615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  float expected_alpha =
7625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      (expected_time - move0.GetEventTime()).InMillisecondsF() /
7635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      (move1.GetEventTime() - move0.GetEventTime()).InMillisecondsF();
7645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent extrapolated_event(
7655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MotionEvent::ACTION_MOVE,
7665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      expected_time,
7675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move0.GetX(0) + (move1.GetX(0) - move0.GetX(0)) * expected_alpha,
7685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move0.GetY(0) + (move1.GetY(0) - move0.GetY(0)) * expected_alpha);
7695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
7705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events.size());
7715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2U, events.front()->GetHistorySize());
7725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), extrapolated_event);
7735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
7745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 1, move1);
7755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
7765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, ExtrapolationHorizonLimited) {
7785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks event_time = base::TimeTicks::Now();
7795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MotionEventBuffer buffer(this, true);
7805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
7825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move0);
7835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
7845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_TRUE(GetAndResetNeedsFlush());
7855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The second move should remain buffered.
7875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  event_time += base::TimeDelta::FromMilliseconds(24);
7885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 10.f, 20.f);
7895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.OnMotionEvent(move1);
7905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_FALSE(GetLastEvent());
7915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
7925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
7935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Sample at a time beyond the first and second events.
7945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks extrapolated_time =
7955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      event_time + base::TimeDelta::FromMilliseconds(24);
7965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks flush_time = extrapolated_time + ResampleDelta();
7975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  buffer.Flush(flush_time);
7985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_TRUE(GetLastEvent());
7995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_FALSE(GetAndResetNeedsFlush());
8005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // There should only be one flushed event, with the event extrapolated from
8025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // the two events. The first and second events should be in the history.
8035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Note that the maximum extrapolation is limited by 8 ms.
8045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeTicks expected_time =
8055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move1.GetEventTime() + base::TimeDelta::FromMilliseconds(8);
8065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  float expected_alpha =
8075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      (expected_time - move0.GetEventTime()).InMillisecondsF() /
8085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      (move1.GetEventTime() - move0.GetEventTime()).InMillisecondsF();
8095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  MockMotionEvent extrapolated_event(
8105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      MotionEvent::ACTION_MOVE,
8115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      expected_time,
8125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move0.GetX(0) + (move1.GetX(0) - move0.GetX(0)) * expected_alpha,
8135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      move0.GetY(0) + (move1.GetY(0) - move0.GetY(0)) * expected_alpha);
8145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
8155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ASSERT_EQ(1U, events.size());
8165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EQ(2U, events.front()->GetHistorySize());
8175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), extrapolated_event);
8185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
8195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  EXPECT_EVENT_HISTORY_EQ(*events.front(), 1, move1);
8205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
8215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, ResamplingWithReorderedPointers) {
8235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
8255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, Resampling30to60) {
8275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta flush_time_delta =
8285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 60.);
8295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta event_time_delta =
8305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 30.);
8315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunResample(flush_time_delta, event_time_delta);
8335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
8345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, Resampling60to60) {
8365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta flush_time_delta =
8375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 60.);
8385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta event_time_delta =
8395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 60.);
8405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunResample(flush_time_delta, event_time_delta);
8425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
8435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, Resampling100to60) {
8455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta flush_time_delta =
8465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 60.);
8475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta event_time_delta =
8485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 100.);
8495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunResample(flush_time_delta, event_time_delta);
8515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
8525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, Resampling120to60) {
8545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta flush_time_delta =
8555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 60.);
8565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta event_time_delta =
8575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 120.);
8585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunResample(flush_time_delta, event_time_delta);
8605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
8615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(MotionEventBufferTest, Resampling150to60) {
8635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta flush_time_delta =
8645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 60.);
8655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::TimeDelta event_time_delta =
8665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      base::TimeDelta::FromMillisecondsD(1000. / 150.);
8675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  RunResample(flush_time_delta, event_time_delta);
8695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
8705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
8715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace ui
872