1// Copyright 2012 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. 4 5#include "cc/animation/scrollbar_animation_controller_linear_fade.h" 6 7#include "cc/layers/painted_scrollbar_layer_impl.h" 8#include "cc/test/fake_impl_proxy.h" 9#include "cc/test/fake_layer_tree_host_impl.h" 10#include "testing/gtest/include/gtest/gtest.h" 11 12namespace cc { 13namespace { 14 15class ScrollbarAnimationControllerLinearFadeTest : public testing::Test { 16 public: 17 ScrollbarAnimationControllerLinearFadeTest() : host_impl_(&proxy_) {} 18 19 protected: 20 virtual void SetUp() { 21 scroll_layer_ = LayerImpl::Create(host_impl_.active_tree(), 1); 22 scrollbar_layer_ = PaintedScrollbarLayerImpl::Create( 23 host_impl_.active_tree(), 2, HORIZONTAL); 24 25 scroll_layer_->SetMaxScrollOffset(gfx::Vector2d(50, 50)); 26 scroll_layer_->SetBounds(gfx::Size(50, 50)); 27 scroll_layer_->SetHorizontalScrollbarLayer(scrollbar_layer_.get()); 28 29 scrollbar_controller_ = ScrollbarAnimationControllerLinearFade::Create( 30 scroll_layer_.get(), 31 base::TimeDelta::FromSeconds(2), 32 base::TimeDelta::FromSeconds(3)); 33 } 34 35 FakeImplProxy proxy_; 36 FakeLayerTreeHostImpl host_impl_; 37 scoped_ptr<ScrollbarAnimationControllerLinearFade> scrollbar_controller_; 38 scoped_ptr<LayerImpl> scroll_layer_; 39 scoped_ptr<PaintedScrollbarLayerImpl> scrollbar_layer_; 40}; 41 42TEST_F(ScrollbarAnimationControllerLinearFadeTest, HiddenInBegin) { 43 scrollbar_controller_->Animate(base::TimeTicks()); 44 EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity()); 45} 46 47TEST_F(ScrollbarAnimationControllerLinearFadeTest, 48 HiddenAfterNonScrollingGesture) { 49 scrollbar_controller_->DidScrollGestureBegin(); 50 EXPECT_FALSE(scrollbar_controller_->IsAnimating()); 51 EXPECT_FALSE(scrollbar_controller_->Animate(base::TimeTicks())); 52 EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity()); 53 54 base::TimeTicks time; 55 time += base::TimeDelta::FromSeconds(100); 56 EXPECT_FALSE(scrollbar_controller_->Animate(time)); 57 EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity()); 58 scrollbar_controller_->DidScrollGestureEnd(time); 59 60 time += base::TimeDelta::FromSeconds(100); 61 EXPECT_FALSE(scrollbar_controller_->IsAnimating()); 62 EXPECT_FALSE(scrollbar_controller_->Animate(time)); 63 EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity()); 64} 65 66TEST_F(ScrollbarAnimationControllerLinearFadeTest, AwakenByScrollingGesture) { 67 base::TimeTicks time; 68 time += base::TimeDelta::FromSeconds(1); 69 scrollbar_controller_->DidScrollGestureBegin(); 70 scrollbar_controller_->Animate(time); 71 EXPECT_FALSE(scrollbar_controller_->IsAnimating()); 72 EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity()); 73 74 EXPECT_FALSE(scrollbar_controller_->DidScrollUpdate(time)); 75 EXPECT_FALSE(scrollbar_controller_->IsAnimating()); 76 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 77 78 time += base::TimeDelta::FromSeconds(100); 79 scrollbar_controller_->Animate(time); 80 EXPECT_FALSE(scrollbar_controller_->IsAnimating()); 81 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 82 scrollbar_controller_->DidScrollGestureEnd(time); 83 84 EXPECT_TRUE(scrollbar_controller_->IsAnimating()); 85 EXPECT_EQ(2, scrollbar_controller_->DelayBeforeStart(time).InSeconds()); 86 87 time += base::TimeDelta::FromSeconds(1); 88 scrollbar_controller_->Animate(time); 89 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 90 91 time += base::TimeDelta::FromSeconds(1); 92 scrollbar_controller_->Animate(time); 93 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 94 95 time += base::TimeDelta::FromSeconds(1); 96 scrollbar_controller_->Animate(time); 97 EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity()); 98 99 time += base::TimeDelta::FromSeconds(1); 100 scrollbar_controller_->Animate(time); 101 EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity()); 102 103 time += base::TimeDelta::FromSeconds(1); 104 105 scrollbar_controller_->DidScrollGestureBegin(); 106 EXPECT_FALSE(scrollbar_controller_->DidScrollUpdate(time)); 107 scrollbar_controller_->DidScrollGestureEnd(time); 108 109 time += base::TimeDelta::FromSeconds(1); 110 scrollbar_controller_->Animate(time); 111 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 112 113 time += base::TimeDelta::FromSeconds(1); 114 scrollbar_controller_->Animate(time); 115 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 116 117 time += base::TimeDelta::FromSeconds(1); 118 scrollbar_controller_->Animate(time); 119 EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity()); 120 121 time += base::TimeDelta::FromSeconds(1); 122 scrollbar_controller_->Animate(time); 123 EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity()); 124 125 time += base::TimeDelta::FromSeconds(1); 126 scrollbar_controller_->Animate(time); 127 EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity()); 128} 129 130TEST_F(ScrollbarAnimationControllerLinearFadeTest, AwakenByProgrammaticScroll) { 131 base::TimeTicks time; 132 time += base::TimeDelta::FromSeconds(1); 133 EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time)); 134 EXPECT_TRUE(scrollbar_controller_->IsAnimating()); 135 EXPECT_EQ(2, scrollbar_controller_->DelayBeforeStart(time).InSeconds()); 136 scrollbar_controller_->Animate(time); 137 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 138 139 time += base::TimeDelta::FromSeconds(1); 140 scrollbar_controller_->Animate(time); 141 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 142 EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time)); 143 144 time += base::TimeDelta::FromSeconds(1); 145 scrollbar_controller_->Animate(time); 146 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 147 148 time += base::TimeDelta::FromSeconds(1); 149 scrollbar_controller_->Animate(time); 150 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 151 152 time += base::TimeDelta::FromSeconds(1); 153 scrollbar_controller_->Animate(time); 154 EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity()); 155 156 time += base::TimeDelta::FromSeconds(1); 157 scrollbar_controller_->Animate(time); 158 EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity()); 159 160 time += base::TimeDelta::FromSeconds(1); 161 EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time)); 162 time += base::TimeDelta::FromSeconds(1); 163 scrollbar_controller_->Animate(time); 164 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 165 166 time += base::TimeDelta::FromSeconds(1); 167 scrollbar_controller_->Animate(time); 168 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 169 170 time += base::TimeDelta::FromSeconds(1); 171 scrollbar_controller_->Animate(time); 172 EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity()); 173 174 time += base::TimeDelta::FromSeconds(1); 175 scrollbar_controller_->Animate(time); 176 EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity()); 177 178 time += base::TimeDelta::FromSeconds(1); 179 scrollbar_controller_->Animate(time); 180 EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity()); 181} 182 183TEST_F(ScrollbarAnimationControllerLinearFadeTest, 184 AnimationPreservedByNonScrollingGesture) { 185 base::TimeTicks time; 186 time += base::TimeDelta::FromSeconds(1); 187 EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time)); 188 EXPECT_TRUE(scrollbar_controller_->IsAnimating()); 189 scrollbar_controller_->Animate(time); 190 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 191 192 time += base::TimeDelta::FromSeconds(3); 193 scrollbar_controller_->Animate(time); 194 EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity()); 195 196 scrollbar_controller_->DidScrollGestureBegin(); 197 EXPECT_TRUE(scrollbar_controller_->IsAnimating()); 198 EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity()); 199 200 time += base::TimeDelta::FromSeconds(1); 201 scrollbar_controller_->Animate(time); 202 EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity()); 203 204 scrollbar_controller_->DidScrollGestureEnd(time); 205 EXPECT_TRUE(scrollbar_controller_->IsAnimating()); 206 EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity()); 207 208 time += base::TimeDelta::FromSeconds(1); 209 EXPECT_FALSE(scrollbar_controller_->Animate(time)); 210 EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity()); 211} 212 213TEST_F(ScrollbarAnimationControllerLinearFadeTest, 214 AnimationOverriddenByScrollingGesture) { 215 base::TimeTicks time; 216 time += base::TimeDelta::FromSeconds(1); 217 EXPECT_TRUE(scrollbar_controller_->DidScrollUpdate(time)); 218 EXPECT_TRUE(scrollbar_controller_->IsAnimating()); 219 scrollbar_controller_->Animate(time); 220 EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity()); 221 222 time += base::TimeDelta::FromSeconds(3); 223 scrollbar_controller_->Animate(time); 224 EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity()); 225 226 scrollbar_controller_->DidScrollGestureBegin(); 227 EXPECT_TRUE(scrollbar_controller_->IsAnimating()); 228 EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity()); 229 230 time += base::TimeDelta::FromSeconds(1); 231 scrollbar_controller_->Animate(time); 232 EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity()); 233 234 time += base::TimeDelta::FromSeconds(1); 235 EXPECT_FALSE(scrollbar_controller_->DidScrollUpdate(time)); 236 EXPECT_FALSE(scrollbar_controller_->IsAnimating()); 237 EXPECT_FLOAT_EQ(1, scrollbar_layer_->opacity()); 238 239 time += base::TimeDelta::FromSeconds(1); 240 scrollbar_controller_->DidScrollGestureEnd(time); 241 EXPECT_TRUE(scrollbar_controller_->IsAnimating()); 242 EXPECT_FLOAT_EQ(1, scrollbar_layer_->opacity()); 243} 244 245} // namespace 246} // namespace cc 247