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