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