Don't consider a Bluetooth adapter present until it has an address.
[chromium-blink-merge.git] / cc / CCLayerAnimationControllerTest.cpp
blob9f03744c9d1ec8e1c700426ea095ba5e0a71b756
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 "config.h"
7 #include "CCLayerAnimationController.h"
9 #include "CCActiveAnimation.h"
10 #include "CCAnimationCurve.h"
11 #include "CCAnimationTestCommon.h"
12 #include <gmock/gmock.h>
13 #include <gtest/gtest.h>
14 #include <public/WebTransformationMatrix.h>
15 #include <wtf/Vector.h>
17 using namespace WebCore;
18 using namespace WebKitTests;
19 using WebKit::WebTransformationMatrix;
21 namespace {
23 void expectTranslateX(double translateX, const WebTransformationMatrix& matrix)
25 EXPECT_FLOAT_EQ(translateX, matrix.m41());
28 PassOwnPtr<CCActiveAnimation> createActiveAnimation(PassOwnPtr<CCAnimationCurve> curve, int id, CCActiveAnimation::TargetProperty property)
30 return CCActiveAnimation::create(curve, 0, id, property);
33 TEST(CCLayerAnimationControllerTest, syncNewAnimation)
35 FakeLayerAnimationControllerClient dummyImpl;
36 OwnPtr<CCLayerAnimationController> controllerImpl(CCLayerAnimationController::create(&dummyImpl));
37 FakeLayerAnimationControllerClient dummy;
38 OwnPtr<CCLayerAnimationController> controller(CCLayerAnimationController::create(&dummy));
40 EXPECT_FALSE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
42 addOpacityTransitionToController(*controller, 1, 0, 1, false);
44 controller->pushAnimationUpdatesTo(controllerImpl.get());
46 EXPECT_TRUE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
47 EXPECT_EQ(CCActiveAnimation::WaitingForTargetAvailability, controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
50 // If an animation is started on the impl thread before it is ticked on the main
51 // thread, we must be sure to respect the synchronized start time.
52 TEST(CCLayerAnimationControllerTest, doNotClobberStartTimes)
54 FakeLayerAnimationControllerClient dummyImpl;
55 OwnPtr<CCLayerAnimationController> controllerImpl(CCLayerAnimationController::create(&dummyImpl));
56 FakeLayerAnimationControllerClient dummy;
57 OwnPtr<CCLayerAnimationController> controller(CCLayerAnimationController::create(&dummy));
59 EXPECT_FALSE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
61 addOpacityTransitionToController(*controller, 1, 0, 1, false);
63 controller->pushAnimationUpdatesTo(controllerImpl.get());
65 EXPECT_TRUE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
66 EXPECT_EQ(CCActiveAnimation::WaitingForTargetAvailability, controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
68 CCAnimationEventsVector events;
69 controllerImpl->animate(1, &events);
71 // Synchronize the start times.
72 EXPECT_EQ(1u, events.size());
73 controller->notifyAnimationStarted(events[0]);
74 EXPECT_EQ(controller->getActiveAnimation(0, CCActiveAnimation::Opacity)->startTime(), controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->startTime());
76 // Start the animation on the main thread. Should not affect the start time.
77 controller->animate(1.5, 0);
78 EXPECT_EQ(controller->getActiveAnimation(0, CCActiveAnimation::Opacity)->startTime(), controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->startTime());
81 TEST(CCLayerAnimationControllerTest, syncPauseAndResume)
83 FakeLayerAnimationControllerClient dummyImpl;
84 OwnPtr<CCLayerAnimationController> controllerImpl(CCLayerAnimationController::create(&dummyImpl));
85 FakeLayerAnimationControllerClient dummy;
86 OwnPtr<CCLayerAnimationController> controller(CCLayerAnimationController::create(&dummy));
88 EXPECT_FALSE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
90 addOpacityTransitionToController(*controller, 1, 0, 1, false);
92 controller->pushAnimationUpdatesTo(controllerImpl.get());
94 EXPECT_TRUE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
95 EXPECT_EQ(CCActiveAnimation::WaitingForTargetAvailability, controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
97 // Start the animations on each controller.
98 CCAnimationEventsVector events;
99 controllerImpl->animate(0, &events);
100 controller->animate(0, 0);
101 EXPECT_EQ(CCActiveAnimation::Running, controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
102 EXPECT_EQ(CCActiveAnimation::Running, controller->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
104 // Pause the main-thread animation.
105 controller->suspendAnimations(1);
106 EXPECT_EQ(CCActiveAnimation::Paused, controller->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
108 // The pause run state change should make it to the impl thread controller.
109 controller->pushAnimationUpdatesTo(controllerImpl.get());
110 EXPECT_EQ(CCActiveAnimation::Paused, controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
112 // Resume the main-thread animation.
113 controller->resumeAnimations(2);
114 EXPECT_EQ(CCActiveAnimation::Running, controller->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
116 // The pause run state change should make it to the impl thread controller.
117 controller->pushAnimationUpdatesTo(controllerImpl.get());
118 EXPECT_EQ(CCActiveAnimation::Running, controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
121 TEST(CCLayerAnimationControllerTest, doNotSyncFinishedAnimation)
123 FakeLayerAnimationControllerClient dummyImpl;
124 OwnPtr<CCLayerAnimationController> controllerImpl(CCLayerAnimationController::create(&dummyImpl));
125 FakeLayerAnimationControllerClient dummy;
126 OwnPtr<CCLayerAnimationController> controller(CCLayerAnimationController::create(&dummy));
128 EXPECT_FALSE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
130 addOpacityTransitionToController(*controller, 1, 0, 1, false);
132 controller->pushAnimationUpdatesTo(controllerImpl.get());
134 EXPECT_TRUE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
135 EXPECT_EQ(CCActiveAnimation::WaitingForTargetAvailability, controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity)->runState());
137 // Notify main thread controller that the animation has started.
138 CCAnimationEvent animationStartedEvent(CCAnimationEvent::Started, 0, 0, CCActiveAnimation::Opacity, 0);
139 controller->notifyAnimationStarted(animationStartedEvent);
141 // Force animation to complete on impl thread.
142 controllerImpl->removeAnimation(0);
144 EXPECT_FALSE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
146 controller->pushAnimationUpdatesTo(controllerImpl.get());
148 // Even though the main thread has a 'new' animation, it should not be pushed because the animation has already completed on the impl thread.
149 EXPECT_FALSE(controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity));
152 // Tests that transitioning opacity from 0 to 1 works as expected.
153 TEST(CCLayerAnimationControllerTest, TrivialTransition)
155 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
156 FakeLayerAnimationControllerClient dummy;
157 OwnPtr<CCLayerAnimationController> controller(
158 CCLayerAnimationController::create(&dummy));
160 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), 1, CCActiveAnimation::Opacity));
162 controller->addAnimation(toAdd.release());
163 controller->animate(0, events.get());
164 EXPECT_TRUE(controller->hasActiveAnimation());
165 EXPECT_EQ(0, dummy.opacity());
166 controller->animate(1, events.get());
167 EXPECT_EQ(1, dummy.opacity());
168 EXPECT_FALSE(controller->hasActiveAnimation());
171 // Tests animations that are waiting for a synchronized start time do not finish.
172 TEST(CCLayerAnimationControllerTest, AnimationsWaitingForStartTimeDoNotFinishIfTheyWaitLongerToStartThanTheirDuration)
174 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
175 FakeLayerAnimationControllerClient dummy;
176 OwnPtr<CCLayerAnimationController> controller(
177 CCLayerAnimationController::create(&dummy));
179 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), 1, CCActiveAnimation::Opacity));
180 toAdd->setNeedsSynchronizedStartTime(true);
182 // We should pause at the first keyframe indefinitely waiting for that animation to start.
183 controller->addAnimation(toAdd.release());
184 controller->animate(0, events.get());
185 EXPECT_TRUE(controller->hasActiveAnimation());
186 EXPECT_EQ(0, dummy.opacity());
187 controller->animate(1, events.get());
188 EXPECT_TRUE(controller->hasActiveAnimation());
189 EXPECT_EQ(0, dummy.opacity());
190 controller->animate(2, events.get());
191 EXPECT_TRUE(controller->hasActiveAnimation());
192 EXPECT_EQ(0, dummy.opacity());
194 // Send the synchronized start time.
195 controller->notifyAnimationStarted(CCAnimationEvent(CCAnimationEvent::Started, 0, 1, CCActiveAnimation::Opacity, 2));
196 controller->animate(5, events.get());
197 EXPECT_EQ(1, dummy.opacity());
198 EXPECT_FALSE(controller->hasActiveAnimation());
201 // Tests that two queued animations affecting the same property run in sequence.
202 TEST(CCLayerAnimationControllerTest, TrivialQueuing)
204 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
205 FakeLayerAnimationControllerClient dummy;
206 OwnPtr<CCLayerAnimationController> controller(
207 CCLayerAnimationController::create(&dummy));
209 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), 1, CCActiveAnimation::Opacity));
210 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 1, 0.5)), 2, CCActiveAnimation::Opacity));
212 controller->animate(0, events.get());
213 EXPECT_TRUE(controller->hasActiveAnimation());
214 EXPECT_EQ(0, dummy.opacity());
215 controller->animate(1, events.get());
216 EXPECT_TRUE(controller->hasActiveAnimation());
217 EXPECT_EQ(1, dummy.opacity());
218 controller->animate(2, events.get());
219 EXPECT_EQ(0.5, dummy.opacity());
220 EXPECT_FALSE(controller->hasActiveAnimation());
223 // Tests interrupting a transition with another transition.
224 TEST(CCLayerAnimationControllerTest, Interrupt)
226 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
227 FakeLayerAnimationControllerClient dummy;
228 OwnPtr<CCLayerAnimationController> controller(
229 CCLayerAnimationController::create(&dummy));
230 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), 1, CCActiveAnimation::Opacity));
231 controller->animate(0, events.get());
232 EXPECT_TRUE(controller->hasActiveAnimation());
233 EXPECT_EQ(0, dummy.opacity());
235 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 1, 0.5)), 2, CCActiveAnimation::Opacity));
236 toAdd->setRunState(CCActiveAnimation::WaitingForNextTick, 0);
237 controller->addAnimation(toAdd.release());
239 // Since the animation was in the WaitingForNextTick state, it should start right in
240 // this call to animate.
241 controller->animate(0.5, events.get());
242 EXPECT_TRUE(controller->hasActiveAnimation());
243 EXPECT_EQ(1, dummy.opacity());
244 controller->animate(1.5, events.get());
245 EXPECT_EQ(0.5, dummy.opacity());
246 EXPECT_FALSE(controller->hasActiveAnimation());
249 // Tests scheduling two animations to run together when only one property is free.
250 TEST(CCLayerAnimationControllerTest, ScheduleTogetherWhenAPropertyIsBlocked)
252 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
253 FakeLayerAnimationControllerClient dummy;
254 OwnPtr<CCLayerAnimationController> controller(
255 CCLayerAnimationController::create(&dummy));
257 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeTransformTransition(1)), 1, CCActiveAnimation::Transform));
258 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeTransformTransition(1)), 2, CCActiveAnimation::Transform));
259 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), 2, CCActiveAnimation::Opacity));
261 controller->animate(0, events.get());
262 EXPECT_EQ(0, dummy.opacity());
263 EXPECT_TRUE(controller->hasActiveAnimation());
264 controller->animate(1, events.get());
265 // Should not have started the float transition yet.
266 EXPECT_TRUE(controller->hasActiveAnimation());
267 EXPECT_EQ(0, dummy.opacity());
268 // The float animation should have started at time 1 and should be done.
269 controller->animate(2, events.get());
270 EXPECT_EQ(1, dummy.opacity());
271 EXPECT_FALSE(controller->hasActiveAnimation());
274 // Tests scheduling two animations to run together with different lengths and another
275 // animation queued to start when the shorter animation finishes (should wait
276 // for both to finish).
277 TEST(CCLayerAnimationControllerTest, ScheduleTogetherWithAnAnimWaiting)
279 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
280 FakeLayerAnimationControllerClient dummy;
281 OwnPtr<CCLayerAnimationController> controller(
282 CCLayerAnimationController::create(&dummy));
284 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeTransformTransition(2)), 1, CCActiveAnimation::Transform));
285 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), 1, CCActiveAnimation::Opacity));
286 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 1, 0.5)), 2, CCActiveAnimation::Opacity));
288 // Animations with id 1 should both start now.
289 controller->animate(0, events.get());
290 EXPECT_TRUE(controller->hasActiveAnimation());
291 EXPECT_EQ(0, dummy.opacity());
292 // The opacity animation should have finished at time 1, but the group
293 // of animations with id 1 don't finish until time 2 because of the length
294 // of the transform animation.
295 controller->animate(2, events.get());
296 // Should not have started the float transition yet.
297 EXPECT_TRUE(controller->hasActiveAnimation());
298 EXPECT_EQ(1, dummy.opacity());
300 // The second opacity animation should start at time 2 and should be done by time 3
301 controller->animate(3, events.get());
302 EXPECT_EQ(0.5, dummy.opacity());
303 EXPECT_FALSE(controller->hasActiveAnimation());
306 // Tests scheduling an animation to start in the future.
307 TEST(CCLayerAnimationControllerTest, ScheduleAnimation)
309 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
310 FakeLayerAnimationControllerClient dummy;
311 OwnPtr<CCLayerAnimationController> controller(
312 CCLayerAnimationController::create(&dummy));
314 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), 1, CCActiveAnimation::Opacity));
315 toAdd->setRunState(CCActiveAnimation::WaitingForStartTime, 0);
316 toAdd->setStartTime(1);
317 controller->addAnimation(toAdd.release());
319 controller->animate(0, events.get());
320 EXPECT_TRUE(controller->hasActiveAnimation());
321 EXPECT_EQ(0, dummy.opacity());
322 controller->animate(1, events.get());
323 EXPECT_TRUE(controller->hasActiveAnimation());
324 EXPECT_EQ(0, dummy.opacity());
325 controller->animate(2, events.get());
326 EXPECT_EQ(1, dummy.opacity());
327 EXPECT_FALSE(controller->hasActiveAnimation());
330 // Tests scheduling an animation to start in the future that's interrupting a running animation.
331 TEST(CCLayerAnimationControllerTest, ScheduledAnimationInterruptsRunningAnimation)
333 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
334 FakeLayerAnimationControllerClient dummy;
335 OwnPtr<CCLayerAnimationController> controller(
336 CCLayerAnimationController::create(&dummy));
338 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(2, 0, 1)), 1, CCActiveAnimation::Opacity));
340 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0.5, 0)), 2, CCActiveAnimation::Opacity));
341 toAdd->setRunState(CCActiveAnimation::WaitingForStartTime, 0);
342 toAdd->setStartTime(1);
343 controller->addAnimation(toAdd.release());
345 // First 2s opacity transition should start immediately.
346 controller->animate(0, events.get());
347 EXPECT_TRUE(controller->hasActiveAnimation());
348 EXPECT_EQ(0, dummy.opacity());
349 controller->animate(0.5, events.get());
350 EXPECT_TRUE(controller->hasActiveAnimation());
351 EXPECT_EQ(0.25, dummy.opacity());
352 controller->animate(1, events.get());
353 EXPECT_TRUE(controller->hasActiveAnimation());
354 EXPECT_EQ(0.5, dummy.opacity());
355 controller->animate(2, events.get());
356 EXPECT_EQ(0, dummy.opacity());
357 EXPECT_FALSE(controller->hasActiveAnimation());
360 // Tests scheduling an animation to start in the future that interrupts a running animation
361 // and there is yet another animation queued to start later.
362 TEST(CCLayerAnimationControllerTest, ScheduledAnimationInterruptsRunningAnimationWithAnimInQueue)
364 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
365 FakeLayerAnimationControllerClient dummy;
366 OwnPtr<CCLayerAnimationController> controller(
367 CCLayerAnimationController::create(&dummy));
369 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(2, 0, 1)), 1, CCActiveAnimation::Opacity));
371 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(2, 0.5, 0)), 2, CCActiveAnimation::Opacity));
372 toAdd->setRunState(CCActiveAnimation::WaitingForStartTime, 0);
373 toAdd->setStartTime(1);
374 controller->addAnimation(toAdd.release());
376 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 0.75)), 3, CCActiveAnimation::Opacity));
378 // First 2s opacity transition should start immediately.
379 controller->animate(0, events.get());
380 EXPECT_TRUE(controller->hasActiveAnimation());
381 EXPECT_EQ(0, dummy.opacity());
382 controller->animate(0.5, events.get());
383 EXPECT_TRUE(controller->hasActiveAnimation());
384 EXPECT_EQ(0.25, dummy.opacity());
385 EXPECT_TRUE(controller->hasActiveAnimation());
386 controller->animate(1, events.get());
387 EXPECT_TRUE(controller->hasActiveAnimation());
388 EXPECT_EQ(0.5, dummy.opacity());
389 controller->animate(3, events.get());
390 EXPECT_TRUE(controller->hasActiveAnimation());
391 EXPECT_EQ(0, dummy.opacity());
392 controller->animate(4, events.get());
393 EXPECT_EQ(0.75, dummy.opacity());
394 EXPECT_FALSE(controller->hasActiveAnimation());
397 // Test that a looping animation loops and for the correct number of iterations.
398 TEST(CCLayerAnimationControllerTest, TrivialLooping)
400 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
401 FakeLayerAnimationControllerClient dummy;
402 OwnPtr<CCLayerAnimationController> controller(
403 CCLayerAnimationController::create(&dummy));
405 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), 1, CCActiveAnimation::Opacity));
406 toAdd->setIterations(3);
407 controller->addAnimation(toAdd.release());
409 controller->animate(0, events.get());
410 EXPECT_TRUE(controller->hasActiveAnimation());
411 EXPECT_EQ(0, dummy.opacity());
412 controller->animate(1.25, events.get());
413 EXPECT_TRUE(controller->hasActiveAnimation());
414 EXPECT_EQ(0.25, dummy.opacity());
415 controller->animate(1.75, events.get());
416 EXPECT_TRUE(controller->hasActiveAnimation());
417 EXPECT_EQ(0.75, dummy.opacity());
418 controller->animate(2.25, events.get());
419 EXPECT_TRUE(controller->hasActiveAnimation());
420 EXPECT_EQ(0.25, dummy.opacity());
421 controller->animate(2.75, events.get());
422 EXPECT_TRUE(controller->hasActiveAnimation());
423 EXPECT_EQ(0.75, dummy.opacity());
424 controller->animate(3, events.get());
425 EXPECT_FALSE(controller->hasActiveAnimation());
426 EXPECT_EQ(1, dummy.opacity());
428 // Just be extra sure.
429 controller->animate(4, events.get());
430 EXPECT_EQ(1, dummy.opacity());
433 // Test that an infinitely looping animation does indeed go until aborted.
434 TEST(CCLayerAnimationControllerTest, InfiniteLooping)
436 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
437 FakeLayerAnimationControllerClient dummy;
438 OwnPtr<CCLayerAnimationController> controller(
439 CCLayerAnimationController::create(&dummy));
441 const int id = 1;
442 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), id, CCActiveAnimation::Opacity));
443 toAdd->setIterations(-1);
444 controller->addAnimation(toAdd.release());
446 controller->animate(0, events.get());
447 EXPECT_TRUE(controller->hasActiveAnimation());
448 EXPECT_EQ(0, dummy.opacity());
449 controller->animate(1.25, events.get());
450 EXPECT_TRUE(controller->hasActiveAnimation());
451 EXPECT_EQ(0.25, dummy.opacity());
452 controller->animate(1.75, events.get());
453 EXPECT_TRUE(controller->hasActiveAnimation());
454 EXPECT_EQ(0.75, dummy.opacity());
456 controller->animate(1073741824.25, events.get());
457 EXPECT_TRUE(controller->hasActiveAnimation());
458 EXPECT_EQ(0.25, dummy.opacity());
459 controller->animate(1073741824.75, events.get());
460 EXPECT_TRUE(controller->hasActiveAnimation());
461 EXPECT_EQ(0.75, dummy.opacity());
463 EXPECT_TRUE(controller->getActiveAnimation(id, CCActiveAnimation::Opacity));
464 controller->getActiveAnimation(id, CCActiveAnimation::Opacity)->setRunState(CCActiveAnimation::Aborted, 0.75);
465 EXPECT_FALSE(controller->hasActiveAnimation());
466 EXPECT_EQ(0.75, dummy.opacity());
469 // Test that pausing and resuming work as expected.
470 TEST(CCLayerAnimationControllerTest, PauseResume)
472 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
473 FakeLayerAnimationControllerClient dummy;
474 OwnPtr<CCLayerAnimationController> controller(
475 CCLayerAnimationController::create(&dummy));
477 const int id = 1;
478 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 0, 1)), id, CCActiveAnimation::Opacity));
480 controller->animate(0, events.get());
481 EXPECT_TRUE(controller->hasActiveAnimation());
482 EXPECT_EQ(0, dummy.opacity());
483 controller->animate(0.5, events.get());
484 EXPECT_TRUE(controller->hasActiveAnimation());
485 EXPECT_EQ(0.5, dummy.opacity());
487 EXPECT_TRUE(controller->getActiveAnimation(id, CCActiveAnimation::Opacity));
488 controller->getActiveAnimation(id, CCActiveAnimation::Opacity)->setRunState(CCActiveAnimation::Paused, 0.5);
490 controller->animate(1024, events.get());
491 EXPECT_TRUE(controller->hasActiveAnimation());
492 EXPECT_EQ(0.5, dummy.opacity());
494 EXPECT_TRUE(controller->getActiveAnimation(id, CCActiveAnimation::Opacity));
495 controller->getActiveAnimation(id, CCActiveAnimation::Opacity)->setRunState(CCActiveAnimation::Running, 1024);
497 controller->animate(1024.25, events.get());
498 EXPECT_TRUE(controller->hasActiveAnimation());
499 EXPECT_EQ(0.75, dummy.opacity());
500 controller->animate(1024.5, events.get());
501 EXPECT_FALSE(controller->hasActiveAnimation());
502 EXPECT_EQ(1, dummy.opacity());
505 TEST(CCLayerAnimationControllerTest, AbortAGroupedAnimation)
507 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
508 FakeLayerAnimationControllerClient dummy;
509 OwnPtr<CCLayerAnimationController> controller(
510 CCLayerAnimationController::create(&dummy));
512 const int id = 1;
513 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeTransformTransition(1)), id, CCActiveAnimation::Transform));
514 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(2, 0, 1)), id, CCActiveAnimation::Opacity));
515 controller->addAnimation(createActiveAnimation(adoptPtr(new FakeFloatTransition(1, 1, 0.75)), 2, CCActiveAnimation::Opacity));
517 controller->animate(0, events.get());
518 EXPECT_TRUE(controller->hasActiveAnimation());
519 EXPECT_EQ(0, dummy.opacity());
520 controller->animate(1, events.get());
521 EXPECT_TRUE(controller->hasActiveAnimation());
522 EXPECT_EQ(0.5, dummy.opacity());
524 EXPECT_TRUE(controller->getActiveAnimation(id, CCActiveAnimation::Opacity));
525 controller->getActiveAnimation(id, CCActiveAnimation::Opacity)->setRunState(CCActiveAnimation::Aborted, 1);
526 controller->animate(1, events.get());
527 EXPECT_TRUE(controller->hasActiveAnimation());
528 EXPECT_EQ(1, dummy.opacity());
529 controller->animate(2, events.get());
530 EXPECT_TRUE(!controller->hasActiveAnimation());
531 EXPECT_EQ(0.75, dummy.opacity());
534 TEST(CCLayerAnimationControllerTest, ForceSyncWhenSynchronizedStartTimeNeeded)
536 FakeLayerAnimationControllerClient dummyImpl;
537 OwnPtr<CCLayerAnimationController> controllerImpl(CCLayerAnimationController::create(&dummyImpl));
538 OwnPtr<CCAnimationEventsVector> events(adoptPtr(new CCAnimationEventsVector));
539 FakeLayerAnimationControllerClient dummy;
540 OwnPtr<CCLayerAnimationController> controller(
541 CCLayerAnimationController::create(&dummy));
543 OwnPtr<CCActiveAnimation> toAdd(createActiveAnimation(adoptPtr(new FakeFloatTransition(2, 0, 1)), 0, CCActiveAnimation::Opacity));
544 toAdd->setNeedsSynchronizedStartTime(true);
545 controller->addAnimation(toAdd.release());
547 controller->animate(0, 0);
548 EXPECT_TRUE(controller->hasActiveAnimation());
549 CCActiveAnimation* activeAnimation = controller->getActiveAnimation(0, CCActiveAnimation::Opacity);
550 EXPECT_TRUE(activeAnimation);
551 EXPECT_TRUE(activeAnimation->needsSynchronizedStartTime());
553 controller->setForceSync();
555 controller->pushAnimationUpdatesTo(controllerImpl.get());
557 activeAnimation = controllerImpl->getActiveAnimation(0, CCActiveAnimation::Opacity);
558 EXPECT_TRUE(activeAnimation);
559 EXPECT_EQ(CCActiveAnimation::WaitingForTargetAvailability, activeAnimation->runState());
562 } // namespace