1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/time/time.h"
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "ui/gfx/android/scroller.h"
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace gfx {
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace {
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const float kDefaultStartX = 7.f;
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const float kDefaultStartY = 25.f;
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const float kDefaultDeltaX = -20.f;
16a3f7b4e666c476898878fa745f637129375cd889Ben Murdochconst float kDefaultDeltaY = 73.f;
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const float kDefaultVelocityX = -35.f;
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const float kDefaultVelocityY = 22.f;
19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)const float kEpsilon = 1e-3f;
20868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)Scroller::Config DefaultConfig() {
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return Scroller::Config();
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
24a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch
2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}  // namespace
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class ScrollerTest : public testing::Test {};
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)TEST_F(ScrollerTest, Scroll) {
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  Scroller scroller(DefaultConfig());
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  base::TimeTicks start_time = base::TimeTicks::Now();
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
33d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Start a scroll and verify initialized values.
34d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  scroller.StartScroll(kDefaultStartX,
35d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                       kDefaultStartY,
36d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch                       kDefaultDeltaX,
37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       kDefaultDeltaY,
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                       start_time);
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kDefaultStartX, scroller.GetStartX());
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(kDefaultStartY, scroller.GetStartY());
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(kDefaultStartX, scroller.GetCurrX());
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kDefaultStartY, scroller.GetCurrY());
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kDefaultStartX + kDefaultDeltaX, scroller.GetFinalX());
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(kDefaultStartY + kDefaultDeltaY, scroller.GetFinalY());
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(scroller.IsFinished());
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_EQ(base::TimeDelta(), scroller.GetTimePassed());
48d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch
49d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  // Advance halfway through the scroll.
50d3868032626d59662ff73b372b5d584c1d144c53Ben Murdoch  const base::TimeDelta scroll_duration = scroller.GetDuration();
51868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  scroller.ComputeScrollOffset(start_time + scroll_duration / 2);
52868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
53868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Ensure we've moved in the direction of the delta, but have yet to reach
54868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // the target.
55868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_GT(kDefaultStartX, scroller.GetCurrX());
56868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_LT(kDefaultStartY, scroller.GetCurrY());
57868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_LT(scroller.GetFinalX(), scroller.GetCurrX());
58868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_GT(scroller.GetFinalY(), scroller.GetCurrY());
59868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_FALSE(scroller.IsFinished());
60868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
61868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Ensure our velocity is non-zero and in the same direction as the delta.
62a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  EXPECT_GT(0.f, scroller.GetCurrVelocityX() * kDefaultDeltaX);
63868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  EXPECT_GT(0.f, scroller.GetCurrVelocityY() * kDefaultDeltaY);
643551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  EXPECT_TRUE(scroller.IsScrollingInDirection(kDefaultDeltaX, kDefaultDeltaY));
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
66868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Repeated offset computations at the same timestamp should yield identical
67868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // results.
68  float curr_x = scroller.GetCurrX();
69  float curr_y = scroller.GetCurrY();
70  float curr_velocity_x = scroller.GetCurrVelocityX();
71  float curr_velocity_y = scroller.GetCurrVelocityY();
72  scroller.ComputeScrollOffset(start_time + scroll_duration / 2);
73  EXPECT_EQ(curr_x, scroller.GetCurrX());
74  EXPECT_EQ(curr_y, scroller.GetCurrY());
75  EXPECT_EQ(curr_velocity_x, scroller.GetCurrVelocityX());
76  EXPECT_EQ(curr_velocity_y, scroller.GetCurrVelocityY());
77
78  // Advance to the end.
79  scroller.ComputeScrollOffset(start_time + scroll_duration);
80  EXPECT_EQ(scroller.GetFinalX(), scroller.GetCurrX());
81  EXPECT_EQ(scroller.GetFinalY(), scroller.GetCurrY());
82  EXPECT_TRUE(scroller.IsFinished());
83  EXPECT_EQ(scroll_duration, scroller.GetTimePassed());
84  EXPECT_NEAR(0.f, scroller.GetCurrVelocityX(), kEpsilon);
85  EXPECT_NEAR(0.f, scroller.GetCurrVelocityY(), kEpsilon);
86
87  // Try to advance further; nothing should change.
88  scroller.ComputeScrollOffset(start_time + scroll_duration * 2);
89  EXPECT_EQ(scroller.GetFinalX(), scroller.GetCurrX());
90  EXPECT_EQ(scroller.GetFinalY(), scroller.GetCurrY());
91  EXPECT_TRUE(scroller.IsFinished());
92  EXPECT_EQ(scroll_duration, scroller.GetTimePassed());
93}
94
95TEST_F(ScrollerTest, Fling) {
96  Scroller scroller(DefaultConfig());
97  base::TimeTicks start_time = base::TimeTicks::Now();
98
99  // Start a fling and verify initialized values.
100  scroller.Fling(kDefaultStartX,
101                 kDefaultStartY,
102                 kDefaultVelocityX,
103                 kDefaultVelocityY,
104                 INT_MIN,
105                 INT_MAX,
106                 INT_MIN,
107                 INT_MAX,
108                 start_time);
109
110  EXPECT_EQ(kDefaultStartX, scroller.GetStartX());
111  EXPECT_EQ(kDefaultStartY, scroller.GetStartY());
112  EXPECT_EQ(kDefaultStartX, scroller.GetCurrX());
113  EXPECT_EQ(kDefaultStartY, scroller.GetCurrY());
114  EXPECT_GT(kDefaultStartX, scroller.GetFinalX());
115  EXPECT_LT(kDefaultStartY, scroller.GetFinalY());
116  EXPECT_FALSE(scroller.IsFinished());
117  EXPECT_EQ(base::TimeDelta(), scroller.GetTimePassed());
118
119  // Advance halfway through the fling.
120  const base::TimeDelta scroll_duration = scroller.GetDuration();
121  scroller.ComputeScrollOffset(start_time + scroll_duration / 2);
122
123  // Ensure we've moved in the direction of the velocity, but have yet to reach
124  // the target.
125  EXPECT_GT(kDefaultStartX, scroller.GetCurrX());
126  EXPECT_LT(kDefaultStartY, scroller.GetCurrY());
127  EXPECT_LT(scroller.GetFinalX(), scroller.GetCurrX());
128  EXPECT_GT(scroller.GetFinalY(), scroller.GetCurrY());
129  EXPECT_FALSE(scroller.IsFinished());
130
131  // Ensure our velocity is non-zero and in the same direction as the original
132  // velocity.
133  EXPECT_LT(0.f, scroller.GetCurrVelocityX() * kDefaultVelocityX);
134  EXPECT_LT(0.f, scroller.GetCurrVelocityY() * kDefaultVelocityY);
135  EXPECT_TRUE(
136      scroller.IsScrollingInDirection(kDefaultVelocityX, kDefaultVelocityY));
137
138  // Repeated offset computations at the same timestamp should yield identical
139  // results.
140  float curr_x = scroller.GetCurrX();
141  float curr_y = scroller.GetCurrY();
142  float curr_velocity_x = scroller.GetCurrVelocityX();
143  float curr_velocity_y = scroller.GetCurrVelocityY();
144  scroller.ComputeScrollOffset(start_time + scroll_duration / 2);
145  EXPECT_EQ(curr_x, scroller.GetCurrX());
146  EXPECT_EQ(curr_y, scroller.GetCurrY());
147  EXPECT_EQ(curr_velocity_x, scroller.GetCurrVelocityX());
148  EXPECT_EQ(curr_velocity_y, scroller.GetCurrVelocityY());
149
150  // Advance to the end.
151  scroller.ComputeScrollOffset(start_time + scroll_duration);
152  EXPECT_EQ(scroller.GetFinalX(), scroller.GetCurrX());
153  EXPECT_EQ(scroller.GetFinalY(), scroller.GetCurrY());
154  EXPECT_TRUE(scroller.IsFinished());
155  EXPECT_EQ(scroll_duration, scroller.GetTimePassed());
156  EXPECT_NEAR(0.f, scroller.GetCurrVelocityX(), kEpsilon);
157  EXPECT_NEAR(0.f, scroller.GetCurrVelocityY(), kEpsilon);
158
159  // Try to advance further; nothing should change.
160  scroller.ComputeScrollOffset(start_time + scroll_duration * 2);
161  EXPECT_EQ(scroller.GetFinalX(), scroller.GetCurrX());
162  EXPECT_EQ(scroller.GetFinalY(), scroller.GetCurrY());
163  EXPECT_TRUE(scroller.IsFinished());
164  EXPECT_EQ(scroll_duration, scroller.GetTimePassed());
165}
166
167}  // namespace gfx
168