1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/basictypes.h"
6 #include "base/logging.h"
7 #include "base/time/time.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "ui/events/gesture_detection/motion_event_buffer.h"
10 #include "ui/events/test/motion_event_test_utils.h"
12 using base::TimeDelta;
13 using base::TimeTicks;
14 using ui::test::MockMotionEvent;
18 const int kSmallDeltaMs = 1;
19 const int kLargeDeltaMs = 50;
20 const int kResampleDeltaMs = 5;
21 const float kVelocityEpsilon = 0.01f;
22 const float kDeltaEpsilon = 0.1f;
24 #define EXPECT_EVENT_EQ(A, B) \
26 SCOPED_TRACE(testing::Message()); \
27 ExpectEquals((A), (B)); \
29 #define EXPECT_EVENT_IGNORING_HISTORY_EQ(A, B) \
31 SCOPED_TRACE(testing::Message()); \
32 ExpectEqualsIgnoringHistory((A), (B)); \
34 #define EXPECT_EVENT_HISTORY_EQ(A, I, B) \
36 SCOPED_TRACE(testing::Message()); \
37 ExpectEqualsHistoryIndex((A), (I), (B)); \
40 class MotionEventBufferTest : public testing::Test,
41 public MotionEventBufferClient {
43 MotionEventBufferTest() : needs_flush_(false) {}
44 ~MotionEventBufferTest() override {}
46 // MotionEventBufferClient implementation.
47 void ForwardMotionEvent(const MotionEvent& event) override {
48 forwarded_events_.push_back(event.Clone().release());
51 void SetNeedsFlush() override { needs_flush_ = true; }
53 bool GetAndResetNeedsFlush() {
54 bool needs_flush = needs_flush_;
59 ScopedVector<MotionEvent> GetAndResetForwardedEvents() {
60 ScopedVector<MotionEvent> forwarded_events;
61 forwarded_events.swap(forwarded_events_);
62 return forwarded_events.Pass();
65 const MotionEvent* GetLastEvent() const {
66 return forwarded_events_.empty() ? NULL : forwarded_events_.back();
69 static base::TimeDelta LargeDelta() {
70 return base::TimeDelta::FromMilliseconds(kLargeDeltaMs);
73 static base::TimeDelta SmallDelta() {
74 return base::TimeDelta::FromMilliseconds(kSmallDeltaMs);
77 static base::TimeDelta ResampleDelta() {
78 return base::TimeDelta::FromMilliseconds(kResampleDeltaMs);
81 static void ExpectEqualsImpl(const MotionEvent& a,
83 bool ignore_history) {
84 EXPECT_EQ(a.GetId(), b.GetId());
85 EXPECT_EQ(a.GetAction(), b.GetAction());
86 EXPECT_EQ(a.GetActionIndex(), b.GetActionIndex());
87 EXPECT_EQ(a.GetButtonState(), b.GetButtonState());
88 EXPECT_EQ(a.GetEventTime(), b.GetEventTime());
90 ASSERT_EQ(a.GetPointerCount(), b.GetPointerCount());
91 for (size_t i = 0; i < a.GetPointerCount(); ++i) {
92 int bi = b.FindPointerIndexOfId(a.GetPointerId(i));
94 EXPECT_EQ(a.GetX(i), b.GetX(bi));
95 EXPECT_EQ(a.GetY(i), b.GetY(bi));
96 EXPECT_EQ(a.GetRawX(i), b.GetRawX(bi));
97 EXPECT_EQ(a.GetRawY(i), b.GetRawY(bi));
98 EXPECT_EQ(a.GetTouchMajor(i), b.GetTouchMajor(bi));
99 EXPECT_EQ(a.GetTouchMinor(i), b.GetTouchMinor(bi));
100 EXPECT_EQ(a.GetOrientation(i), b.GetOrientation(bi));
101 EXPECT_EQ(a.GetPressure(i), b.GetPressure(bi));
102 EXPECT_EQ(a.GetToolType(i), b.GetToolType(bi));
108 ASSERT_EQ(a.GetHistorySize(), b.GetHistorySize());
109 for (size_t h = 0; h < a.GetHistorySize(); ++h)
110 ExpectEqualsHistoryIndex(a, h, b);
113 // Verify that all public data of |a|, excluding history, equals that of |b|.
114 static void ExpectEqualsIgnoringHistory(const MotionEvent& a,
115 const MotionEvent& b) {
116 const bool ignore_history = true;
117 ExpectEqualsImpl(a, b, ignore_history);
120 // Verify that all public data of |a| equals that of |b|.
121 static void ExpectEquals(const MotionEvent& a, const MotionEvent& b) {
122 const bool ignore_history = false;
123 ExpectEqualsImpl(a, b, ignore_history);
126 // Verify that the historical data of |a| given by |historical_index|
127 // corresponds to the *raw* data of |b|.
128 static void ExpectEqualsHistoryIndex(const MotionEvent& a,
129 size_t history_index,
130 const MotionEvent& b) {
131 ASSERT_LT(history_index, a.GetHistorySize());
132 EXPECT_EQ(a.GetPointerCount(), b.GetPointerCount());
133 EXPECT_TRUE(a.GetHistoricalEventTime(history_index) == b.GetEventTime());
135 for (size_t i = 0; i < a.GetPointerCount(); ++i) {
136 int bi = b.FindPointerIndexOfId(a.GetPointerId(i));
138 EXPECT_EQ(a.GetHistoricalX(i, history_index), b.GetX(bi));
139 EXPECT_EQ(a.GetHistoricalY(i, history_index), b.GetY(bi));
140 EXPECT_EQ(a.GetHistoricalTouchMajor(i, history_index),
141 b.GetTouchMajor(bi));
146 void RunResample(base::TimeDelta flush_time_delta,
147 base::TimeDelta event_time_delta) {
148 for (base::TimeDelta offset; offset < event_time_delta;
149 offset += event_time_delta / 3) {
150 SCOPED_TRACE(testing::Message()
151 << "Resample(offset="
152 << static_cast<int>(offset.InMilliseconds()) << "ms)");
153 RunResample(flush_time_delta, event_time_delta, offset);
157 // Given an event and flush sampling frequency, inject a stream of events,
158 // flushing at appropriate points in the stream. Verify that the continuous
159 // velocity sampled by the *input* stream matches the discrete velocity
160 // as computed from the resampled *output* stream.
161 void RunResample(base::TimeDelta flush_time_delta,
162 base::TimeDelta event_time_delta,
163 base::TimeDelta event_time_offset) {
164 base::TimeTicks event_time = base::TimeTicks::Now();
165 base::TimeTicks flush_time =
166 event_time + flush_time_delta - event_time_offset;
167 base::TimeTicks max_event_time =
168 event_time + base::TimeDelta::FromSecondsD(0.5f);
169 const size_t min_expected_events =
170 static_cast<size_t>((max_event_time - flush_time) /
171 std::max(event_time_delta, flush_time_delta));
173 MotionEventBuffer buffer(this, true);
175 gfx::Vector2dF velocity(33.f, -11.f);
176 gfx::PointF position(17.f, 42.f);
177 scoped_ptr<MotionEvent> last_flushed_event;
179 float last_dx = 0, last_dy = 0;
180 base::TimeDelta last_dt;
181 while (event_time < max_event_time) {
182 position += gfx::ScaleVector2d(velocity, event_time_delta.InSecondsF());
183 MockMotionEvent move(
184 MotionEvent::ACTION_MOVE, event_time, position.x(), position.y());
185 buffer.OnMotionEvent(move);
186 event_time += event_time_delta;
188 while (flush_time < event_time) {
189 buffer.Flush(flush_time);
190 flush_time += flush_time_delta;
191 const MotionEvent* current_flushed_event = GetLastEvent();
192 if (current_flushed_event) {
193 if (!last_flushed_event) {
194 last_flushed_event = current_flushed_event->Clone();
198 base::TimeDelta dt = current_flushed_event->GetEventTime() -
199 last_flushed_event->GetEventTime();
200 EXPECT_GE(dt.ToInternalValue(), 0);
201 // A time delta of 0 is possible if the flush rate is greater than the
202 // event rate, in which case we can simply skip forward.
203 if (dt == base::TimeDelta())
207 current_flushed_event->GetX() - last_flushed_event->GetX();
209 current_flushed_event->GetY() - last_flushed_event->GetY();
210 const float dt_s = (current_flushed_event->GetEventTime() -
211 last_flushed_event->GetEventTime()).InSecondsF();
213 // The discrete velocity should mirror the constant velocity.
214 EXPECT_NEAR(velocity.x(), dx / dt_s, kVelocityEpsilon);
215 EXPECT_NEAR(velocity.y(), dy / dt_s, kVelocityEpsilon);
217 // The impulse delta for each frame should remain constant.
219 EXPECT_NEAR(dx, last_dx, kDeltaEpsilon);
221 EXPECT_NEAR(dy, last_dy, kDeltaEpsilon);
223 // The timestamp delta should remain constant.
224 if (last_dt != base::TimeDelta())
225 EXPECT_TRUE((dt - last_dt).InMillisecondsF() < kDeltaEpsilon);
230 last_flushed_event = current_flushed_event->Clone();
231 events += GetAndResetForwardedEvents().size();
235 events += GetAndResetForwardedEvents().size();
236 EXPECT_GE(events, min_expected_events);
240 ScopedVector<MotionEvent> forwarded_events_;
244 TEST_F(MotionEventBufferTest, BufferEmpty) {
245 MotionEventBuffer buffer(this, true);
247 buffer.Flush(base::TimeTicks::Now());
248 EXPECT_FALSE(GetAndResetNeedsFlush());
249 EXPECT_FALSE(GetLastEvent());
252 TEST_F(MotionEventBufferTest, BufferWithOneMoveNotResampled) {
253 base::TimeTicks event_time = base::TimeTicks::Now();
254 MotionEventBuffer buffer(this, true);
256 MockMotionEvent move(MotionEvent::ACTION_MOVE, event_time, 4.f, 4.f);
257 buffer.OnMotionEvent(move);
258 EXPECT_TRUE(GetAndResetNeedsFlush());
259 EXPECT_FALSE(GetLastEvent());
261 buffer.Flush(event_time + ResampleDelta());
262 EXPECT_FALSE(GetAndResetNeedsFlush());
263 ASSERT_TRUE(GetLastEvent());
264 EXPECT_EVENT_EQ(move, *GetLastEvent());
265 EXPECT_EQ(1U, GetAndResetForwardedEvents().size());
268 TEST_F(MotionEventBufferTest, BufferFlushedOnNonActionMove) {
269 base::TimeTicks event_time = base::TimeTicks::Now();
270 MotionEventBuffer buffer(this, true);
272 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
273 buffer.OnMotionEvent(move0);
274 EXPECT_TRUE(GetAndResetNeedsFlush());
275 EXPECT_FALSE(GetLastEvent());
277 event_time += base::TimeDelta::FromMilliseconds(5);
279 // The second move should remain buffered.
280 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f);
281 buffer.OnMotionEvent(move1);
282 EXPECT_FALSE(GetAndResetNeedsFlush());
283 EXPECT_FALSE(GetLastEvent());
285 // The third move should remain buffered.
286 MockMotionEvent move2(MotionEvent::ACTION_MOVE, event_time, 3.f, 3.f);
287 buffer.OnMotionEvent(move2);
288 EXPECT_FALSE(GetAndResetNeedsFlush());
289 EXPECT_FALSE(GetLastEvent());
291 // The up should flush the buffer.
292 MockMotionEvent up(MotionEvent::ACTION_UP, event_time, 4.f, 4.f);
293 buffer.OnMotionEvent(up);
294 EXPECT_FALSE(GetAndResetNeedsFlush());
296 // The flushed events should include the up and the moves, with the latter
297 // combined into a single event with history.
298 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
299 ASSERT_EQ(2U, events.size());
300 EXPECT_EVENT_EQ(up, *events.back());
301 EXPECT_EQ(2U, events.front()->GetHistorySize());
302 EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), move2);
303 EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
304 EXPECT_EVENT_HISTORY_EQ(*events.front(), 1, move1);
307 TEST_F(MotionEventBufferTest, BufferFlushedOnIncompatibleActionMove) {
308 base::TimeTicks event_time = base::TimeTicks::Now();
309 MotionEventBuffer buffer(this, true);
311 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
312 buffer.OnMotionEvent(move0);
313 EXPECT_TRUE(GetAndResetNeedsFlush());
314 EXPECT_FALSE(GetLastEvent());
316 event_time += base::TimeDelta::FromMilliseconds(5);
318 // The second move has a different pointer count, flushing the first.
319 MockMotionEvent move1(
320 MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f, 3.f, 3.f);
321 buffer.OnMotionEvent(move1);
322 EXPECT_FALSE(GetAndResetNeedsFlush());
323 ASSERT_TRUE(GetLastEvent());
324 EXPECT_EVENT_EQ(move0, *GetLastEvent());
326 event_time += base::TimeDelta::FromMilliseconds(5);
328 // The third move has differing tool types, flushing the second.
329 MockMotionEvent move2(move1);
330 move2.SetToolType(0, MotionEvent::TOOL_TYPE_STYLUS);
331 buffer.OnMotionEvent(move2);
332 EXPECT_FALSE(GetAndResetNeedsFlush());
333 EXPECT_EVENT_EQ(move1, *GetLastEvent());
335 event_time += base::TimeDelta::FromMilliseconds(5);
337 // The flushed event should only include the latest move event.
338 buffer.Flush(event_time);
339 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
340 ASSERT_EQ(3U, events.size());
341 EXPECT_EVENT_EQ(move2, *events.back());
342 EXPECT_FALSE(GetAndResetNeedsFlush());
344 event_time += base::TimeDelta::FromMilliseconds(5);
346 // Events with different pointer ids should not combine.
347 PointerProperties pointer0(5.f, 5.f, 1.f);
349 PointerProperties pointer1(10.f, 10.f, 2.f);
351 MotionEventGeneric move3(MotionEvent::ACTION_MOVE, event_time, pointer0);
352 move3.PushPointer(pointer1);
353 buffer.OnMotionEvent(move3);
354 ASSERT_FALSE(GetLastEvent());
355 EXPECT_TRUE(GetAndResetNeedsFlush());
357 MotionEventGeneric move4(MotionEvent::ACTION_MOVE, event_time, pointer0);
359 move4.PushPointer(pointer1);
360 buffer.OnMotionEvent(move2);
361 EXPECT_FALSE(GetAndResetNeedsFlush());
362 ASSERT_TRUE(GetLastEvent());
363 EXPECT_EVENT_EQ(move3, *GetLastEvent());
366 TEST_F(MotionEventBufferTest, OnlyActionMoveBuffered) {
367 base::TimeTicks event_time = base::TimeTicks::Now();
368 MotionEventBuffer buffer(this, true);
370 MockMotionEvent down(MotionEvent::ACTION_DOWN, event_time, 1.f, 1.f);
371 buffer.OnMotionEvent(down);
372 EXPECT_FALSE(GetAndResetNeedsFlush());
373 ASSERT_TRUE(GetLastEvent());
374 EXPECT_EVENT_EQ(down, *GetLastEvent());
376 GetAndResetForwardedEvents();
378 MockMotionEvent up(MotionEvent::ACTION_UP, event_time, 2.f, 2.f);
379 buffer.OnMotionEvent(up);
380 EXPECT_FALSE(GetAndResetNeedsFlush());
381 ASSERT_TRUE(GetLastEvent());
382 EXPECT_EVENT_EQ(up, *GetLastEvent());
384 GetAndResetForwardedEvents();
386 MockMotionEvent cancel(MotionEvent::ACTION_CANCEL, event_time, 3.f, 3.f);
387 buffer.OnMotionEvent(cancel);
388 EXPECT_FALSE(GetAndResetNeedsFlush());
389 ASSERT_TRUE(GetLastEvent());
390 EXPECT_EVENT_EQ(cancel, *GetLastEvent());
392 GetAndResetForwardedEvents();
394 MockMotionEvent move(MotionEvent::ACTION_MOVE, event_time, 4.f, 4.f);
395 buffer.OnMotionEvent(move);
396 EXPECT_TRUE(GetAndResetNeedsFlush());
397 EXPECT_FALSE(GetLastEvent());
399 base::TimeTicks flush_time = move.GetEventTime() + ResampleDelta();
400 buffer.Flush(flush_time);
401 EXPECT_FALSE(GetAndResetNeedsFlush());
402 ASSERT_TRUE(GetLastEvent());
403 EXPECT_EVENT_EQ(move, *GetLastEvent());
406 TEST_F(MotionEventBufferTest, OutOfOrderPointersBuffered) {
407 base::TimeTicks event_time = base::TimeTicks::Now();
408 MotionEventBuffer buffer(this, true);
410 PointerProperties p0(1.f, 2.f, 3.f);
412 PointerProperties p1(2.f, 1.f, 0.5f);
415 MotionEventGeneric move0(MotionEvent::ACTION_MOVE, event_time, p0);
416 move0.PushPointer(p1);
417 buffer.OnMotionEvent(move0);
418 EXPECT_TRUE(GetAndResetNeedsFlush());
419 ASSERT_FALSE(GetLastEvent());
421 event_time += base::TimeDelta::FromMilliseconds(5);
423 // The second move should remain buffered even if the logical pointers are
424 // in a different order.
425 MotionEventGeneric move1(MotionEvent::ACTION_MOVE, event_time, p1);
426 move1.PushPointer(p0);
427 buffer.OnMotionEvent(move1);
428 EXPECT_FALSE(GetAndResetNeedsFlush());
429 ASSERT_FALSE(GetLastEvent());
431 // As the two events are logically the same but for ordering and time, the
432 // synthesized event should yield a logically identical event.
433 base::TimeTicks flush_time = move1.GetEventTime() + ResampleDelta();
434 buffer.Flush(flush_time);
435 EXPECT_FALSE(GetAndResetNeedsFlush());
436 ASSERT_TRUE(GetLastEvent());
437 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
438 ASSERT_EQ(1U, events.size());
439 EXPECT_EVENT_IGNORING_HISTORY_EQ(move1, *events.front());
440 EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
443 TEST_F(MotionEventBufferTest, FlushedEventsNeverLaterThanFlushTime) {
444 base::TimeTicks event_time = base::TimeTicks::Now();
445 MotionEventBuffer buffer(this, true);
447 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
448 buffer.OnMotionEvent(move0);
449 ASSERT_FALSE(GetLastEvent());
450 EXPECT_TRUE(GetAndResetNeedsFlush());
452 // The second move should remain buffered.
453 event_time += LargeDelta();
454 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f);
455 buffer.OnMotionEvent(move1);
456 ASSERT_FALSE(GetLastEvent());
457 EXPECT_FALSE(GetAndResetNeedsFlush());
459 // A flush occurring too early should not forward any events.
460 base::TimeTicks flush_time = move0.GetEventTime() - ResampleDelta();
461 buffer.Flush(flush_time);
462 ASSERT_FALSE(GetLastEvent());
463 EXPECT_TRUE(GetAndResetNeedsFlush());
465 // With resampling enabled, a flush occurring before the resample
466 // offset should not forward any events.
467 flush_time = move0.GetEventTime();
468 buffer.Flush(flush_time);
469 ASSERT_FALSE(GetLastEvent());
470 EXPECT_TRUE(GetAndResetNeedsFlush());
472 // Only the first event should get flushed, as the flush timestamp precedes
473 // the second's timestamp by a sufficient amount (preventing interpolation).
474 flush_time = move0.GetEventTime() + ResampleDelta();
475 buffer.Flush(flush_time);
477 // There should only be one flushed event.
478 EXPECT_TRUE(GetAndResetNeedsFlush());
479 ASSERT_TRUE(GetLastEvent());
480 EXPECT_TRUE(GetLastEvent()->GetEventTime() <= flush_time);
481 GetAndResetForwardedEvents();
483 // Flushing again with a similar timestamp should have no effect other than
484 // triggering another flush request.
485 flush_time += base::TimeDelta::FromMilliseconds(1);
486 buffer.Flush(flush_time);
487 EXPECT_FALSE(GetLastEvent());
488 EXPECT_TRUE(GetAndResetNeedsFlush());
490 // Flushing after the second move's time should trigger forwarding.
491 flush_time = move1.GetEventTime() + ResampleDelta();
492 buffer.Flush(flush_time);
493 ASSERT_TRUE(GetLastEvent());
494 EXPECT_EVENT_EQ(move1, *GetLastEvent());
495 EXPECT_FALSE(GetAndResetNeedsFlush());
498 TEST_F(MotionEventBufferTest, NoResamplingWhenDisabled) {
499 base::TimeTicks event_time = base::TimeTicks::Now();
500 const bool resampling_enabled = false;
501 MotionEventBuffer buffer(this, resampling_enabled);
504 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
505 buffer.OnMotionEvent(move0);
506 ASSERT_FALSE(GetLastEvent());
507 EXPECT_TRUE(GetAndResetNeedsFlush());
509 event_time += base::TimeDelta::FromMilliseconds(5);
510 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 15.f, 30.f);
511 buffer.OnMotionEvent(move1);
512 ASSERT_FALSE(GetLastEvent());
513 EXPECT_FALSE(GetAndResetNeedsFlush());
515 // Flush at a time between the first and second events.
516 base::TimeTicks interpolated_time =
517 move0.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime()) / 2;
518 base::TimeTicks flush_time = interpolated_time;
519 buffer.Flush(flush_time);
520 ASSERT_TRUE(GetLastEvent());
521 EXPECT_TRUE(GetAndResetNeedsFlush());
523 // There should only be one flushed event, with the second remaining buffered
524 // and no resampling having occurred.
525 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
526 ASSERT_EQ(1U, events.size());
527 EXPECT_EVENT_EQ(move0, *events.front());
529 // The second move should be flushed without resampling.
530 flush_time = move1.GetEventTime();
531 buffer.Flush(flush_time);
532 ASSERT_TRUE(GetLastEvent());
533 EXPECT_EVENT_EQ(move1, *GetLastEvent());
534 GetAndResetForwardedEvents();
536 // Now queue two more events.
537 move0 = MockMotionEvent(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
538 buffer.OnMotionEvent(move0);
539 ASSERT_FALSE(GetLastEvent());
540 EXPECT_TRUE(GetAndResetNeedsFlush());
542 // The second move should remain buffered.
543 event_time += base::TimeDelta::FromMilliseconds(5);
544 move1 = MockMotionEvent(MotionEvent::ACTION_MOVE, event_time, 10.f, 20.f);
545 buffer.OnMotionEvent(move1);
546 ASSERT_FALSE(GetLastEvent());
547 EXPECT_FALSE(GetAndResetNeedsFlush());
549 // Sample at a time beyond the first and second events.
551 move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime());
552 buffer.Flush(flush_time);
553 ASSERT_TRUE(GetLastEvent());
554 EXPECT_FALSE(GetAndResetNeedsFlush());
556 // There should only be one flushed event, with the first event in the history
557 // and the second event as the actual event data (no resampling).
558 events = GetAndResetForwardedEvents();
559 ASSERT_EQ(1U, events.size());
560 EXPECT_EQ(1U, events.front()->GetHistorySize());
561 EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), move1);
562 EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
565 TEST_F(MotionEventBufferTest, NoResamplingWithOutOfOrderActionMove) {
566 base::TimeTicks event_time = base::TimeTicks::Now();
567 MotionEventBuffer buffer(this, true);
569 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
570 buffer.OnMotionEvent(move0);
571 ASSERT_FALSE(GetLastEvent());
572 EXPECT_TRUE(GetAndResetNeedsFlush());
574 // The second move should remain buffered.
575 event_time += base::TimeDelta::FromMilliseconds(10);
576 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 10.f, 20.f);
577 buffer.OnMotionEvent(move1);
578 ASSERT_FALSE(GetLastEvent());
579 EXPECT_FALSE(GetAndResetNeedsFlush());
581 // Sample at a time beyond the first and second events.
582 base::TimeTicks extrapolated_time =
583 move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime());
584 base::TimeTicks flush_time = extrapolated_time + ResampleDelta();
585 buffer.Flush(flush_time);
586 ASSERT_TRUE(GetLastEvent());
587 EXPECT_FALSE(GetAndResetNeedsFlush());
589 // There should only be one flushed event, with the event extrapolated from
591 base::TimeTicks expected_time =
592 move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime()) / 2;
593 ScopedVector<MotionEvent> events0 = GetAndResetForwardedEvents();
594 ASSERT_EQ(1U, events0.size());
595 EXPECT_EQ(2U, events0.front()->GetHistorySize());
596 EXPECT_EQ(expected_time, events0.front()->GetEventTime());
597 EXPECT_FALSE(GetAndResetNeedsFlush());
599 // Try enqueuing an event *after* the second event but *before* the
600 // extrapolated event. It should be dropped.
601 event_time = move1.GetEventTime() + base::TimeDelta::FromMilliseconds(1);
602 MockMotionEvent move2(MotionEvent::ACTION_MOVE, event_time, 15.f, 25.f);
603 buffer.OnMotionEvent(move1);
604 ASSERT_FALSE(GetLastEvent());
605 EXPECT_FALSE(GetAndResetNeedsFlush());
607 // Finally queue an event *after* the extrapolated event.
608 event_time = expected_time + base::TimeDelta::FromMilliseconds(1);
609 MockMotionEvent move3(MotionEvent::ACTION_MOVE, event_time, 15.f, 25.f);
610 buffer.OnMotionEvent(move3);
611 ASSERT_FALSE(GetLastEvent());
612 EXPECT_TRUE(GetAndResetNeedsFlush());
614 // The flushed event should simply be the latest event.
615 flush_time = event_time + ResampleDelta();
616 buffer.Flush(flush_time);
617 ASSERT_TRUE(GetLastEvent());
618 ScopedVector<MotionEvent> events1 = GetAndResetForwardedEvents();
619 ASSERT_EQ(1U, events1.size());
620 EXPECT_EVENT_EQ(move3, *events1.front());
621 EXPECT_FALSE(GetAndResetNeedsFlush());
624 TEST_F(MotionEventBufferTest, NoResamplingWithSmallTimeDeltaBetweenMoves) {
625 base::TimeTicks event_time = base::TimeTicks::Now();
626 MotionEventBuffer buffer(this, true);
628 // The first move should be buffered.
629 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
630 buffer.OnMotionEvent(move0);
631 ASSERT_FALSE(GetLastEvent());
632 EXPECT_TRUE(GetAndResetNeedsFlush());
634 // The second move should remain buffered.
635 event_time += SmallDelta();
636 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f);
637 buffer.OnMotionEvent(move1);
638 ASSERT_FALSE(GetLastEvent());
639 EXPECT_FALSE(GetAndResetNeedsFlush());
641 base::TimeTicks flush_time = event_time + ResampleDelta();
642 buffer.Flush(flush_time);
643 EXPECT_FALSE(GetAndResetNeedsFlush());
645 // There should only be one flushed event, and no resampling should have
646 // occured between the first and the second as they were temporally too close.
647 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
648 ASSERT_EQ(1U, events.size());
649 EXPECT_EQ(1U, events.front()->GetHistorySize());
650 EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), move1);
651 EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
654 TEST_F(MotionEventBufferTest, NoResamplingWithMismatchBetweenMoves) {
655 base::TimeTicks event_time = base::TimeTicks::Now();
656 MotionEventBuffer buffer(this, true);
658 // The first move should be buffered.
659 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 1.f, 1.f);
660 buffer.OnMotionEvent(move0);
661 ASSERT_FALSE(GetLastEvent());
662 EXPECT_TRUE(GetAndResetNeedsFlush());
664 // The second move should remain buffered.
665 event_time += SmallDelta();
666 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 2.f, 2.f);
667 buffer.OnMotionEvent(move1);
668 ASSERT_FALSE(GetLastEvent());
669 EXPECT_FALSE(GetAndResetNeedsFlush());
671 base::TimeTicks flush_time = event_time + ResampleDelta();
672 buffer.Flush(flush_time);
673 EXPECT_FALSE(GetAndResetNeedsFlush());
675 // There should only be one flushed event, and no resampling should have
676 // occured between the first and the second as they were temporally too close.
677 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
678 ASSERT_EQ(1U, events.size());
679 EXPECT_EQ(1U, events.front()->GetHistorySize());
680 EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), move1);
681 EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
684 TEST_F(MotionEventBufferTest, Interpolation) {
685 base::TimeTicks event_time = base::TimeTicks::Now();
686 MotionEventBuffer buffer(this, true);
688 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
689 buffer.OnMotionEvent(move0);
690 ASSERT_FALSE(GetLastEvent());
691 EXPECT_TRUE(GetAndResetNeedsFlush());
693 // The second move should remain buffered.
694 event_time += base::TimeDelta::FromMilliseconds(5);
695 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 15.f, 30.f);
696 buffer.OnMotionEvent(move1);
697 ASSERT_FALSE(GetLastEvent());
698 EXPECT_FALSE(GetAndResetNeedsFlush());
700 // Sample at a time between the first and second events.
701 base::TimeTicks interpolated_time =
702 move0.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime()) / 3;
703 base::TimeTicks flush_time = interpolated_time + ResampleDelta();
704 buffer.Flush(flush_time);
705 ASSERT_TRUE(GetLastEvent());
706 EXPECT_TRUE(GetAndResetNeedsFlush());
708 // There should only be one flushed event, with the event interpolated between
709 // the two events. The second event should remain buffered.
710 float alpha = (interpolated_time - move0.GetEventTime()).InMillisecondsF() /
711 (move1.GetEventTime() - move0.GetEventTime()).InMillisecondsF();
712 MockMotionEvent interpolated_event(
713 MotionEvent::ACTION_MOVE,
715 move0.GetX(0) + (move1.GetX(0) - move0.GetX(0)) * alpha,
716 move0.GetY(0) + (move1.GetY(0) - move0.GetY(0)) * alpha);
717 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
718 ASSERT_EQ(1U, events.size());
719 EXPECT_EQ(1U, events.front()->GetHistorySize());
720 EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), interpolated_event);
721 EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
723 // The second move should be flushed without resampling.
724 flush_time = move1.GetEventTime() + ResampleDelta();
725 buffer.Flush(flush_time);
726 ASSERT_TRUE(GetLastEvent());
727 EXPECT_EVENT_EQ(move1, *GetLastEvent());
730 TEST_F(MotionEventBufferTest, Extrapolation) {
731 base::TimeTicks event_time = base::TimeTicks::Now();
732 MotionEventBuffer buffer(this, true);
734 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
735 buffer.OnMotionEvent(move0);
736 ASSERT_FALSE(GetLastEvent());
737 EXPECT_TRUE(GetAndResetNeedsFlush());
739 // The second move should remain buffered.
740 event_time += base::TimeDelta::FromMilliseconds(5);
741 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 10.f, 20.f);
742 buffer.OnMotionEvent(move1);
743 ASSERT_FALSE(GetLastEvent());
744 EXPECT_FALSE(GetAndResetNeedsFlush());
746 // Sample at a time beyond the first and second events.
747 base::TimeTicks extrapolated_time =
748 move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime());
749 base::TimeTicks flush_time = extrapolated_time + ResampleDelta();
750 buffer.Flush(flush_time);
751 ASSERT_TRUE(GetLastEvent());
752 EXPECT_FALSE(GetAndResetNeedsFlush());
754 // There should only be one flushed event, with the event extrapolated from
755 // the two events. The first and second events should be in the history.
756 // Note that the maximum extrapolation is limited by *half* of the time delta
757 // between the two events, hence we divide the relative delta by 2 in
758 // determining the extrapolated event.
759 base::TimeTicks expected_time =
760 move1.GetEventTime() + (move1.GetEventTime() - move0.GetEventTime()) / 2;
761 float expected_alpha =
762 (expected_time - move0.GetEventTime()).InMillisecondsF() /
763 (move1.GetEventTime() - move0.GetEventTime()).InMillisecondsF();
764 MockMotionEvent extrapolated_event(
765 MotionEvent::ACTION_MOVE,
767 move0.GetX(0) + (move1.GetX(0) - move0.GetX(0)) * expected_alpha,
768 move0.GetY(0) + (move1.GetY(0) - move0.GetY(0)) * expected_alpha);
769 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
770 ASSERT_EQ(1U, events.size());
771 EXPECT_EQ(2U, events.front()->GetHistorySize());
772 EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), extrapolated_event);
773 EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
774 EXPECT_EVENT_HISTORY_EQ(*events.front(), 1, move1);
777 TEST_F(MotionEventBufferTest, ExtrapolationHorizonLimited) {
778 base::TimeTicks event_time = base::TimeTicks::Now();
779 MotionEventBuffer buffer(this, true);
781 MockMotionEvent move0(MotionEvent::ACTION_MOVE, event_time, 5.f, 10.f);
782 buffer.OnMotionEvent(move0);
783 ASSERT_FALSE(GetLastEvent());
784 EXPECT_TRUE(GetAndResetNeedsFlush());
786 // The second move should remain buffered.
787 event_time += base::TimeDelta::FromMilliseconds(24);
788 MockMotionEvent move1(MotionEvent::ACTION_MOVE, event_time, 10.f, 20.f);
789 buffer.OnMotionEvent(move1);
790 ASSERT_FALSE(GetLastEvent());
791 EXPECT_FALSE(GetAndResetNeedsFlush());
793 // Sample at a time beyond the first and second events.
794 base::TimeTicks extrapolated_time =
795 event_time + base::TimeDelta::FromMilliseconds(24);
796 base::TimeTicks flush_time = extrapolated_time + ResampleDelta();
797 buffer.Flush(flush_time);
798 ASSERT_TRUE(GetLastEvent());
799 EXPECT_FALSE(GetAndResetNeedsFlush());
801 // There should only be one flushed event, with the event extrapolated from
802 // the two events. The first and second events should be in the history.
803 // Note that the maximum extrapolation is limited by 8 ms.
804 base::TimeTicks expected_time =
805 move1.GetEventTime() + base::TimeDelta::FromMilliseconds(8);
806 float expected_alpha =
807 (expected_time - move0.GetEventTime()).InMillisecondsF() /
808 (move1.GetEventTime() - move0.GetEventTime()).InMillisecondsF();
809 MockMotionEvent extrapolated_event(
810 MotionEvent::ACTION_MOVE,
812 move0.GetX(0) + (move1.GetX(0) - move0.GetX(0)) * expected_alpha,
813 move0.GetY(0) + (move1.GetY(0) - move0.GetY(0)) * expected_alpha);
814 ScopedVector<MotionEvent> events = GetAndResetForwardedEvents();
815 ASSERT_EQ(1U, events.size());
816 EXPECT_EQ(2U, events.front()->GetHistorySize());
817 EXPECT_EVENT_IGNORING_HISTORY_EQ(*events.front(), extrapolated_event);
818 EXPECT_EVENT_HISTORY_EQ(*events.front(), 0, move0);
819 EXPECT_EVENT_HISTORY_EQ(*events.front(), 1, move1);
822 TEST_F(MotionEventBufferTest, ResamplingWithReorderedPointers) {
826 TEST_F(MotionEventBufferTest, Resampling30to60) {
827 base::TimeDelta flush_time_delta =
828 base::TimeDelta::FromMillisecondsD(1000. / 60.);
829 base::TimeDelta event_time_delta =
830 base::TimeDelta::FromMillisecondsD(1000. / 30.);
832 RunResample(flush_time_delta, event_time_delta);
835 TEST_F(MotionEventBufferTest, Resampling60to60) {
836 base::TimeDelta flush_time_delta =
837 base::TimeDelta::FromMillisecondsD(1000. / 60.);
838 base::TimeDelta event_time_delta =
839 base::TimeDelta::FromMillisecondsD(1000. / 60.);
841 RunResample(flush_time_delta, event_time_delta);
844 TEST_F(MotionEventBufferTest, Resampling100to60) {
845 base::TimeDelta flush_time_delta =
846 base::TimeDelta::FromMillisecondsD(1000. / 60.);
847 base::TimeDelta event_time_delta =
848 base::TimeDelta::FromMillisecondsD(1000. / 100.);
850 RunResample(flush_time_delta, event_time_delta);
853 TEST_F(MotionEventBufferTest, Resampling120to60) {
854 base::TimeDelta flush_time_delta =
855 base::TimeDelta::FromMillisecondsD(1000. / 60.);
856 base::TimeDelta event_time_delta =
857 base::TimeDelta::FromMillisecondsD(1000. / 120.);
859 RunResample(flush_time_delta, event_time_delta);
862 TEST_F(MotionEventBufferTest, Resampling150to60) {
863 base::TimeDelta flush_time_delta =
864 base::TimeDelta::FromMillisecondsD(1000. / 60.);
865 base::TimeDelta event_time_delta =
866 base::TimeDelta::FromMillisecondsD(1000. / 150.);
868 RunResample(flush_time_delta, event_time_delta);