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.
5 #include "cc/animation/animation.h"
7 #include "cc/test/animation_test_common.h"
8 #include "testing/gmock/include/gmock/gmock.h"
9 #include "testing/gtest/include/gtest/gtest.h"
14 scoped_ptr
<Animation
> CreateAnimation(int iterations
, double duration
) {
15 scoped_ptr
<Animation
> to_return(Animation::Create(
17 new FakeFloatAnimationCurve(duration
)).PassAs
<AnimationCurve
>(),
21 to_return
->set_iterations(iterations
);
22 return to_return
.Pass();
25 scoped_ptr
<Animation
> CreateAnimation(int iterations
) {
26 return CreateAnimation(iterations
, 1);
29 TEST(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));
36 TEST(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));
44 TEST(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));
52 TEST(AnimationTest
, TrimTimeReverse
) {
53 scoped_ptr
<Animation
> anim(CreateAnimation(-1));
54 anim
->set_direction(Animation::Reverse
);
55 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0));
56 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(0.25));
57 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
58 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(0.75));
59 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(1.0));
60 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(1.25));
63 TEST(AnimationTest
, TrimTimeAlternateInfiniteIterations
) {
64 scoped_ptr
<Animation
> anim(CreateAnimation(-1));
65 anim
->set_direction(Animation::Alternate
);
66 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(0.0));
67 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(0.25));
68 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
69 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(0.75));
70 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(1.0));
71 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(1.25));
74 TEST(AnimationTest
, TrimTimeAlternateOneIteration
) {
75 scoped_ptr
<Animation
> anim(CreateAnimation(1));
76 anim
->set_direction(Animation::Alternate
);
77 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(0.0));
78 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(0.25));
79 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
80 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(0.75));
81 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(1.0));
82 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(1.25));
85 TEST(AnimationTest
, TrimTimeAlternateTwoIterations
) {
86 scoped_ptr
<Animation
> anim(CreateAnimation(2));
87 anim
->set_direction(Animation::Alternate
);
88 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(0.0));
89 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(0.25));
90 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
91 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(0.75));
92 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(1.0));
93 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(1.25));
94 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(1.75));
95 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(2.0));
96 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(2.25));
99 TEST(AnimationTest
, TrimTimeAlternateReverseInfiniteIterations
) {
100 scoped_ptr
<Animation
> anim(CreateAnimation(-1));
101 anim
->set_direction(Animation::AlternateReverse
);
102 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0.0));
103 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(0.25));
104 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
105 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(0.75));
106 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(1.0));
107 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(1.25));
110 TEST(AnimationTest
, TrimTimeAlternateReverseOneIteration
) {
111 scoped_ptr
<Animation
> anim(CreateAnimation(1));
112 anim
->set_direction(Animation::AlternateReverse
);
113 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0.0));
114 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(0.25));
115 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
116 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(0.75));
117 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(1.0));
118 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(1.25));
121 TEST(AnimationTest
, TrimTimeAlternateReverseTwoIterations
) {
122 scoped_ptr
<Animation
> anim(CreateAnimation(2));
123 anim
->set_direction(Animation::AlternateReverse
);
124 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0.0));
125 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(0.25));
126 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
127 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(0.75));
128 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(1.0));
129 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(1.25));
130 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(1.75));
131 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(2.0));
132 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(2.25));
135 TEST(AnimationTest
, TrimTimeStartTime
) {
136 scoped_ptr
<Animation
> anim(CreateAnimation(1));
137 anim
->set_start_time(4);
138 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(0.0));
139 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(4.0));
140 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(4.5));
141 EXPECT_EQ(1, anim
->TrimTimeToCurrentIteration(5.0));
142 EXPECT_EQ(1, anim
->TrimTimeToCurrentIteration(6.0));
145 TEST(AnimationTest
, TrimTimeStartTimeReverse
) {
146 scoped_ptr
<Animation
> anim(CreateAnimation(1));
147 anim
->set_start_time(4);
148 anim
->set_direction(Animation::Reverse
);
149 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(0.0));
150 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(4.0));
151 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(4.5));
152 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(5.0));
153 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(6.0));
156 TEST(AnimationTest
, TrimTimeTimeOffset
) {
157 scoped_ptr
<Animation
> anim(CreateAnimation(1));
158 anim
->set_time_offset(4);
159 anim
->set_start_time(4);
160 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(0.0));
161 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
162 EXPECT_EQ(1, anim
->TrimTimeToCurrentIteration(1.0));
163 EXPECT_EQ(1, anim
->TrimTimeToCurrentIteration(1.0));
166 TEST(AnimationTest
, TrimTimeTimeOffsetReverse
) {
167 scoped_ptr
<Animation
> anim(CreateAnimation(1));
168 anim
->set_time_offset(4);
169 anim
->set_start_time(4);
170 anim
->set_direction(Animation::Reverse
);
171 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0.0));
172 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
173 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(1.0));
174 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(1.0));
177 TEST(AnimationTest
, TrimTimeNegativeTimeOffset
) {
178 scoped_ptr
<Animation
> anim(CreateAnimation(1));
179 anim
->set_time_offset(-4);
181 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(0.0));
182 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(4.0));
183 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(4.5));
184 EXPECT_EQ(1, anim
->TrimTimeToCurrentIteration(5.0));
187 TEST(AnimationTest
, TrimTimeNegativeTimeOffsetReverse
) {
188 scoped_ptr
<Animation
> anim(CreateAnimation(1));
189 anim
->set_time_offset(-4);
190 anim
->set_direction(Animation::Reverse
);
192 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(0.0));
193 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(4.0));
194 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(4.5));
195 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(5.0));
198 TEST(AnimationTest
, TrimTimePauseResume
) {
199 scoped_ptr
<Animation
> anim(CreateAnimation(1));
200 anim
->SetRunState(Animation::Running
, 0.0);
201 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(0.0));
202 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
203 anim
->SetRunState(Animation::Paused
, 0.5);
204 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(1024.0));
205 anim
->SetRunState(Animation::Running
, 1024.0);
206 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(1024.0));
207 EXPECT_EQ(1, anim
->TrimTimeToCurrentIteration(1024.5));
210 TEST(AnimationTest
, TrimTimePauseResumeReverse
) {
211 scoped_ptr
<Animation
> anim(CreateAnimation(1));
212 anim
->set_direction(Animation::Reverse
);
213 anim
->SetRunState(Animation::Running
, 0.0);
214 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0.0));
215 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
216 anim
->SetRunState(Animation::Paused
, 0.25);
217 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(1024.0));
218 anim
->SetRunState(Animation::Running
, 1024.0);
219 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(1024.0));
220 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(1024.75));
223 TEST(AnimationTest
, TrimTimeSuspendResume
) {
224 scoped_ptr
<Animation
> anim(CreateAnimation(1));
225 anim
->SetRunState(Animation::Running
, 0.0);
226 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(0.0));
227 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(0.5));
229 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(1024.0));
231 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(1024.0));
232 EXPECT_EQ(1, anim
->TrimTimeToCurrentIteration(1024.5));
235 TEST(AnimationTest
, TrimTimeSuspendResumeReverse
) {
236 scoped_ptr
<Animation
> anim(CreateAnimation(1));
237 anim
->set_direction(Animation::Reverse
);
238 anim
->SetRunState(Animation::Running
, 0.0);
239 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0.0));
240 EXPECT_EQ(0.75, anim
->TrimTimeToCurrentIteration(0.25));
242 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(1024.0));
244 EXPECT_EQ(0.25, anim
->TrimTimeToCurrentIteration(1024.0));
245 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(1024.25));
248 TEST(AnimationTest
, TrimTimeZeroDuration
) {
249 scoped_ptr
<Animation
> anim(CreateAnimation(0, 0));
250 anim
->SetRunState(Animation::Running
, 0.0);
251 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(-1.0));
252 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(0.0));
253 EXPECT_EQ(0, anim
->TrimTimeToCurrentIteration(1.0));
256 TEST(AnimationTest
, TrimTimeStarting
) {
257 scoped_ptr
<Animation
> anim(CreateAnimation(1, 5.0));
258 anim
->SetRunState(Animation::Starting
, 0.0);
259 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(-1.0));
260 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(0.0));
261 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(1.0));
262 anim
->set_time_offset(2.0);
263 EXPECT_EQ(2.0, anim
->TrimTimeToCurrentIteration(-1.0));
264 EXPECT_EQ(2.0, anim
->TrimTimeToCurrentIteration(0.0));
265 EXPECT_EQ(2.0, anim
->TrimTimeToCurrentIteration(1.0));
266 anim
->set_start_time(1.0);
267 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(-1.0));
268 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0.0));
269 EXPECT_EQ(2.0, anim
->TrimTimeToCurrentIteration(1.0));
270 EXPECT_EQ(3.0, anim
->TrimTimeToCurrentIteration(2.0));
273 TEST(AnimationTest
, TrimTimeNeedsSynchronizedStartTime
) {
274 scoped_ptr
<Animation
> anim(CreateAnimation(1, 5.0));
275 anim
->SetRunState(Animation::Running
, 0.0);
276 anim
->set_needs_synchronized_start_time(true);
277 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(-1.0));
278 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(0.0));
279 EXPECT_EQ(0.0, anim
->TrimTimeToCurrentIteration(1.0));
280 anim
->set_time_offset(2.0);
281 EXPECT_EQ(2.0, anim
->TrimTimeToCurrentIteration(-1.0));
282 EXPECT_EQ(2.0, anim
->TrimTimeToCurrentIteration(0.0));
283 EXPECT_EQ(2.0, anim
->TrimTimeToCurrentIteration(1.0));
284 anim
->set_start_time(1.0);
285 anim
->set_needs_synchronized_start_time(false);
286 EXPECT_EQ(1.0, anim
->TrimTimeToCurrentIteration(0.0));
287 EXPECT_EQ(2.0, anim
->TrimTimeToCurrentIteration(1.0));
288 EXPECT_EQ(3.0, anim
->TrimTimeToCurrentIteration(2.0));
291 TEST(AnimationTest
, IsFinishedAtZeroIterations
) {
292 scoped_ptr
<Animation
> anim(CreateAnimation(0));
293 anim
->SetRunState(Animation::Running
, 0.0);
294 EXPECT_FALSE(anim
->IsFinishedAt(-1.0));
295 EXPECT_TRUE(anim
->IsFinishedAt(0.0));
296 EXPECT_TRUE(anim
->IsFinishedAt(1.0));
299 TEST(AnimationTest
, IsFinishedAtOneIteration
) {
300 scoped_ptr
<Animation
> anim(CreateAnimation(1));
301 anim
->SetRunState(Animation::Running
, 0.0);
302 EXPECT_FALSE(anim
->IsFinishedAt(-1.0));
303 EXPECT_FALSE(anim
->IsFinishedAt(0.0));
304 EXPECT_TRUE(anim
->IsFinishedAt(1.0));
305 EXPECT_TRUE(anim
->IsFinishedAt(2.0));
308 TEST(AnimationTest
, IsFinishedAtInfiniteIterations
) {
309 scoped_ptr
<Animation
> anim(CreateAnimation(-1));
310 anim
->SetRunState(Animation::Running
, 0.0);
311 EXPECT_FALSE(anim
->IsFinishedAt(0.0));
312 EXPECT_FALSE(anim
->IsFinishedAt(0.5));
313 EXPECT_FALSE(anim
->IsFinishedAt(1.0));
314 EXPECT_FALSE(anim
->IsFinishedAt(1.5));
317 TEST(AnimationTest
, IsFinishedNegativeTimeOffset
) {
318 scoped_ptr
<Animation
> anim(CreateAnimation(1));
319 anim
->set_time_offset(-0.5);
320 anim
->SetRunState(Animation::Running
, 0.0);
322 EXPECT_FALSE(anim
->IsFinishedAt(-1.0));
323 EXPECT_FALSE(anim
->IsFinishedAt(0.0));
324 EXPECT_FALSE(anim
->IsFinishedAt(0.5));
325 EXPECT_FALSE(anim
->IsFinishedAt(1.0));
326 EXPECT_TRUE(anim
->IsFinishedAt(1.5));
327 EXPECT_TRUE(anim
->IsFinishedAt(2.0));
328 EXPECT_TRUE(anim
->IsFinishedAt(2.5));
331 TEST(AnimationTest
, IsFinishedPositiveTimeOffset
) {
332 scoped_ptr
<Animation
> anim(CreateAnimation(1));
333 anim
->set_time_offset(0.5);
334 anim
->SetRunState(Animation::Running
, 0.0);
336 EXPECT_FALSE(anim
->IsFinishedAt(-1.0));
337 EXPECT_FALSE(anim
->IsFinishedAt(0.0));
338 EXPECT_TRUE(anim
->IsFinishedAt(0.5));
339 EXPECT_TRUE(anim
->IsFinishedAt(1.0));
342 TEST(AnimationTest
, IsFinishedAtNotRunning
) {
343 scoped_ptr
<Animation
> anim(CreateAnimation(0));
344 anim
->SetRunState(Animation::Running
, 0.0);
345 EXPECT_TRUE(anim
->IsFinishedAt(0.0));
346 anim
->SetRunState(Animation::Paused
, 0.0);
347 EXPECT_FALSE(anim
->IsFinishedAt(0.0));
348 anim
->SetRunState(Animation::WaitingForTargetAvailability
, 0.0);
349 EXPECT_FALSE(anim
->IsFinishedAt(0.0));
350 anim
->SetRunState(Animation::Finished
, 0.0);
351 EXPECT_TRUE(anim
->IsFinishedAt(0.0));
352 anim
->SetRunState(Animation::Aborted
, 0.0);
353 EXPECT_TRUE(anim
->IsFinishedAt(0.0));
356 TEST(AnimationTest
, IsFinished
) {
357 scoped_ptr
<Animation
> anim(CreateAnimation(1));
358 anim
->SetRunState(Animation::Running
, 0.0);
359 EXPECT_FALSE(anim
->is_finished());
360 anim
->SetRunState(Animation::Paused
, 0.0);
361 EXPECT_FALSE(anim
->is_finished());
362 anim
->SetRunState(Animation::WaitingForTargetAvailability
, 0.0);
363 EXPECT_FALSE(anim
->is_finished());
364 anim
->SetRunState(Animation::Finished
, 0.0);
365 EXPECT_TRUE(anim
->is_finished());
366 anim
->SetRunState(Animation::Aborted
, 0.0);
367 EXPECT_TRUE(anim
->is_finished());
370 TEST(AnimationTest
, IsFinishedNeedsSynchronizedStartTime
) {
371 scoped_ptr
<Animation
> anim(CreateAnimation(1));
372 anim
->SetRunState(Animation::Running
, 2.0);
373 EXPECT_FALSE(anim
->is_finished());
374 anim
->SetRunState(Animation::Paused
, 2.0);
375 EXPECT_FALSE(anim
->is_finished());
376 anim
->SetRunState(Animation::WaitingForTargetAvailability
, 2.0);
377 EXPECT_FALSE(anim
->is_finished());
378 anim
->SetRunState(Animation::Finished
, 0.0);
379 EXPECT_TRUE(anim
->is_finished());
380 anim
->SetRunState(Animation::Aborted
, 0.0);
381 EXPECT_TRUE(anim
->is_finished());
384 TEST(AnimationTest
, RunStateChangesIgnoredWhileSuspended
) {
385 scoped_ptr
<Animation
> anim(CreateAnimation(1));
387 EXPECT_EQ(Animation::Paused
, anim
->run_state());
388 anim
->SetRunState(Animation::Running
, 0.0);
389 EXPECT_EQ(Animation::Paused
, anim
->run_state());
391 anim
->SetRunState(Animation::Running
, 0.0);
392 EXPECT_EQ(Animation::Running
, anim
->run_state());