Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / cc / animation / animation_unittest.cc
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
11 namespace cc {
12 namespace {
13
14 using base::TimeDelta;
15
16 static base::TimeTicks TicksFromSecondsF(double seconds) {
17   return base::TimeTicks::FromInternalValue(seconds *
18                                             base::Time::kMicrosecondsPerSecond);
19 }
20
21 scoped_ptr<Animation> CreateAnimation(double iterations,
22                                       double duration,
23                                       double playback_rate) {
24   scoped_ptr<Animation> to_return(
25       Animation::Create(make_scoped_ptr(new FakeFloatAnimationCurve(duration)),
26                         0,
27                         1,
28                         Animation::Opacity));
29   to_return->set_iterations(iterations);
30   to_return->set_playback_rate(playback_rate);
31   return to_return.Pass();
32 }
33
34 scoped_ptr<Animation> CreateAnimation(double iterations, double duration) {
35   return CreateAnimation(iterations, duration, 1);
36 }
37
38 scoped_ptr<Animation> CreateAnimation(double iterations) {
39   return CreateAnimation(iterations, 1, 1);
40 }
41
42 TEST(AnimationTest, TrimTimeZeroIterations) {
43   scoped_ptr<Animation> anim(CreateAnimation(0));
44   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
45   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
46   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
47 }
48
49 TEST(AnimationTest, TrimTimeOneIteration) {
50   scoped_ptr<Animation> anim(CreateAnimation(1));
51   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
52   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
53   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
54   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
55 }
56
57 TEST(AnimationTest, TrimTimeOneHalfIteration) {
58   scoped_ptr<Animation> anim(CreateAnimation(1.5));
59   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
60   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
61   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
62   EXPECT_EQ(0.9, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.9)));
63   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
64   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
65   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
66 }
67
68 TEST(AnimationTest, TrimTimeInfiniteIterations) {
69   scoped_ptr<Animation> anim(CreateAnimation(-1));
70   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
71   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
72   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
73   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
74 }
75
76 TEST(AnimationTest, TrimTimeReverse) {
77   scoped_ptr<Animation> anim(CreateAnimation(-1));
78   anim->set_direction(Animation::Reverse);
79   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)));
80   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
81   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
82   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
83   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
84   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
85 }
86
87 TEST(AnimationTest, TrimTimeAlternateInfiniteIterations) {
88   scoped_ptr<Animation> anim(CreateAnimation(-1));
89   anim->set_direction(Animation::Alternate);
90   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
91   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
92   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
93   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
94   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
95   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
96 }
97
98 TEST(AnimationTest, TrimTimeAlternateOneIteration) {
99   scoped_ptr<Animation> anim(CreateAnimation(1));
100   anim->set_direction(Animation::Alternate);
101   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
102   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
103   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
104   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
105   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
106   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
107 }
108
109 TEST(AnimationTest, TrimTimeAlternateTwoIterations) {
110   scoped_ptr<Animation> anim(CreateAnimation(2));
111   anim->set_direction(Animation::Alternate);
112   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
113   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
114   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
115   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
116   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
117   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
118   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
119   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
120   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
121 }
122
123 TEST(AnimationTest, TrimTimeAlternateTwoHalfIterations) {
124   scoped_ptr<Animation> anim(CreateAnimation(2.5));
125   anim->set_direction(Animation::Alternate);
126   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
127   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
128   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
129   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
130   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
131   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
132   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
133   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
134   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
135   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.50)));
136   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.75)));
137 }
138
139 TEST(AnimationTest, TrimTimeAlternateReverseInfiniteIterations) {
140   scoped_ptr<Animation> anim(CreateAnimation(-1));
141   anim->set_direction(Animation::AlternateReverse);
142   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
143   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
144   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
145   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
146   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
147   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
148 }
149
150 TEST(AnimationTest, TrimTimeAlternateReverseOneIteration) {
151   scoped_ptr<Animation> anim(CreateAnimation(1));
152   anim->set_direction(Animation::AlternateReverse);
153   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
154   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
155   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
156   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
157   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
158   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
159 }
160
161 TEST(AnimationTest, TrimTimeAlternateReverseTwoIterations) {
162   scoped_ptr<Animation> anim(CreateAnimation(2));
163   anim->set_direction(Animation::AlternateReverse);
164   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
165   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
166   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
167   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
168   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
169   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
170   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
171   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
172   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
173 }
174
175 TEST(AnimationTest, TrimTimeStartTime) {
176   scoped_ptr<Animation> anim(CreateAnimation(1));
177   anim->set_start_time(TicksFromSecondsF(4));
178   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
179   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
180   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
181   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)));
182   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0)));
183 }
184
185 TEST(AnimationTest, TrimTimeStartTimeReverse) {
186   scoped_ptr<Animation> anim(CreateAnimation(1));
187   anim->set_start_time(TicksFromSecondsF(4));
188   anim->set_direction(Animation::Reverse);
189   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
190   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
191   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
192   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)));
193   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(6.0)));
194 }
195
196 TEST(AnimationTest, TrimTimeTimeOffset) {
197   scoped_ptr<Animation> anim(CreateAnimation(1));
198   anim->set_time_offset(TimeDelta::FromMilliseconds(4000));
199   anim->set_start_time(TicksFromSecondsF(4));
200   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
201   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
202   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
203   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
204 }
205
206 TEST(AnimationTest, TrimTimeTimeOffsetReverse) {
207   scoped_ptr<Animation> anim(CreateAnimation(1));
208   anim->set_time_offset(TimeDelta::FromMilliseconds(4000));
209   anim->set_start_time(TicksFromSecondsF(4));
210   anim->set_direction(Animation::Reverse);
211   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
212   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
213   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
214   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
215 }
216
217 TEST(AnimationTest, TrimTimeNegativeTimeOffset) {
218   scoped_ptr<Animation> anim(CreateAnimation(1));
219   anim->set_time_offset(TimeDelta::FromMilliseconds(-4000));
220
221   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
222   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
223   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
224   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)));
225 }
226
227 TEST(AnimationTest, TrimTimeNegativeTimeOffsetReverse) {
228   scoped_ptr<Animation> anim(CreateAnimation(1));
229   anim->set_time_offset(TimeDelta::FromMilliseconds(-4000));
230   anim->set_direction(Animation::Reverse);
231
232   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
233   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
234   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
235   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(5.0)));
236 }
237
238 TEST(AnimationTest, TrimTimePauseResume) {
239   scoped_ptr<Animation> anim(CreateAnimation(1));
240   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
241   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
242   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
243   anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.5));
244   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
245   anim->SetRunState(Animation::Running, TicksFromSecondsF(1024.0));
246   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
247   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5)));
248 }
249
250 TEST(AnimationTest, TrimTimePauseResumeReverse) {
251   scoped_ptr<Animation> anim(CreateAnimation(1));
252   anim->set_direction(Animation::Reverse);
253   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
254   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
255   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
256   anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.25));
257   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
258   anim->SetRunState(Animation::Running, TicksFromSecondsF(1024.0));
259   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
260   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.75)));
261 }
262
263 TEST(AnimationTest, TrimTimeSuspendResume) {
264   scoped_ptr<Animation> anim(CreateAnimation(1));
265   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
266   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
267   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
268   anim->Suspend(TicksFromSecondsF(0.5));
269   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
270   anim->Resume(TicksFromSecondsF(1024));
271   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
272   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.5)));
273 }
274
275 TEST(AnimationTest, TrimTimeSuspendResumeReverse) {
276   scoped_ptr<Animation> anim(CreateAnimation(1));
277   anim->set_direction(Animation::Reverse);
278   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
279   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
280   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
281   anim->Suspend(TicksFromSecondsF(0.75));
282   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
283   anim->Resume(TicksFromSecondsF(1024));
284   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.0)));
285   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1024.25)));
286 }
287
288 TEST(AnimationTest, TrimTimeZeroDuration) {
289   scoped_ptr<Animation> anim(CreateAnimation(0, 0));
290   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
291   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
292   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
293   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
294 }
295
296 TEST(AnimationTest, TrimTimeStarting) {
297   scoped_ptr<Animation> anim(CreateAnimation(1, 5.0));
298   anim->SetRunState(Animation::Starting, TicksFromSecondsF(0.0));
299   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
300   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
301   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
302   anim->set_time_offset(TimeDelta::FromMilliseconds(2000));
303   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
304   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
305   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
306   anim->set_start_time(TicksFromSecondsF(1.0));
307   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
308   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
309   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
310   EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
311 }
312
313 TEST(AnimationTest, TrimTimeNeedsSynchronizedStartTime) {
314   scoped_ptr<Animation> anim(CreateAnimation(1, 5.0));
315   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
316   anim->set_needs_synchronized_start_time(true);
317   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
318   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
319   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
320   anim->set_time_offset(TimeDelta::FromMilliseconds(2000));
321   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
322   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
323   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
324   anim->set_start_time(TicksFromSecondsF(1.0));
325   anim->set_needs_synchronized_start_time(false);
326   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
327   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
328   EXPECT_EQ(3.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
329 }
330
331 TEST(AnimationTest, IsFinishedAtZeroIterations) {
332   scoped_ptr<Animation> anim(CreateAnimation(0));
333   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
334   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
335   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
336   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
337 }
338
339 TEST(AnimationTest, IsFinishedAtOneIteration) {
340   scoped_ptr<Animation> anim(CreateAnimation(1));
341   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
342   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
343   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
344   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
345   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.0)));
346 }
347
348 TEST(AnimationTest, IsFinishedAtInfiniteIterations) {
349   scoped_ptr<Animation> anim(CreateAnimation(-1));
350   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
351   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
352   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
353   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
354   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.5)));
355 }
356
357 TEST(AnimationTest, IsFinishedNegativeTimeOffset) {
358   scoped_ptr<Animation> anim(CreateAnimation(1));
359   anim->set_time_offset(TimeDelta::FromMilliseconds(-500));
360   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
361
362   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
363   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
364   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
365   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
366   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.5)));
367   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.0)));
368   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(2.5)));
369 }
370
371 TEST(AnimationTest, IsFinishedPositiveTimeOffset) {
372   scoped_ptr<Animation> anim(CreateAnimation(1));
373   anim->set_time_offset(TimeDelta::FromMilliseconds(500));
374   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
375
376   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(-1.0)));
377   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
378   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.5)));
379   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(1.0)));
380 }
381
382 TEST(AnimationTest, IsFinishedAtNotRunning) {
383   scoped_ptr<Animation> anim(CreateAnimation(0));
384   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
385   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
386   anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.0));
387   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
388   anim->SetRunState(Animation::WaitingForTargetAvailability,
389                     TicksFromSecondsF(0.0));
390   EXPECT_FALSE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
391   anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0));
392   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
393   anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0));
394   EXPECT_TRUE(anim->IsFinishedAt(TicksFromSecondsF(0.0)));
395 }
396
397 TEST(AnimationTest, IsFinished) {
398   scoped_ptr<Animation> anim(CreateAnimation(1));
399   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
400   EXPECT_FALSE(anim->is_finished());
401   anim->SetRunState(Animation::Paused, TicksFromSecondsF(0.0));
402   EXPECT_FALSE(anim->is_finished());
403   anim->SetRunState(Animation::WaitingForTargetAvailability,
404                     TicksFromSecondsF(0.0));
405   EXPECT_FALSE(anim->is_finished());
406   anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0));
407   EXPECT_TRUE(anim->is_finished());
408   anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0));
409   EXPECT_TRUE(anim->is_finished());
410 }
411
412 TEST(AnimationTest, IsFinishedNeedsSynchronizedStartTime) {
413   scoped_ptr<Animation> anim(CreateAnimation(1));
414   anim->SetRunState(Animation::Running, TicksFromSecondsF(2.0));
415   EXPECT_FALSE(anim->is_finished());
416   anim->SetRunState(Animation::Paused, TicksFromSecondsF(2.0));
417   EXPECT_FALSE(anim->is_finished());
418   anim->SetRunState(Animation::WaitingForTargetAvailability,
419                     TicksFromSecondsF(2.0));
420   EXPECT_FALSE(anim->is_finished());
421   anim->SetRunState(Animation::Finished, TicksFromSecondsF(0.0));
422   EXPECT_TRUE(anim->is_finished());
423   anim->SetRunState(Animation::Aborted, TicksFromSecondsF(0.0));
424   EXPECT_TRUE(anim->is_finished());
425 }
426
427 TEST(AnimationTest, RunStateChangesIgnoredWhileSuspended) {
428   scoped_ptr<Animation> anim(CreateAnimation(1));
429   anim->Suspend(TicksFromSecondsF(0));
430   EXPECT_EQ(Animation::Paused, anim->run_state());
431   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
432   EXPECT_EQ(Animation::Paused, anim->run_state());
433   anim->Resume(TicksFromSecondsF(0));
434   anim->SetRunState(Animation::Running, TicksFromSecondsF(0.0));
435   EXPECT_EQ(Animation::Running, anim->run_state());
436 }
437
438 TEST(AnimationTest, TrimTimePlaybackNormal) {
439   scoped_ptr<Animation> anim(CreateAnimation(1, 1, 1));
440   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
441   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
442   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
443   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
444   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
445 }
446
447 TEST(AnimationTest, TrimTimePlaybackSlow) {
448   scoped_ptr<Animation> anim(CreateAnimation(1, 1, 0.5));
449   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
450   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
451   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
452   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
453   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
454   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
455 }
456
457 TEST(AnimationTest, TrimTimePlaybackFast) {
458   scoped_ptr<Animation> anim(CreateAnimation(1, 4, 2));
459   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
460   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
461   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
462   EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
463   EXPECT_EQ(3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
464   EXPECT_EQ(4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
465   EXPECT_EQ(4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
466 }
467
468 TEST(AnimationTest, TrimTimePlaybackNormalReverse) {
469   scoped_ptr<Animation> anim(CreateAnimation(1, 2, -1));
470   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
471   EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)));
472   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
473   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
474   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
475   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
476   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
477 }
478
479 TEST(AnimationTest, TrimTimePlaybackSlowReverse) {
480   scoped_ptr<Animation> anim(CreateAnimation(1, 2, -0.5));
481   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
482   EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)));
483   EXPECT_EQ(1.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
484   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
485   EXPECT_EQ(1.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
486   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
487   EXPECT_EQ(0.75, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
488   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3)));
489   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5)));
490   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4)));
491   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
492 }
493
494 TEST(AnimationTest, TrimTimePlaybackFastReverse) {
495   scoped_ptr<Animation> anim(CreateAnimation(1, 2, -2));
496   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
497   EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0)));
498   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
499   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
500   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
501   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
502   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
503 }
504
505 TEST(AnimationTest, TrimTimePlaybackFastInfiniteIterations) {
506   scoped_ptr<Animation> anim(CreateAnimation(-1, 4, 4));
507   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
508   EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
509   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
510   EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
511   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1000.0)));
512   EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1000.5)));
513 }
514
515 TEST(AnimationTest, TrimTimePlaybackNormalDoubleReverse) {
516   scoped_ptr<Animation> anim(CreateAnimation(1, 1, -1));
517   anim->set_direction(Animation::Reverse);
518   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
519   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
520   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
521   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
522   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
523 }
524
525 TEST(AnimationTest, TrimTimePlaybackFastDoubleReverse) {
526   scoped_ptr<Animation> anim(CreateAnimation(1, 4, -2));
527   anim->set_direction(Animation::Reverse);
528   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
529   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
530   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
531   EXPECT_EQ(2, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
532   EXPECT_EQ(3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
533   EXPECT_EQ(4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
534   EXPECT_EQ(4, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
535 }
536
537 TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFast) {
538   scoped_ptr<Animation> anim(CreateAnimation(2, 2, 2));
539   anim->set_direction(Animation::Alternate);
540   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
541   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
542   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
543   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
544   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
545   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
546   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
547   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
548   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
549   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
550 }
551
552 TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFastReverse) {
553   scoped_ptr<Animation> anim(CreateAnimation(2, 2, 2));
554   anim->set_direction(Animation::AlternateReverse);
555   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
556   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
557   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
558   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
559   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
560   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
561   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
562   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
563   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
564   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
565   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
566 }
567
568 TEST(AnimationTest, TrimTimeAlternateTwoIterationsPlaybackFastDoubleReverse) {
569   scoped_ptr<Animation> anim(CreateAnimation(2, 2, -2));
570   anim->set_direction(Animation::AlternateReverse);
571   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
572   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
573   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
574   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
575   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
576   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
577   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
578   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
579   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
580   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
581 }
582
583 TEST(AnimationTest,
584      TrimTimeAlternateReverseThreeIterationsPlaybackFastAlternateReverse) {
585   scoped_ptr<Animation> anim(CreateAnimation(3, 2, -2));
586   anim->set_direction(Animation::AlternateReverse);
587   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
588   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.25)));
589   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
590   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.75)));
591   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
592   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.25)));
593   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
594   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.75)));
595   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
596   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.25)));
597   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
598   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.75)));
599   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
600   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.25)));
601 }
602
603 TEST(AnimationTest,
604      TrimTimeAlternateReverseTwoIterationsPlaybackNormalAlternate) {
605   scoped_ptr<Animation> anim(CreateAnimation(2, 2, -1));
606   anim->set_direction(Animation::Alternate);
607   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
608   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
609   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
610   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
611   EXPECT_EQ(2.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
612   EXPECT_EQ(1.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
613   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
614   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5)));
615   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.0)));
616   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(4.5)));
617 }
618
619 TEST(AnimationTest, TrimTimeIterationStart) {
620   scoped_ptr<Animation> anim(CreateAnimation(2, 1, 1));
621   anim->set_iteration_start(0.5);
622   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
623   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
624   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
625   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
626   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
627   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
628   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
629 }
630
631 TEST(AnimationTest, TrimTimeIterationStartAlternate) {
632   scoped_ptr<Animation> anim(CreateAnimation(2, 1, 1));
633   anim->set_direction(Animation::Alternate);
634   anim->set_iteration_start(0.3);
635   EXPECT_EQ(0.3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
636   EXPECT_EQ(0.3, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
637   EXPECT_EQ(0.8, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
638   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.7)));
639   EXPECT_EQ(0.7, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
640   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.2)));
641   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.7)));
642 }
643
644 TEST(AnimationTest, TrimTimeIterationStartAlternateThreeIterations) {
645   scoped_ptr<Animation> anim(CreateAnimation(3, 1, 1));
646   anim->set_direction(Animation::Alternate);
647   anim->set_iteration_start(1);
648   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(-1.0)));
649   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
650   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.5)));
651   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
652   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.5)));
653   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
654   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.5)));
655   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
656   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5)));
657 }
658
659 TEST(AnimationTest,
660      TrimTimeIterationStartAlternateThreeIterationsPlaybackReverse) {
661   scoped_ptr<Animation> anim(CreateAnimation(3, 1, -1));
662   anim->set_direction(Animation::Alternate);
663   anim->set_iteration_start(1);
664   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(0.0)));
665   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(1.0)));
666   EXPECT_EQ(0.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(2.0)));
667   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.0)));
668   EXPECT_EQ(1.0, anim->TrimTimeToCurrentIteration(TicksFromSecondsF(3.5)));
669 }
670
671 TEST(AnimationTest, InEffectFillMode) {
672   scoped_ptr<Animation> anim(CreateAnimation(1));
673   anim->set_fill_mode(Animation::FillModeNone);
674   EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
675   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
676   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
677
678   anim->set_fill_mode(Animation::FillModeForwards);
679   EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
680   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
681   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
682
683   anim->set_fill_mode(Animation::FillModeBackwards);
684   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
685   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
686   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
687
688   anim->set_fill_mode(Animation::FillModeBoth);
689   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
690   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
691   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
692 }
693
694 TEST(AnimationTest, InEffectFillModePlayback) {
695   scoped_ptr<Animation> anim(CreateAnimation(1, 1, -1));
696   anim->set_fill_mode(Animation::FillModeNone);
697   EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
698   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
699   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
700
701   anim->set_fill_mode(Animation::FillModeForwards);
702   EXPECT_FALSE(anim->InEffect(TicksFromSecondsF(-1.0)));
703   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
704   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
705
706   anim->set_fill_mode(Animation::FillModeBackwards);
707   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
708   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
709   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
710
711   anim->set_fill_mode(Animation::FillModeBoth);
712   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(-1.0)));
713   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(0.0)));
714   EXPECT_TRUE(anim->InEffect(TicksFromSecondsF(1.0)));
715 }
716
717 }  // namespace
718 }  // namespace cc