| // Copyright 2014 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <limits.h> |
| |
| #include "base/time/time.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "ui/events/mobile_scroller.h" |
| |
| namespace ui { |
| namespace { |
| |
| const float kDefaultStartX = 7.f; |
| const float kDefaultStartY = 25.f; |
| const float kDefaultDeltaX = -20.f; |
| const float kDefaultDeltaY = 73.f; |
| const float kDefaultVelocityX = -350.f; |
| const float kDefaultVelocityY = 220.f; |
| const float kEpsilon = 1e-3f; |
| |
| MobileScroller::Config DefaultConfig() { |
| return MobileScroller::Config(); |
| } |
| |
| } // namespace |
| |
| using MobileScrollerTest = testing::Test; |
| |
| TEST_F(MobileScrollerTest, Scroll) { |
| MobileScroller scroller(DefaultConfig()); |
| base::TimeTicks start_time = base::TimeTicks::Now(); |
| |
| // Start a scroll and verify initialized values. |
| scroller.StartScroll(kDefaultStartX, kDefaultStartY, kDefaultDeltaX, |
| kDefaultDeltaY, start_time); |
| |
| EXPECT_EQ(kDefaultStartX, scroller.GetStartX()); |
| EXPECT_EQ(kDefaultStartY, scroller.GetStartY()); |
| EXPECT_EQ(kDefaultStartX, scroller.GetCurrX()); |
| EXPECT_EQ(kDefaultStartY, scroller.GetCurrY()); |
| EXPECT_EQ(kDefaultStartX + kDefaultDeltaX, scroller.GetFinalX()); |
| EXPECT_EQ(kDefaultStartY + kDefaultDeltaY, scroller.GetFinalY()); |
| EXPECT_FALSE(scroller.IsFinished()); |
| EXPECT_EQ(base::TimeDelta(), scroller.GetTimePassed()); |
| |
| // Advance halfway through the scroll. |
| const base::TimeDelta scroll_duration = scroller.GetDuration(); |
| gfx::Vector2dF offset, velocity; |
| EXPECT_TRUE(scroller.ComputeScrollOffset(start_time + scroll_duration / 2, |
| &offset, &velocity)); |
| |
| // Ensure we've moved in the direction of the delta, but have yet to reach |
| // the target. |
| EXPECT_GT(kDefaultStartX, offset.x()); |
| EXPECT_LT(kDefaultStartY, offset.y()); |
| EXPECT_LT(scroller.GetFinalX(), offset.x()); |
| EXPECT_GT(scroller.GetFinalY(), offset.y()); |
| EXPECT_FALSE(scroller.IsFinished()); |
| |
| // Ensure our velocity is non-zero and in the same direction as the delta. |
| EXPECT_GT(0.f, velocity.x() * kDefaultDeltaX); |
| EXPECT_GT(0.f, velocity.y() * kDefaultDeltaY); |
| EXPECT_TRUE(scroller.IsScrollingInDirection(kDefaultDeltaX, kDefaultDeltaY)); |
| |
| // Repeated offset computations at the same timestamp should yield identical |
| // results. |
| float curr_x = offset.x(); |
| float curr_y = offset.y(); |
| float curr_velocity_x = velocity.x(); |
| float curr_velocity_y = velocity.y(); |
| EXPECT_TRUE(scroller.ComputeScrollOffset(start_time + scroll_duration / 2, |
| &offset, &velocity)); |
| EXPECT_EQ(curr_x, offset.x()); |
| EXPECT_EQ(curr_y, offset.y()); |
| EXPECT_EQ(curr_velocity_x, velocity.x()); |
| EXPECT_EQ(curr_velocity_y, velocity.y()); |
| |
| // Advance to the end. |
| EXPECT_FALSE(scroller.ComputeScrollOffset(start_time + scroll_duration, |
| &offset, &velocity)); |
| EXPECT_EQ(scroller.GetFinalX(), offset.x()); |
| EXPECT_EQ(scroller.GetFinalY(), offset.y()); |
| EXPECT_TRUE(scroller.IsFinished()); |
| EXPECT_EQ(scroll_duration, scroller.GetTimePassed()); |
| EXPECT_NEAR(0.f, velocity.x(), kEpsilon); |
| EXPECT_NEAR(0.f, velocity.y(), kEpsilon); |
| |
| // Try to advance further; nothing should change. |
| EXPECT_FALSE(scroller.ComputeScrollOffset(start_time + scroll_duration * 2, |
| &offset, &velocity)); |
| EXPECT_EQ(scroller.GetFinalX(), offset.x()); |
| EXPECT_EQ(scroller.GetFinalY(), offset.y()); |
| EXPECT_TRUE(scroller.IsFinished()); |
| EXPECT_EQ(scroll_duration, scroller.GetTimePassed()); |
| } |
| |
| TEST_F(MobileScrollerTest, Fling) { |
| MobileScroller scroller(DefaultConfig()); |
| base::TimeTicks start_time = base::TimeTicks::Now(); |
| |
| // Start a fling and verify initialized values. |
| scroller.Fling(kDefaultStartX, kDefaultStartY, kDefaultVelocityX, |
| kDefaultVelocityY, INT_MIN, INT_MAX, INT_MIN, INT_MAX, |
| start_time); |
| |
| EXPECT_EQ(kDefaultStartX, scroller.GetStartX()); |
| EXPECT_EQ(kDefaultStartY, scroller.GetStartY()); |
| EXPECT_EQ(kDefaultStartX, scroller.GetCurrX()); |
| EXPECT_EQ(kDefaultStartY, scroller.GetCurrY()); |
| EXPECT_GT(kDefaultStartX, scroller.GetFinalX()); |
| EXPECT_LT(kDefaultStartY, scroller.GetFinalY()); |
| EXPECT_FALSE(scroller.IsFinished()); |
| EXPECT_EQ(base::TimeDelta(), scroller.GetTimePassed()); |
| |
| // Advance halfway through the fling. |
| const base::TimeDelta scroll_duration = scroller.GetDuration(); |
| gfx::Vector2dF offset, velocity; |
| scroller.ComputeScrollOffset(start_time + scroll_duration / 2, &offset, |
| &velocity); |
| |
| // Ensure we've moved in the direction of the velocity, but have yet to reach |
| // the target. |
| EXPECT_GT(kDefaultStartX, offset.x()); |
| EXPECT_LT(kDefaultStartY, offset.y()); |
| EXPECT_LT(scroller.GetFinalX(), offset.x()); |
| EXPECT_GT(scroller.GetFinalY(), offset.y()); |
| EXPECT_FALSE(scroller.IsFinished()); |
| |
| // Ensure our velocity is non-zero and in the same direction as the original |
| // velocity. |
| EXPECT_LT(0.f, velocity.x() * kDefaultVelocityX); |
| EXPECT_LT(0.f, velocity.y() * kDefaultVelocityY); |
| EXPECT_TRUE( |
| scroller.IsScrollingInDirection(kDefaultVelocityX, kDefaultVelocityY)); |
| |
| // Repeated offset computations at the same timestamp should yield identical |
| // results. |
| float curr_x = offset.x(); |
| float curr_y = offset.y(); |
| float curr_velocity_x = velocity.x(); |
| float curr_velocity_y = velocity.y(); |
| EXPECT_TRUE(scroller.ComputeScrollOffset(start_time + scroll_duration / 2, |
| &offset, &velocity)); |
| EXPECT_EQ(curr_x, offset.x()); |
| EXPECT_EQ(curr_y, offset.y()); |
| EXPECT_EQ(curr_velocity_x, velocity.x()); |
| EXPECT_EQ(curr_velocity_y, velocity.y()); |
| |
| // Advance to the end. |
| EXPECT_FALSE(scroller.ComputeScrollOffset(start_time + scroll_duration, |
| &offset, &velocity)); |
| EXPECT_EQ(scroller.GetFinalX(), offset.x()); |
| EXPECT_EQ(scroller.GetFinalY(), offset.y()); |
| EXPECT_TRUE(scroller.IsFinished()); |
| EXPECT_EQ(scroll_duration, scroller.GetTimePassed()); |
| EXPECT_NEAR(0.f, velocity.x(), kEpsilon); |
| EXPECT_NEAR(0.f, velocity.y(), kEpsilon); |
| |
| // Try to advance further; nothing should change. |
| EXPECT_FALSE(scroller.ComputeScrollOffset(start_time + scroll_duration * 2, |
| &offset, &velocity)); |
| EXPECT_EQ(scroller.GetFinalX(), offset.x()); |
| EXPECT_EQ(scroller.GetFinalY(), offset.y()); |
| EXPECT_TRUE(scroller.IsFinished()); |
| EXPECT_EQ(scroll_duration, scroller.GetTimePassed()); |
| } |
| |
| } // namespace ui |