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/animation.h"
6
7#include "cc/test/animation_test_common.h"
8#include "testing/gmock/include/gmock/gmock.h"
9#include "testing/gtest/include/gtest/gtest.h"
10
11namespace cc {
12namespace {
13
14scoped_ptr<Animation> CreateAnimation(int iterations, double duration) {
15  scoped_ptr<Animation> to_return(Animation::Create(
16      make_scoped_ptr(
17          new FakeFloatAnimationCurve(duration)).PassAs<AnimationCurve>(),
18      0,
19      1,
20      Animation::Opacity));
21  to_return->set_iterations(iterations);
22  return to_return.Pass();
23}
24
25scoped_ptr<Animation> CreateAnimation(int iterations) {
26  return CreateAnimation(iterations, 1);
27}
28
29TEST(AnimationTest, TrimTimeZeroIterations) {
30  scoped_ptr<Animation> anim(CreateAnimation(0));
31  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(-1.0));
32  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
33  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(1.0));
34}
35
36TEST(AnimationTest, TrimTimeOneIteration) {
37  scoped_ptr<Animation> anim(CreateAnimation(1));
38  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(-1.0));
39  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
40  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(1.0));
41  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(2.0));
42}
43
44TEST(AnimationTest, TrimTimeInfiniteIterations) {
45  scoped_ptr<Animation> anim(CreateAnimation(-1));
46  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
47  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
48  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(1.0));
49  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(1.5));
50}
51
52TEST(AnimationTest, TrimTimeAlternating) {
53  scoped_ptr<Animation> anim(CreateAnimation(-1));
54  anim->set_alternates_direction(true);
55  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
56  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
57  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(1.0));
58  EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(1.25));
59}
60
61TEST(AnimationTest, TrimTimeStartTime) {
62  scoped_ptr<Animation> anim(CreateAnimation(1));
63  anim->set_start_time(4);
64  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
65  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(4.0));
66  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(4.5));
67  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(5.0));
68  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(6.0));
69}
70
71TEST(AnimationTest, TrimTimeTimeOffset) {
72  scoped_ptr<Animation> anim(CreateAnimation(1));
73  anim->set_time_offset(4);
74  anim->set_start_time(4);
75  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
76  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
77  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(1.0));
78  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(1.0));
79}
80
81TEST(AnimationTest, TrimTimeNegativeTimeOffset) {
82  scoped_ptr<Animation> anim(CreateAnimation(1));
83  anim->set_time_offset(-4);
84
85  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
86  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(4.0));
87  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(4.5));
88  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(5.0));
89}
90
91TEST(AnimationTest, TrimTimePauseResume) {
92  scoped_ptr<Animation> anim(CreateAnimation(1));
93  anim->SetRunState(Animation::Running, 0.0);
94  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
95  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
96  anim->SetRunState(Animation::Paused, 0.5);
97  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(1024.0));
98  anim->SetRunState(Animation::Running, 1024.0);
99  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(1024.0));
100  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(1024.5));
101}
102
103TEST(AnimationTest, TrimTimeSuspendResume) {
104  scoped_ptr<Animation> anim(CreateAnimation(1));
105  anim->SetRunState(Animation::Running, 0.0);
106  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
107  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(0.5));
108  anim->Suspend(0.5);
109  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(1024.0));
110  anim->Resume(1024);
111  EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(1024.0));
112  EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(1024.5));
113}
114
115TEST(AnimationTest, TrimTimeZeroDuration) {
116  scoped_ptr<Animation> anim(CreateAnimation(0, 0));
117  anim->SetRunState(Animation::Running, 0.0);
118  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(-1.0));
119  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(0.0));
120  EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(1.0));
121}
122
123TEST(AnimationTest, TrimTimeStarting) {
124  scoped_ptr<Animation> anim(CreateAnimation(1, 5.0));
125  anim->SetRunState(Animation::Starting, 0.0);
126  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(-1.0));
127  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(0.0));
128  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(1.0));
129  anim->set_time_offset(2.0);
130  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(-1.0));
131  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(0.0));
132  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(1.0));
133  anim->set_start_time(1.0);
134  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(-1.0));
135  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(0.0));
136  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(1.0));
137  EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(2.0));
138}
139
140TEST(AnimationTest, TrimTimeNeedsSynchronizedStartTime) {
141  scoped_ptr<Animation> anim(CreateAnimation(1, 5.0));
142  anim->SetRunState(Animation::Running, 0.0);
143  anim->set_needs_synchronized_start_time(true);
144  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(-1.0));
145  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(0.0));
146  EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(1.0));
147  anim->set_time_offset(2.0);
148  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(-1.0));
149  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(0.0));
150  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(1.0));
151  anim->set_start_time(1.0);
152  anim->set_needs_synchronized_start_time(false);
153  EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(0.0));
154  EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(1.0));
155  EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(2.0));
156}
157
158TEST(AnimationTest, IsFinishedAtZeroIterations) {
159  scoped_ptr<Animation> anim(CreateAnimation(0));
160  anim->SetRunState(Animation::Running, 0.0);
161  EXPECT_FALSE(anim->IsFinishedAt(-1.0));
162  EXPECT_TRUE(anim->IsFinishedAt(0.0));
163  EXPECT_TRUE(anim->IsFinishedAt(1.0));
164}
165
166TEST(AnimationTest, IsFinishedAtOneIteration) {
167  scoped_ptr<Animation> anim(CreateAnimation(1));
168  anim->SetRunState(Animation::Running, 0.0);
169  EXPECT_FALSE(anim->IsFinishedAt(-1.0));
170  EXPECT_FALSE(anim->IsFinishedAt(0.0));
171  EXPECT_TRUE(anim->IsFinishedAt(1.0));
172  EXPECT_TRUE(anim->IsFinishedAt(2.0));
173}
174
175TEST(AnimationTest, IsFinishedAtInfiniteIterations) {
176  scoped_ptr<Animation> anim(CreateAnimation(-1));
177  anim->SetRunState(Animation::Running, 0.0);
178  EXPECT_FALSE(anim->IsFinishedAt(0.0));
179  EXPECT_FALSE(anim->IsFinishedAt(0.5));
180  EXPECT_FALSE(anim->IsFinishedAt(1.0));
181  EXPECT_FALSE(anim->IsFinishedAt(1.5));
182}
183
184TEST(AnimationTest, IsFinishedNegativeTimeOffset) {
185  scoped_ptr<Animation> anim(CreateAnimation(1));
186  anim->set_time_offset(-0.5);
187  anim->SetRunState(Animation::Running, 0.0);
188
189  EXPECT_FALSE(anim->IsFinishedAt(-1.0));
190  EXPECT_FALSE(anim->IsFinishedAt(0.0));
191  EXPECT_FALSE(anim->IsFinishedAt(0.5));
192  EXPECT_FALSE(anim->IsFinishedAt(1.0));
193  EXPECT_TRUE(anim->IsFinishedAt(1.5));
194  EXPECT_TRUE(anim->IsFinishedAt(2.0));
195  EXPECT_TRUE(anim->IsFinishedAt(2.5));
196}
197
198TEST(AnimationTest, IsFinishedPositiveTimeOffset) {
199  scoped_ptr<Animation> anim(CreateAnimation(1));
200  anim->set_time_offset(0.5);
201  anim->SetRunState(Animation::Running, 0.0);
202
203  EXPECT_FALSE(anim->IsFinishedAt(-1.0));
204  EXPECT_FALSE(anim->IsFinishedAt(0.0));
205  EXPECT_TRUE(anim->IsFinishedAt(0.5));
206  EXPECT_TRUE(anim->IsFinishedAt(1.0));
207}
208
209TEST(AnimationTest, IsFinishedAtNotRunning) {
210  scoped_ptr<Animation> anim(CreateAnimation(0));
211  anim->SetRunState(Animation::Running, 0.0);
212  EXPECT_TRUE(anim->IsFinishedAt(0.0));
213  anim->SetRunState(Animation::Paused, 0.0);
214  EXPECT_FALSE(anim->IsFinishedAt(0.0));
215  anim->SetRunState(Animation::WaitingForTargetAvailability, 0.0);
216  EXPECT_FALSE(anim->IsFinishedAt(0.0));
217  anim->SetRunState(Animation::Finished, 0.0);
218  EXPECT_TRUE(anim->IsFinishedAt(0.0));
219  anim->SetRunState(Animation::Aborted, 0.0);
220  EXPECT_TRUE(anim->IsFinishedAt(0.0));
221}
222
223TEST(AnimationTest, IsFinished) {
224  scoped_ptr<Animation> anim(CreateAnimation(1));
225  anim->SetRunState(Animation::Running, 0.0);
226  EXPECT_FALSE(anim->is_finished());
227  anim->SetRunState(Animation::Paused, 0.0);
228  EXPECT_FALSE(anim->is_finished());
229  anim->SetRunState(Animation::WaitingForTargetAvailability, 0.0);
230  EXPECT_FALSE(anim->is_finished());
231  anim->SetRunState(Animation::Finished, 0.0);
232  EXPECT_TRUE(anim->is_finished());
233  anim->SetRunState(Animation::Aborted, 0.0);
234  EXPECT_TRUE(anim->is_finished());
235}
236
237TEST(AnimationTest, IsFinishedNeedsSynchronizedStartTime) {
238  scoped_ptr<Animation> anim(CreateAnimation(1));
239  anim->SetRunState(Animation::Running, 2.0);
240  EXPECT_FALSE(anim->is_finished());
241  anim->SetRunState(Animation::Paused, 2.0);
242  EXPECT_FALSE(anim->is_finished());
243  anim->SetRunState(Animation::WaitingForTargetAvailability, 2.0);
244  EXPECT_FALSE(anim->is_finished());
245  anim->SetRunState(Animation::Finished, 0.0);
246  EXPECT_TRUE(anim->is_finished());
247  anim->SetRunState(Animation::Aborted, 0.0);
248  EXPECT_TRUE(anim->is_finished());
249}
250
251TEST(AnimationTest, RunStateChangesIgnoredWhileSuspended) {
252  scoped_ptr<Animation> anim(CreateAnimation(1));
253  anim->Suspend(0);
254  EXPECT_EQ(Animation::Paused, anim->run_state());
255  anim->SetRunState(Animation::Running, 0.0);
256  EXPECT_EQ(Animation::Paused, anim->run_state());
257  anim->Resume(0);
258  anim->SetRunState(Animation::Running, 0.0);
259  EXPECT_EQ(Animation::Running, anim->run_state());
260}
261
262}  // namespace
263}  // namespace cc
264