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
, 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));
61 TEST(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));
71 TEST(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));
81 TEST(AnimationTest
, TrimTimeNegativeTimeOffset
) {
82 scoped_ptr
<Animation
> anim(CreateAnimation(1));
83 anim
->set_time_offset(-4);
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));
91 TEST(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));
103 TEST(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));
109 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(1024.0));
111 EXPECT_EQ(0.5, anim
->TrimTimeToCurrentIteration(1024.0));
112 EXPECT_EQ(1, anim
->TrimTimeToCurrentIteration(1024.5));
115 TEST(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));
123 TEST(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));
140 TEST(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));
158 TEST(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));
166 TEST(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));
175 TEST(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));
184 TEST(AnimationTest
, IsFinishedNegativeTimeOffset
) {
185 scoped_ptr
<Animation
> anim(CreateAnimation(1));
186 anim
->set_time_offset(-0.5);
187 anim
->SetRunState(Animation::Running
, 0.0);
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));
198 TEST(AnimationTest
, IsFinishedPositiveTimeOffset
) {
199 scoped_ptr
<Animation
> anim(CreateAnimation(1));
200 anim
->set_time_offset(0.5);
201 anim
->SetRunState(Animation::Running
, 0.0);
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));
209 TEST(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));
223 TEST(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());
237 TEST(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());
251 TEST(AnimationTest
, RunStateChangesIgnoredWhileSuspended
) {
252 scoped_ptr
<Animation
> anim(CreateAnimation(1));
254 EXPECT_EQ(Animation::Paused
, anim
->run_state());
255 anim
->SetRunState(Animation::Running
, 0.0);
256 EXPECT_EQ(Animation::Paused
, anim
->run_state());
258 anim
->SetRunState(Animation::Running
, 0.0);
259 EXPECT_EQ(Animation::Running
, anim
->run_state());