1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
|
// Copyright 2014 The Chromium Authors
// 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, static_cast<float>(INT_MAX),
INT_MIN, static_cast<float>(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
|