Upstream version 7.36.149.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 scoped_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
25 scoped_ptr<Animation> CreateAnimation(int iterations) {
26   return CreateAnimation(iterations, 1);
27 }
28
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));
34 }
35
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));
42 }
43
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));
50 }
51
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));
61 }
62
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));
72 }
73
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));
83 }
84
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));
97 }
98
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));
108 }
109
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));
119 }
120
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));
133 }
134
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));
143 }
144
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));
154 }
155
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));
164 }
165
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));
175 }
176
177 TEST(AnimationTest, TrimTimeNegativeTimeOffset) {
178   scoped_ptr<Animation> anim(CreateAnimation(1));
179   anim->set_time_offset(-4);
180
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));
185 }
186
187 TEST(AnimationTest, TrimTimeNegativeTimeOffsetReverse) {
188   scoped_ptr<Animation> anim(CreateAnimation(1));
189   anim->set_time_offset(-4);
190   anim->set_direction(Animation::Reverse);
191
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));
196 }
197
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));
208 }
209
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));
221 }
222
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));
228   anim->Suspend(0.5);
229   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(1024.0));
230   anim->Resume(1024);
231   EXPECT_EQ(0.5, anim->TrimTimeToCurrentIteration(1024.0));
232   EXPECT_EQ(1, anim->TrimTimeToCurrentIteration(1024.5));
233 }
234
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));
241   anim->Suspend(0.75);
242   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(1024.0));
243   anim->Resume(1024);
244   EXPECT_EQ(0.25, anim->TrimTimeToCurrentIteration(1024.0));
245   EXPECT_EQ(0, anim->TrimTimeToCurrentIteration(1024.25));
246 }
247
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));
254 }
255
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));
271 }
272
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));
289 }
290
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));
297 }
298
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));
306 }
307
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));
315 }
316
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);
321
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));
329 }
330
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);
335
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));
340 }
341
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));
354 }
355
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());
368 }
369
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());
382 }
383
384 TEST(AnimationTest, RunStateChangesIgnoredWhileSuspended) {
385   scoped_ptr<Animation> anim(CreateAnimation(1));
386   anim->Suspend(0);
387   EXPECT_EQ(Animation::Paused, anim->run_state());
388   anim->SetRunState(Animation::Running, 0.0);
389   EXPECT_EQ(Animation::Paused, anim->run_state());
390   anim->Resume(0);
391   anim->SetRunState(Animation::Running, 0.0);
392   EXPECT_EQ(Animation::Running, anim->run_state());
393 }
394
395 }  // namespace
396 }  // namespace cc