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/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_ = ScrollbarLayerImpl::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<ScrollbarLayerImpl> 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, AwakenByScrollGesture) {
48  base::TimeTicks time;
49  time += base::TimeDelta::FromSeconds(1);
50  scrollbar_controller_->DidScrollGestureBegin();
51  EXPECT_TRUE(scrollbar_controller_->IsScrollGestureInProgress());
52  EXPECT_FALSE(scrollbar_controller_->IsAnimating());
53  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
54
55  time += base::TimeDelta::FromSeconds(100);
56  scrollbar_controller_->Animate(time);
57  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
58  scrollbar_controller_->DidScrollGestureEnd(time);
59
60  EXPECT_FALSE(scrollbar_controller_->IsScrollGestureInProgress());
61  EXPECT_TRUE(scrollbar_controller_->IsAnimating());
62  EXPECT_EQ(2, scrollbar_controller_->DelayBeforeStart(time).InSeconds());
63
64  time += base::TimeDelta::FromSeconds(1);
65  scrollbar_controller_->Animate(time);
66  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
67
68  time += base::TimeDelta::FromSeconds(1);
69  scrollbar_controller_->Animate(time);
70  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
71
72  time += base::TimeDelta::FromSeconds(1);
73  scrollbar_controller_->Animate(time);
74  EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity());
75
76  time += base::TimeDelta::FromSeconds(1);
77  scrollbar_controller_->Animate(time);
78  EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity());
79
80  time += base::TimeDelta::FromSeconds(1);
81
82  scrollbar_controller_->DidScrollGestureBegin();
83  scrollbar_controller_->DidScrollGestureEnd(time);
84
85  time += base::TimeDelta::FromSeconds(1);
86  scrollbar_controller_->Animate(time);
87  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
88
89  time += base::TimeDelta::FromSeconds(1);
90  scrollbar_controller_->Animate(time);
91  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
92
93  time += base::TimeDelta::FromSeconds(1);
94  scrollbar_controller_->Animate(time);
95  EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity());
96
97  time += base::TimeDelta::FromSeconds(1);
98  scrollbar_controller_->Animate(time);
99  EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity());
100
101  time += base::TimeDelta::FromSeconds(1);
102  scrollbar_controller_->Animate(time);
103  EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity());
104}
105
106TEST_F(ScrollbarAnimationControllerLinearFadeTest, AwakenByProgrammaticScroll) {
107  base::TimeTicks time;
108  time += base::TimeDelta::FromSeconds(1);
109  scrollbar_controller_->DidProgrammaticallyUpdateScroll(time);
110  EXPECT_FALSE(scrollbar_controller_->IsScrollGestureInProgress());
111  EXPECT_TRUE(scrollbar_controller_->IsAnimating());
112  EXPECT_EQ(2, scrollbar_controller_->DelayBeforeStart(time).InSeconds());
113  scrollbar_controller_->Animate(time);
114  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
115
116  time += base::TimeDelta::FromSeconds(1);
117  scrollbar_controller_->Animate(time);
118  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
119  scrollbar_controller_->DidProgrammaticallyUpdateScroll(time);
120
121  time += base::TimeDelta::FromSeconds(1);
122  scrollbar_controller_->Animate(time);
123  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
124
125  time += base::TimeDelta::FromSeconds(1);
126  scrollbar_controller_->Animate(time);
127  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
128
129  time += base::TimeDelta::FromSeconds(1);
130  scrollbar_controller_->Animate(time);
131  EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity());
132
133  time += base::TimeDelta::FromSeconds(1);
134  scrollbar_controller_->Animate(time);
135  EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity());
136
137  time += base::TimeDelta::FromSeconds(1);
138  scrollbar_controller_->DidProgrammaticallyUpdateScroll(time);
139  time += base::TimeDelta::FromSeconds(1);
140  scrollbar_controller_->Animate(time);
141  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
142
143  time += base::TimeDelta::FromSeconds(1);
144  scrollbar_controller_->Animate(time);
145  EXPECT_FLOAT_EQ(1.0f, scrollbar_layer_->opacity());
146
147  time += base::TimeDelta::FromSeconds(1);
148  scrollbar_controller_->Animate(time);
149  EXPECT_FLOAT_EQ(2.0f / 3.0f, scrollbar_layer_->opacity());
150
151  time += base::TimeDelta::FromSeconds(1);
152  scrollbar_controller_->Animate(time);
153  EXPECT_FLOAT_EQ(1.0f / 3.0f, scrollbar_layer_->opacity());
154
155  time += base::TimeDelta::FromSeconds(1);
156  scrollbar_controller_->Animate(time);
157  EXPECT_FLOAT_EQ(0.0f, scrollbar_layer_->opacity());
158}
159
160}  // namespace
161}  // namespace cc
162