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/layer_animation_controller.h"
7 #include "cc/animation/animation.h"
8 #include "cc/animation/animation_curve.h"
9 #include "cc/animation/keyframed_animation_curve.h"
10 #include "cc/animation/transform_operations.h"
11 #include "cc/test/animation_test_common.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14 #include "third_party/WebKit/public/platform/WebAnimationDelegate.h"
15 #include "ui/gfx/transform.h"
20 void ExpectTranslateX(double translate_x
, const gfx::Transform
& matrix
) {
21 EXPECT_FLOAT_EQ(translate_x
, matrix
.matrix().getDouble(0, 3)); }
23 scoped_ptr
<Animation
> CreateAnimation(scoped_ptr
<AnimationCurve
> curve
,
25 Animation::TargetProperty property
) {
26 return Animation::Create(curve
.Pass(), 0, id
, property
);
29 TEST(LayerAnimationControllerTest
, SyncNewAnimation
) {
30 FakeLayerAnimationValueObserver dummy_impl
;
31 scoped_refptr
<LayerAnimationController
> controller_impl(
32 LayerAnimationController::Create(0));
33 controller_impl
->AddValueObserver(&dummy_impl
);
34 FakeLayerAnimationValueObserver dummy
;
35 scoped_refptr
<LayerAnimationController
> controller(
36 LayerAnimationController::Create(0));
37 controller
->AddValueObserver(&dummy
);
39 EXPECT_FALSE(controller_impl
->GetAnimation(Animation::Opacity
));
41 AddOpacityTransitionToController(controller
.get(), 1, 0, 1, false);
42 int group_id
= controller
->GetAnimation(Animation::Opacity
)->group();
44 controller
->PushAnimationUpdatesTo(controller_impl
.get());
46 EXPECT_TRUE(controller_impl
->GetAnimation(group_id
, Animation::Opacity
));
47 EXPECT_EQ(Animation::WaitingForTargetAvailability
,
48 controller_impl
->GetAnimation(group_id
,
49 Animation::Opacity
)->run_state());
52 // If an animation is started on the impl thread before it is ticked on the main
53 // thread, we must be sure to respect the synchronized start time.
54 TEST(LayerAnimationControllerTest
, DoNotClobberStartTimes
) {
55 FakeLayerAnimationValueObserver dummy_impl
;
56 scoped_refptr
<LayerAnimationController
> controller_impl(
57 LayerAnimationController::Create(0));
58 controller_impl
->AddValueObserver(&dummy_impl
);
59 FakeLayerAnimationValueObserver dummy
;
60 scoped_refptr
<LayerAnimationController
> controller(
61 LayerAnimationController::Create(0));
62 controller
->AddValueObserver(&dummy
);
64 EXPECT_FALSE(controller_impl
->GetAnimation(Animation::Opacity
));
66 AddOpacityTransitionToController(controller
.get(), 1, 0, 1, false);
67 int group_id
= controller
->GetAnimation(Animation::Opacity
)->group();
69 controller
->PushAnimationUpdatesTo(controller_impl
.get());
71 EXPECT_TRUE(controller_impl
->GetAnimation(group_id
, Animation::Opacity
));
72 EXPECT_EQ(Animation::WaitingForTargetAvailability
,
73 controller_impl
->GetAnimation(group_id
,
74 Animation::Opacity
)->run_state());
76 AnimationEventsVector events
;
77 controller_impl
->Animate(1.0);
78 controller_impl
->UpdateState(true, &events
);
80 // Synchronize the start times.
81 EXPECT_EQ(1u, events
.size());
82 controller
->NotifyAnimationStarted(events
[0], 0.0);
83 EXPECT_EQ(controller
->GetAnimation(group_id
,
84 Animation::Opacity
)->start_time(),
85 controller_impl
->GetAnimation(group_id
,
86 Animation::Opacity
)->start_time());
88 // Start the animation on the main thread. Should not affect the start time.
89 controller
->Animate(1.5);
90 controller
->UpdateState(true, NULL
);
91 EXPECT_EQ(controller
->GetAnimation(group_id
,
92 Animation::Opacity
)->start_time(),
93 controller_impl
->GetAnimation(group_id
,
94 Animation::Opacity
)->start_time());
97 TEST(LayerAnimationControllerTest
, SyncPauseAndResume
) {
98 FakeLayerAnimationValueObserver dummy_impl
;
99 scoped_refptr
<LayerAnimationController
> controller_impl(
100 LayerAnimationController::Create(0));
101 controller_impl
->AddValueObserver(&dummy_impl
);
102 FakeLayerAnimationValueObserver dummy
;
103 scoped_refptr
<LayerAnimationController
> controller(
104 LayerAnimationController::Create(0));
105 controller
->AddValueObserver(&dummy
);
107 EXPECT_FALSE(controller_impl
->GetAnimation(Animation::Opacity
));
109 AddOpacityTransitionToController(controller
.get(), 1, 0, 1, false);
110 int group_id
= controller
->GetAnimation(Animation::Opacity
)->group();
112 controller
->PushAnimationUpdatesTo(controller_impl
.get());
114 EXPECT_TRUE(controller_impl
->GetAnimation(group_id
, Animation::Opacity
));
115 EXPECT_EQ(Animation::WaitingForTargetAvailability
,
116 controller_impl
->GetAnimation(group_id
,
117 Animation::Opacity
)->run_state());
119 // Start the animations on each controller.
120 AnimationEventsVector events
;
121 controller_impl
->Animate(0.0);
122 controller_impl
->UpdateState(true, &events
);
123 controller
->Animate(0.0);
124 controller
->UpdateState(true, NULL
);
125 EXPECT_EQ(Animation::Running
,
126 controller_impl
->GetAnimation(group_id
,
127 Animation::Opacity
)->run_state());
128 EXPECT_EQ(Animation::Running
,
129 controller
->GetAnimation(group_id
,
130 Animation::Opacity
)->run_state());
132 // Pause the main-thread animation.
133 controller
->SuspendAnimations(1.0);
134 EXPECT_EQ(Animation::Paused
,
135 controller
->GetAnimation(group_id
,
136 Animation::Opacity
)->run_state());
138 // The pause run state change should make it to the impl thread controller.
139 controller
->PushAnimationUpdatesTo(controller_impl
.get());
140 EXPECT_EQ(Animation::Paused
,
141 controller_impl
->GetAnimation(group_id
,
142 Animation::Opacity
)->run_state());
144 // Resume the main-thread animation.
145 controller
->ResumeAnimations(2.0);
146 EXPECT_EQ(Animation::Running
,
147 controller
->GetAnimation(group_id
,
148 Animation::Opacity
)->run_state());
150 // The pause run state change should make it to the impl thread controller.
151 controller
->PushAnimationUpdatesTo(controller_impl
.get());
152 EXPECT_EQ(Animation::Running
,
153 controller_impl
->GetAnimation(group_id
,
154 Animation::Opacity
)->run_state());
157 TEST(LayerAnimationControllerTest
, DoNotSyncFinishedAnimation
) {
158 FakeLayerAnimationValueObserver dummy_impl
;
159 scoped_refptr
<LayerAnimationController
> controller_impl(
160 LayerAnimationController::Create(0));
161 controller_impl
->AddValueObserver(&dummy_impl
);
162 FakeLayerAnimationValueObserver dummy
;
163 scoped_refptr
<LayerAnimationController
> controller(
164 LayerAnimationController::Create(0));
165 controller
->AddValueObserver(&dummy
);
167 EXPECT_FALSE(controller_impl
->GetAnimation(Animation::Opacity
));
170 AddOpacityTransitionToController(controller
.get(), 1, 0, 1, false);
171 int group_id
= controller
->GetAnimation(Animation::Opacity
)->group();
173 controller
->PushAnimationUpdatesTo(controller_impl
.get());
175 EXPECT_TRUE(controller_impl
->GetAnimation(group_id
, Animation::Opacity
));
176 EXPECT_EQ(Animation::WaitingForTargetAvailability
,
177 controller_impl
->GetAnimation(group_id
,
178 Animation::Opacity
)->run_state());
180 // Notify main thread controller that the animation has started.
181 AnimationEvent
animation_started_event(
182 AnimationEvent::Started
, 0, group_id
, Animation::Opacity
, 0);
183 controller
->NotifyAnimationStarted(animation_started_event
, 0.0);
185 // Force animation to complete on impl thread.
186 controller_impl
->RemoveAnimation(animation_id
);
188 EXPECT_FALSE(controller_impl
->GetAnimation(group_id
, Animation::Opacity
));
190 controller
->PushAnimationUpdatesTo(controller_impl
.get());
192 // Even though the main thread has a 'new' animation, it should not be pushed
193 // because the animation has already completed on the impl thread.
194 EXPECT_FALSE(controller_impl
->GetAnimation(group_id
, Animation::Opacity
));
197 // Ensure that a finished animation is eventually deleted by both the
198 // main-thread and the impl-thread controllers.
199 TEST(LayerAnimationControllerTest
, AnimationsAreDeleted
) {
200 FakeLayerAnimationValueObserver dummy
;
201 FakeLayerAnimationValueObserver dummy_impl
;
202 scoped_ptr
<AnimationEventsVector
> events(
203 make_scoped_ptr(new AnimationEventsVector
));
204 scoped_refptr
<LayerAnimationController
> controller(
205 LayerAnimationController::Create(0));
206 scoped_refptr
<LayerAnimationController
> controller_impl(
207 LayerAnimationController::Create(0));
208 controller
->AddValueObserver(&dummy
);
209 controller_impl
->AddValueObserver(&dummy_impl
);
211 AddOpacityTransitionToController(controller
.get(), 1.0, 0.0f
, 1.0f
, false);
212 controller
->Animate(0.0);
213 controller
->UpdateState(true, NULL
);
214 controller
->PushAnimationUpdatesTo(controller_impl
.get());
216 controller_impl
->Animate(0.5);
217 controller_impl
->UpdateState(true, events
.get());
219 // There should be a Started event for the animation.
220 EXPECT_EQ(1u, events
->size());
221 EXPECT_EQ(AnimationEvent::Started
, (*events
)[0].type
);
222 controller
->NotifyAnimationStarted((*events
)[0], 0.0);
224 controller
->Animate(1.0);
225 controller
->UpdateState(true, NULL
);
227 events
.reset(new AnimationEventsVector
);
228 controller_impl
->Animate(2.0);
229 controller_impl
->UpdateState(true, events
.get());
231 // There should be a Finished event for the animation.
232 EXPECT_EQ(1u, events
->size());
233 EXPECT_EQ(AnimationEvent::Finished
, (*events
)[0].type
);
235 // Neither controller should have deleted the animation yet.
236 EXPECT_TRUE(controller
->GetAnimation(Animation::Opacity
));
237 EXPECT_TRUE(controller_impl
->GetAnimation(Animation::Opacity
));
239 controller
->NotifyAnimationFinished((*events
)[0], 0.0);
241 controller
->Animate(3.0);
242 controller
->UpdateState(true, NULL
);
244 controller
->PushAnimationUpdatesTo(controller_impl
.get());
246 // Both controllers should now have deleted the animation.
247 EXPECT_FALSE(controller
->has_any_animation());
248 EXPECT_FALSE(controller_impl
->has_any_animation());
251 // Tests that transitioning opacity from 0 to 1 works as expected.
253 static const AnimationEvent
* GetMostRecentPropertyUpdateEvent(
254 const AnimationEventsVector
* events
) {
255 const AnimationEvent
* event
= 0;
256 for (size_t i
= 0; i
< events
->size(); ++i
)
257 if ((*events
)[i
].type
== AnimationEvent::PropertyUpdate
)
258 event
= &(*events
)[i
];
263 TEST(LayerAnimationControllerTest
, TrivialTransition
) {
264 scoped_ptr
<AnimationEventsVector
> events(
265 make_scoped_ptr(new AnimationEventsVector
));
266 FakeLayerAnimationValueObserver dummy
;
267 scoped_refptr
<LayerAnimationController
> controller(
268 LayerAnimationController::Create(0));
269 controller
->AddValueObserver(&dummy
);
271 scoped_ptr
<Animation
> to_add(CreateAnimation(
272 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
274 Animation::Opacity
));
276 controller
->AddAnimation(to_add
.Pass());
277 controller
->Animate(0.0);
278 controller
->UpdateState(true, events
.get());
279 EXPECT_TRUE(controller
->HasActiveAnimation());
280 EXPECT_EQ(0.f
, dummy
.opacity());
281 // A non-impl-only animation should not generate property updates.
282 const AnimationEvent
* event
= GetMostRecentPropertyUpdateEvent(events
.get());
284 controller
->Animate(1.0);
285 controller
->UpdateState(true, events
.get());
286 EXPECT_EQ(1.f
, dummy
.opacity());
287 EXPECT_FALSE(controller
->HasActiveAnimation());
288 event
= GetMostRecentPropertyUpdateEvent(events
.get());
292 TEST(LayerAnimationControllerTest
, TrivialTransitionOnImpl
) {
293 scoped_ptr
<AnimationEventsVector
> events(
294 make_scoped_ptr(new AnimationEventsVector
));
295 FakeLayerAnimationValueObserver dummy_impl
;
296 scoped_refptr
<LayerAnimationController
> controller_impl(
297 LayerAnimationController::Create(0));
298 controller_impl
->AddValueObserver(&dummy_impl
);
300 scoped_ptr
<Animation
> to_add(CreateAnimation(
301 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
303 Animation::Opacity
));
304 to_add
->set_is_impl_only(true);
306 controller_impl
->AddAnimation(to_add
.Pass());
307 controller_impl
->Animate(0.0);
308 controller_impl
->UpdateState(true, events
.get());
309 EXPECT_TRUE(controller_impl
->HasActiveAnimation());
310 EXPECT_EQ(0.f
, dummy_impl
.opacity());
311 EXPECT_EQ(2u, events
->size());
312 const AnimationEvent
* start_opacity_event
=
313 GetMostRecentPropertyUpdateEvent(events
.get());
314 EXPECT_EQ(0.f
, start_opacity_event
->opacity
);
316 controller_impl
->Animate(1.0);
317 controller_impl
->UpdateState(true, events
.get());
318 EXPECT_EQ(1.f
, dummy_impl
.opacity());
319 EXPECT_FALSE(controller_impl
->HasActiveAnimation());
320 EXPECT_EQ(4u, events
->size());
321 const AnimationEvent
* end_opacity_event
=
322 GetMostRecentPropertyUpdateEvent(events
.get());
323 EXPECT_EQ(1.f
, end_opacity_event
->opacity
);
326 TEST(LayerAnimationControllerTest
, TrivialTransformOnImpl
) {
327 scoped_ptr
<AnimationEventsVector
> events(
328 make_scoped_ptr(new AnimationEventsVector
));
329 FakeLayerAnimationValueObserver dummy_impl
;
330 scoped_refptr
<LayerAnimationController
> controller_impl(
331 LayerAnimationController::Create(0));
332 controller_impl
->AddValueObserver(&dummy_impl
);
334 // Choose different values for x and y to avoid coincidental values in the
335 // observed transforms.
336 const float delta_x
= 3;
337 const float delta_y
= 4;
339 scoped_ptr
<KeyframedTransformAnimationCurve
> curve(
340 KeyframedTransformAnimationCurve::Create());
342 // Create simple Transform animation.
343 TransformOperations operations
;
344 curve
->AddKeyframe(TransformKeyframe::Create(
345 0, operations
, scoped_ptr
<cc::TimingFunction
>()));
346 operations
.AppendTranslate(delta_x
, delta_y
, 0);
347 curve
->AddKeyframe(TransformKeyframe::Create(
348 1, operations
, scoped_ptr
<cc::TimingFunction
>()));
350 scoped_ptr
<Animation
> animation(Animation::Create(
351 curve
.PassAs
<AnimationCurve
>(), 1, 0, Animation::Transform
));
352 animation
->set_is_impl_only(true);
353 controller_impl
->AddAnimation(animation
.Pass());
356 controller_impl
->Animate(0.0);
357 controller_impl
->UpdateState(true, events
.get());
358 EXPECT_TRUE(controller_impl
->HasActiveAnimation());
359 EXPECT_EQ(gfx::Transform(), dummy_impl
.transform());
360 EXPECT_EQ(2u, events
->size());
361 const AnimationEvent
* start_transform_event
=
362 GetMostRecentPropertyUpdateEvent(events
.get());
363 ASSERT_TRUE(start_transform_event
);
364 EXPECT_EQ(gfx::Transform(), start_transform_event
->transform
);
365 EXPECT_TRUE(start_transform_event
->is_impl_only
);
367 gfx::Transform expected_transform
;
368 expected_transform
.Translate(delta_x
, delta_y
);
370 controller_impl
->Animate(1.0);
371 controller_impl
->UpdateState(true, events
.get());
372 EXPECT_EQ(expected_transform
, dummy_impl
.transform());
373 EXPECT_FALSE(controller_impl
->HasActiveAnimation());
374 EXPECT_EQ(4u, events
->size());
375 const AnimationEvent
* end_transform_event
=
376 GetMostRecentPropertyUpdateEvent(events
.get());
377 EXPECT_EQ(expected_transform
, end_transform_event
->transform
);
378 EXPECT_TRUE(end_transform_event
->is_impl_only
);
381 class FakeWebAnimationDelegate
: public WebKit::WebAnimationDelegate
{
383 FakeWebAnimationDelegate()
387 virtual void notifyAnimationStarted(double time
) OVERRIDE
{
391 virtual void notifyAnimationFinished(double time
) OVERRIDE
{
395 bool started() { return started_
; }
397 bool finished() { return finished_
; }
404 // Tests that impl-only animations lead to start and finished notifications
405 // being sent to the main thread controller's animation delegate.
406 TEST(LayerAnimationControllerTest
,
407 NotificationsForImplOnlyAnimationsAreSentToMainThreadDelegate
) {
408 FakeLayerAnimationValueObserver dummy_impl
;
409 scoped_refptr
<LayerAnimationController
> controller_impl(
410 LayerAnimationController::Create(0));
411 controller_impl
->AddValueObserver(&dummy_impl
);
412 scoped_ptr
<AnimationEventsVector
> events(
413 make_scoped_ptr(new AnimationEventsVector
));
414 FakeLayerAnimationValueObserver dummy
;
415 scoped_refptr
<LayerAnimationController
> controller(
416 LayerAnimationController::Create(0));
417 controller
->AddValueObserver(&dummy
);
418 FakeWebAnimationDelegate delegate
;
419 controller
->set_layer_animation_delegate(&delegate
);
421 scoped_ptr
<Animation
> to_add(CreateAnimation(
422 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
424 Animation::Opacity
));
425 to_add
->set_is_impl_only(true);
426 controller_impl
->AddAnimation(to_add
.Pass());
428 controller_impl
->Animate(0.0);
429 controller_impl
->UpdateState(true, events
.get());
431 // We should receive 2 events (a started notification and a property update).
432 EXPECT_EQ(2u, events
->size());
433 EXPECT_EQ(AnimationEvent::Started
, (*events
)[0].type
);
434 EXPECT_TRUE((*events
)[0].is_impl_only
);
435 EXPECT_EQ(AnimationEvent::PropertyUpdate
, (*events
)[1].type
);
436 EXPECT_TRUE((*events
)[1].is_impl_only
);
438 // Passing on the start event to the main thread controller should cause the
439 // delegate to get notified.
440 EXPECT_FALSE(delegate
.started());
441 controller
->NotifyAnimationStarted((*events
)[0], 0.0);
442 EXPECT_TRUE(delegate
.started());
444 events
.reset(new AnimationEventsVector
);
445 controller_impl
->Animate(1.0);
446 controller_impl
->UpdateState(true, events
.get());
448 // We should receive 2 events (a finished notification and a property update).
449 EXPECT_EQ(2u, events
->size());
450 EXPECT_EQ(AnimationEvent::Finished
, (*events
)[0].type
);
451 EXPECT_TRUE((*events
)[0].is_impl_only
);
452 EXPECT_EQ(AnimationEvent::PropertyUpdate
, (*events
)[1].type
);
453 EXPECT_TRUE((*events
)[1].is_impl_only
);
455 // Passing on the finished event to the main thread controller should cause
456 // the delegate to get notified.
457 EXPECT_FALSE(delegate
.finished());
458 controller
->NotifyAnimationFinished((*events
)[0], 0.0);
459 EXPECT_TRUE(delegate
.finished());
462 // Tests animations that are waiting for a synchronized start time do not
464 TEST(LayerAnimationControllerTest
,
465 AnimationsWaitingForStartTimeDoNotFinishIfTheyOutwaitTheirFinish
) {
466 scoped_ptr
<AnimationEventsVector
> events(
467 make_scoped_ptr(new AnimationEventsVector
));
468 FakeLayerAnimationValueObserver dummy
;
469 scoped_refptr
<LayerAnimationController
> controller(
470 LayerAnimationController::Create(0));
471 controller
->AddValueObserver(&dummy
);
473 scoped_ptr
<Animation
> to_add(CreateAnimation(
474 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
476 Animation::Opacity
));
477 to_add
->set_needs_synchronized_start_time(true);
479 // We should pause at the first keyframe indefinitely waiting for that
480 // animation to start.
481 controller
->AddAnimation(to_add
.Pass());
482 controller
->Animate(0.0);
483 controller
->UpdateState(true, events
.get());
484 EXPECT_TRUE(controller
->HasActiveAnimation());
485 EXPECT_EQ(0.f
, dummy
.opacity());
486 controller
->Animate(1.0);
487 controller
->UpdateState(true, events
.get());
488 EXPECT_TRUE(controller
->HasActiveAnimation());
489 EXPECT_EQ(0.f
, dummy
.opacity());
490 controller
->Animate(2.0);
491 controller
->UpdateState(true, events
.get());
492 EXPECT_TRUE(controller
->HasActiveAnimation());
493 EXPECT_EQ(0.f
, dummy
.opacity());
495 // Send the synchronized start time.
496 controller
->NotifyAnimationStarted(
497 AnimationEvent(AnimationEvent::Started
, 0, 1, Animation::Opacity
, 2),
499 controller
->Animate(5.0);
500 controller
->UpdateState(true, events
.get());
501 EXPECT_EQ(1.f
, dummy
.opacity());
502 EXPECT_FALSE(controller
->HasActiveAnimation());
505 // Tests that two queued animations affecting the same property run in sequence.
506 TEST(LayerAnimationControllerTest
, TrivialQueuing
) {
507 scoped_ptr
<AnimationEventsVector
> events(
508 make_scoped_ptr(new AnimationEventsVector
));
509 FakeLayerAnimationValueObserver dummy
;
510 scoped_refptr
<LayerAnimationController
> controller(
511 LayerAnimationController::Create(0));
512 controller
->AddValueObserver(&dummy
);
514 controller
->AddAnimation(CreateAnimation(
515 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
517 Animation::Opacity
));
518 controller
->AddAnimation(CreateAnimation(
519 scoped_ptr
<AnimationCurve
>(
520 new FakeFloatTransition(1.0, 1.f
, 0.5f
)).Pass(),
522 Animation::Opacity
));
524 controller
->Animate(0.0);
525 controller
->UpdateState(true, events
.get());
526 EXPECT_TRUE(controller
->HasActiveAnimation());
527 EXPECT_EQ(0.f
, dummy
.opacity());
528 controller
->Animate(1.0);
529 controller
->UpdateState(true, events
.get());
530 EXPECT_TRUE(controller
->HasActiveAnimation());
531 EXPECT_EQ(1.f
, dummy
.opacity());
532 controller
->Animate(2.0);
533 controller
->UpdateState(true, events
.get());
534 EXPECT_EQ(0.5f
, dummy
.opacity());
535 EXPECT_FALSE(controller
->HasActiveAnimation());
538 // Tests interrupting a transition with another transition.
539 TEST(LayerAnimationControllerTest
, Interrupt
) {
540 scoped_ptr
<AnimationEventsVector
> events(
541 make_scoped_ptr(new AnimationEventsVector
));
542 FakeLayerAnimationValueObserver dummy
;
543 scoped_refptr
<LayerAnimationController
> controller(
544 LayerAnimationController::Create(0));
545 controller
->AddValueObserver(&dummy
);
546 controller
->AddAnimation(CreateAnimation(
547 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
549 Animation::Opacity
));
550 controller
->Animate(0.0);
551 controller
->UpdateState(true, events
.get());
552 EXPECT_TRUE(controller
->HasActiveAnimation());
553 EXPECT_EQ(0.f
, dummy
.opacity());
555 scoped_ptr
<Animation
> to_add(CreateAnimation(
556 scoped_ptr
<AnimationCurve
>(
557 new FakeFloatTransition(1.0, 1.f
, 0.5f
)).Pass(),
559 Animation::Opacity
));
560 to_add
->SetRunState(Animation::WaitingForNextTick
, 0);
561 controller
->AddAnimation(to_add
.Pass());
563 // Since the animation was in the WaitingForNextTick state, it should start
564 // right in this call to animate.
565 controller
->Animate(0.5);
566 controller
->UpdateState(true, events
.get());
567 EXPECT_TRUE(controller
->HasActiveAnimation());
568 EXPECT_EQ(1.f
, dummy
.opacity());
569 controller
->Animate(1.5);
570 controller
->UpdateState(true, events
.get());
571 EXPECT_EQ(0.5f
, dummy
.opacity());
572 EXPECT_FALSE(controller
->HasActiveAnimation());
575 // Tests scheduling two animations to run together when only one property is
577 TEST(LayerAnimationControllerTest
, ScheduleTogetherWhenAPropertyIsBlocked
) {
578 scoped_ptr
<AnimationEventsVector
> events(
579 make_scoped_ptr(new AnimationEventsVector
));
580 FakeLayerAnimationValueObserver dummy
;
581 scoped_refptr
<LayerAnimationController
> controller(
582 LayerAnimationController::Create(0));
583 controller
->AddValueObserver(&dummy
);
585 controller
->AddAnimation(CreateAnimation(
586 scoped_ptr
<AnimationCurve
>(new FakeTransformTransition(1)).Pass(),
588 Animation::Transform
));
589 controller
->AddAnimation(CreateAnimation(
590 scoped_ptr
<AnimationCurve
>(new FakeTransformTransition(1)).Pass(),
592 Animation::Transform
));
593 controller
->AddAnimation(CreateAnimation(
594 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
596 Animation::Opacity
));
598 controller
->Animate(0.0);
599 controller
->UpdateState(true, events
.get());
600 EXPECT_EQ(0.f
, dummy
.opacity());
601 EXPECT_TRUE(controller
->HasActiveAnimation());
602 controller
->Animate(1.0);
603 controller
->UpdateState(true, events
.get());
604 // Should not have started the float transition yet.
605 EXPECT_TRUE(controller
->HasActiveAnimation());
606 EXPECT_EQ(0.f
, dummy
.opacity());
607 // The float animation should have started at time 1 and should be done.
608 controller
->Animate(2.0);
609 controller
->UpdateState(true, events
.get());
610 EXPECT_EQ(1.f
, dummy
.opacity());
611 EXPECT_FALSE(controller
->HasActiveAnimation());
614 // Tests scheduling two animations to run together with different lengths and
615 // another animation queued to start when the shorter animation finishes (should
616 // wait for both to finish).
617 TEST(LayerAnimationControllerTest
, ScheduleTogetherWithAnAnimWaiting
) {
618 scoped_ptr
<AnimationEventsVector
> events(
619 make_scoped_ptr(new AnimationEventsVector
));
620 FakeLayerAnimationValueObserver dummy
;
621 scoped_refptr
<LayerAnimationController
> controller(
622 LayerAnimationController::Create(0));
623 controller
->AddValueObserver(&dummy
);
625 controller
->AddAnimation(CreateAnimation(
626 scoped_ptr
<AnimationCurve
>(new FakeTransformTransition(2)).Pass(),
628 Animation::Transform
));
629 controller
->AddAnimation(CreateAnimation(
630 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
632 Animation::Opacity
));
633 controller
->AddAnimation(CreateAnimation(
634 scoped_ptr
<AnimationCurve
>(
635 new FakeFloatTransition(1.0, 1.f
, 0.5f
)).Pass(),
637 Animation::Opacity
));
639 // Animations with id 1 should both start now.
640 controller
->Animate(0.0);
641 controller
->UpdateState(true, events
.get());
642 EXPECT_TRUE(controller
->HasActiveAnimation());
643 EXPECT_EQ(0.f
, dummy
.opacity());
644 // The opacity animation should have finished at time 1, but the group
645 // of animations with id 1 don't finish until time 2 because of the length
646 // of the transform animation.
647 controller
->Animate(2.0);
648 controller
->UpdateState(true, events
.get());
649 // Should not have started the float transition yet.
650 EXPECT_TRUE(controller
->HasActiveAnimation());
651 EXPECT_EQ(1.f
, dummy
.opacity());
653 // The second opacity animation should start at time 2 and should be done by
655 controller
->Animate(3.0);
656 controller
->UpdateState(true, events
.get());
657 EXPECT_EQ(0.5f
, dummy
.opacity());
658 EXPECT_FALSE(controller
->HasActiveAnimation());
661 // Tests scheduling an animation to start in the future.
662 TEST(LayerAnimationControllerTest
, ScheduleAnimation
) {
663 scoped_ptr
<AnimationEventsVector
> events(
664 make_scoped_ptr(new AnimationEventsVector
));
665 FakeLayerAnimationValueObserver dummy
;
666 scoped_refptr
<LayerAnimationController
> controller(
667 LayerAnimationController::Create(0));
668 controller
->AddValueObserver(&dummy
);
670 scoped_ptr
<Animation
> to_add(CreateAnimation(
671 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
673 Animation::Opacity
));
674 to_add
->SetRunState(Animation::WaitingForStartTime
, 0);
675 to_add
->set_start_time(1.f
);
676 controller
->AddAnimation(to_add
.Pass());
678 controller
->Animate(0.0);
679 controller
->UpdateState(true, events
.get());
680 EXPECT_TRUE(controller
->HasActiveAnimation());
681 EXPECT_EQ(0.f
, dummy
.opacity());
682 controller
->Animate(1.0);
683 controller
->UpdateState(true, events
.get());
684 EXPECT_TRUE(controller
->HasActiveAnimation());
685 EXPECT_EQ(0.f
, dummy
.opacity());
686 controller
->Animate(2.0);
687 controller
->UpdateState(true, events
.get());
688 EXPECT_EQ(1.f
, dummy
.opacity());
689 EXPECT_FALSE(controller
->HasActiveAnimation());
692 // Tests scheduling an animation to start in the future that's interrupting a
693 // running animation.
694 TEST(LayerAnimationControllerTest
,
695 ScheduledAnimationInterruptsRunningAnimation
) {
696 scoped_ptr
<AnimationEventsVector
> events(
697 make_scoped_ptr(new AnimationEventsVector
));
698 FakeLayerAnimationValueObserver dummy
;
699 scoped_refptr
<LayerAnimationController
> controller(
700 LayerAnimationController::Create(0));
701 controller
->AddValueObserver(&dummy
);
703 controller
->AddAnimation(CreateAnimation(
704 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(2.0, 0.f
, 1.f
)).Pass(),
706 Animation::Opacity
));
708 scoped_ptr
<Animation
> to_add(CreateAnimation(
709 scoped_ptr
<AnimationCurve
>(
710 new FakeFloatTransition(1.0, 0.5f
, 0.f
)).Pass(),
712 Animation::Opacity
));
713 to_add
->SetRunState(Animation::WaitingForStartTime
, 0);
714 to_add
->set_start_time(1.f
);
715 controller
->AddAnimation(to_add
.Pass());
717 // First 2s opacity transition should start immediately.
718 controller
->Animate(0.0);
719 controller
->UpdateState(true, events
.get());
720 EXPECT_TRUE(controller
->HasActiveAnimation());
721 EXPECT_EQ(0.f
, dummy
.opacity());
722 controller
->Animate(0.5);
723 controller
->UpdateState(true, events
.get());
724 EXPECT_TRUE(controller
->HasActiveAnimation());
725 EXPECT_EQ(0.25f
, dummy
.opacity());
726 controller
->Animate(1.0);
727 controller
->UpdateState(true, events
.get());
728 EXPECT_TRUE(controller
->HasActiveAnimation());
729 EXPECT_EQ(0.5f
, dummy
.opacity());
730 controller
->Animate(2.0);
731 controller
->UpdateState(true, events
.get());
732 EXPECT_EQ(0.f
, dummy
.opacity());
733 EXPECT_FALSE(controller
->HasActiveAnimation());
736 // Tests scheduling an animation to start in the future that interrupts a
737 // running animation and there is yet another animation queued to start later.
738 TEST(LayerAnimationControllerTest
,
739 ScheduledAnimationInterruptsRunningAnimationWithAnimInQueue
) {
740 scoped_ptr
<AnimationEventsVector
> events(
741 make_scoped_ptr(new AnimationEventsVector
));
742 FakeLayerAnimationValueObserver dummy
;
743 scoped_refptr
<LayerAnimationController
> controller(
744 LayerAnimationController::Create(0));
745 controller
->AddValueObserver(&dummy
);
747 controller
->AddAnimation(CreateAnimation(
748 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(2.0, 0.f
, 1.f
)).Pass(),
750 Animation::Opacity
));
752 scoped_ptr
<Animation
> to_add(CreateAnimation(
753 scoped_ptr
<AnimationCurve
>(
754 new FakeFloatTransition(2.0, 0.5f
, 0.f
)).Pass(),
756 Animation::Opacity
));
757 to_add
->SetRunState(Animation::WaitingForStartTime
, 0);
758 to_add
->set_start_time(1.f
);
759 controller
->AddAnimation(to_add
.Pass());
761 controller
->AddAnimation(CreateAnimation(
762 scoped_ptr
<AnimationCurve
>(
763 new FakeFloatTransition(1.0, 0.f
, 0.75f
)).Pass(),
765 Animation::Opacity
));
767 // First 2s opacity transition should start immediately.
768 controller
->Animate(0.0);
769 controller
->UpdateState(true, events
.get());
770 EXPECT_TRUE(controller
->HasActiveAnimation());
771 EXPECT_EQ(0.f
, dummy
.opacity());
772 controller
->Animate(0.5);
773 controller
->UpdateState(true, events
.get());
774 EXPECT_TRUE(controller
->HasActiveAnimation());
775 EXPECT_EQ(0.25f
, dummy
.opacity());
776 EXPECT_TRUE(controller
->HasActiveAnimation());
777 controller
->Animate(1.0);
778 controller
->UpdateState(true, events
.get());
779 EXPECT_TRUE(controller
->HasActiveAnimation());
780 EXPECT_EQ(0.5f
, dummy
.opacity());
781 controller
->Animate(3.0);
782 controller
->UpdateState(true, events
.get());
783 EXPECT_TRUE(controller
->HasActiveAnimation());
784 EXPECT_EQ(0.f
, dummy
.opacity());
785 controller
->Animate(4.0);
786 controller
->UpdateState(true, events
.get());
787 EXPECT_EQ(0.75f
, dummy
.opacity());
788 EXPECT_FALSE(controller
->HasActiveAnimation());
791 // Test that a looping animation loops and for the correct number of iterations.
792 TEST(LayerAnimationControllerTest
, TrivialLooping
) {
793 scoped_ptr
<AnimationEventsVector
> events(
794 make_scoped_ptr(new AnimationEventsVector
));
795 FakeLayerAnimationValueObserver dummy
;
796 scoped_refptr
<LayerAnimationController
> controller(
797 LayerAnimationController::Create(0));
798 controller
->AddValueObserver(&dummy
);
800 scoped_ptr
<Animation
> to_add(CreateAnimation(
801 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
803 Animation::Opacity
));
804 to_add
->set_iterations(3);
805 controller
->AddAnimation(to_add
.Pass());
807 controller
->Animate(0.0);
808 controller
->UpdateState(true, events
.get());
809 EXPECT_TRUE(controller
->HasActiveAnimation());
810 EXPECT_EQ(0.f
, dummy
.opacity());
811 controller
->Animate(1.25);
812 controller
->UpdateState(true, events
.get());
813 EXPECT_TRUE(controller
->HasActiveAnimation());
814 EXPECT_EQ(0.25f
, dummy
.opacity());
815 controller
->Animate(1.75);
816 controller
->UpdateState(true, events
.get());
817 EXPECT_TRUE(controller
->HasActiveAnimation());
818 EXPECT_EQ(0.75f
, dummy
.opacity());
819 controller
->Animate(2.25);
820 controller
->UpdateState(true, events
.get());
821 EXPECT_TRUE(controller
->HasActiveAnimation());
822 EXPECT_EQ(0.25f
, dummy
.opacity());
823 controller
->Animate(2.75);
824 controller
->UpdateState(true, events
.get());
825 EXPECT_TRUE(controller
->HasActiveAnimation());
826 EXPECT_EQ(0.75f
, dummy
.opacity());
827 controller
->Animate(3.0);
828 controller
->UpdateState(true, events
.get());
829 EXPECT_FALSE(controller
->HasActiveAnimation());
830 EXPECT_EQ(1.f
, dummy
.opacity());
832 // Just be extra sure.
833 controller
->Animate(4.0);
834 controller
->UpdateState(true, events
.get());
835 EXPECT_EQ(1.f
, dummy
.opacity());
838 // Test that an infinitely looping animation does indeed go until aborted.
839 TEST(LayerAnimationControllerTest
, InfiniteLooping
) {
840 scoped_ptr
<AnimationEventsVector
> events(
841 make_scoped_ptr(new AnimationEventsVector
));
842 FakeLayerAnimationValueObserver dummy
;
843 scoped_refptr
<LayerAnimationController
> controller(
844 LayerAnimationController::Create(0));
845 controller
->AddValueObserver(&dummy
);
848 scoped_ptr
<Animation
> to_add(CreateAnimation(
849 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
851 Animation::Opacity
));
852 to_add
->set_iterations(-1);
853 controller
->AddAnimation(to_add
.Pass());
855 controller
->Animate(0.0);
856 controller
->UpdateState(true, events
.get());
857 EXPECT_TRUE(controller
->HasActiveAnimation());
858 EXPECT_EQ(0.f
, dummy
.opacity());
859 controller
->Animate(1.25);
860 controller
->UpdateState(true, events
.get());
861 EXPECT_TRUE(controller
->HasActiveAnimation());
862 EXPECT_EQ(0.25f
, dummy
.opacity());
863 controller
->Animate(1.75);
864 controller
->UpdateState(true, events
.get());
865 EXPECT_TRUE(controller
->HasActiveAnimation());
866 EXPECT_EQ(0.75f
, dummy
.opacity());
868 controller
->Animate(1073741824.25);
869 controller
->UpdateState(true, events
.get());
870 EXPECT_TRUE(controller
->HasActiveAnimation());
871 EXPECT_EQ(0.25f
, dummy
.opacity());
872 controller
->Animate(1073741824.75);
873 controller
->UpdateState(true, events
.get());
874 EXPECT_TRUE(controller
->HasActiveAnimation());
875 EXPECT_EQ(0.75f
, dummy
.opacity());
877 EXPECT_TRUE(controller
->GetAnimation(id
, Animation::Opacity
));
878 controller
->GetAnimation(id
, Animation::Opacity
)->SetRunState(
879 Animation::Aborted
, 0.75);
880 EXPECT_FALSE(controller
->HasActiveAnimation());
881 EXPECT_EQ(0.75f
, dummy
.opacity());
884 // Test that pausing and resuming work as expected.
885 TEST(LayerAnimationControllerTest
, PauseResume
) {
886 scoped_ptr
<AnimationEventsVector
> events(
887 make_scoped_ptr(new AnimationEventsVector
));
888 FakeLayerAnimationValueObserver dummy
;
889 scoped_refptr
<LayerAnimationController
> controller(
890 LayerAnimationController::Create(0));
891 controller
->AddValueObserver(&dummy
);
894 controller
->AddAnimation(CreateAnimation(
895 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
897 Animation::Opacity
));
899 controller
->Animate(0.0);
900 controller
->UpdateState(true, events
.get());
901 EXPECT_TRUE(controller
->HasActiveAnimation());
902 EXPECT_EQ(0.f
, dummy
.opacity());
903 controller
->Animate(0.5);
904 controller
->UpdateState(true, events
.get());
905 EXPECT_TRUE(controller
->HasActiveAnimation());
906 EXPECT_EQ(0.5f
, dummy
.opacity());
908 EXPECT_TRUE(controller
->GetAnimation(id
, Animation::Opacity
));
909 controller
->GetAnimation(id
, Animation::Opacity
)->SetRunState(
910 Animation::Paused
, 0.5);
912 controller
->Animate(1024);
913 controller
->UpdateState(true, events
.get());
914 EXPECT_TRUE(controller
->HasActiveAnimation());
915 EXPECT_EQ(0.5f
, dummy
.opacity());
917 EXPECT_TRUE(controller
->GetAnimation(id
, Animation::Opacity
));
918 controller
->GetAnimation(id
, Animation::Opacity
)->SetRunState(
919 Animation::Running
, 1024);
921 controller
->Animate(1024.25);
922 controller
->UpdateState(true, events
.get());
923 EXPECT_TRUE(controller
->HasActiveAnimation());
924 EXPECT_EQ(0.75f
, dummy
.opacity());
925 controller
->Animate(1024.5);
926 controller
->UpdateState(true, events
.get());
927 EXPECT_FALSE(controller
->HasActiveAnimation());
928 EXPECT_EQ(1.f
, dummy
.opacity());
931 TEST(LayerAnimationControllerTest
, AbortAGroupedAnimation
) {
932 scoped_ptr
<AnimationEventsVector
> events(
933 make_scoped_ptr(new AnimationEventsVector
));
934 FakeLayerAnimationValueObserver dummy
;
935 scoped_refptr
<LayerAnimationController
> controller(
936 LayerAnimationController::Create(0));
937 controller
->AddValueObserver(&dummy
);
940 controller
->AddAnimation(CreateAnimation(
941 scoped_ptr
<AnimationCurve
>(new FakeTransformTransition(1)).Pass(),
943 Animation::Transform
));
944 controller
->AddAnimation(CreateAnimation(
945 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(2.0, 0.f
, 1.f
)).Pass(),
947 Animation::Opacity
));
948 controller
->AddAnimation(CreateAnimation(
949 scoped_ptr
<AnimationCurve
>(
950 new FakeFloatTransition(1.0, 1.f
, 0.75f
)).Pass(),
952 Animation::Opacity
));
954 controller
->Animate(0.0);
955 controller
->UpdateState(true, events
.get());
956 EXPECT_TRUE(controller
->HasActiveAnimation());
957 EXPECT_EQ(0.f
, dummy
.opacity());
958 controller
->Animate(1.0);
959 controller
->UpdateState(true, events
.get());
960 EXPECT_TRUE(controller
->HasActiveAnimation());
961 EXPECT_EQ(0.5f
, dummy
.opacity());
963 EXPECT_TRUE(controller
->GetAnimation(id
, Animation::Opacity
));
964 controller
->GetAnimation(id
, Animation::Opacity
)->SetRunState(
965 Animation::Aborted
, 1);
966 controller
->Animate(1.0);
967 controller
->UpdateState(true, events
.get());
968 EXPECT_TRUE(controller
->HasActiveAnimation());
969 EXPECT_EQ(1.f
, dummy
.opacity());
970 controller
->Animate(2.0);
971 controller
->UpdateState(true, events
.get());
972 EXPECT_TRUE(!controller
->HasActiveAnimation());
973 EXPECT_EQ(0.75f
, dummy
.opacity());
976 TEST(LayerAnimationControllerTest
, ForceSyncWhenSynchronizedStartTimeNeeded
) {
977 FakeLayerAnimationValueObserver dummy_impl
;
978 scoped_refptr
<LayerAnimationController
> controller_impl(
979 LayerAnimationController::Create(0));
980 controller_impl
->AddValueObserver(&dummy_impl
);
981 scoped_ptr
<AnimationEventsVector
> events(
982 make_scoped_ptr(new AnimationEventsVector
));
983 FakeLayerAnimationValueObserver dummy
;
984 scoped_refptr
<LayerAnimationController
> controller(
985 LayerAnimationController::Create(0));
986 controller
->AddValueObserver(&dummy
);
988 scoped_ptr
<Animation
> to_add(CreateAnimation(
989 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(2.0, 0.f
, 1.f
)).Pass(),
991 Animation::Opacity
));
992 to_add
->set_needs_synchronized_start_time(true);
993 controller
->AddAnimation(to_add
.Pass());
995 controller
->Animate(0.0);
996 controller
->UpdateState(true, events
.get());
997 EXPECT_TRUE(controller
->HasActiveAnimation());
998 Animation
* active_animation
= controller
->GetAnimation(0, Animation::Opacity
);
999 EXPECT_TRUE(active_animation
);
1000 EXPECT_TRUE(active_animation
->needs_synchronized_start_time());
1002 controller
->set_force_sync();
1004 controller
->PushAnimationUpdatesTo(controller_impl
.get());
1006 active_animation
= controller_impl
->GetAnimation(0, Animation::Opacity
);
1007 EXPECT_TRUE(active_animation
);
1008 EXPECT_EQ(Animation::WaitingForTargetAvailability
,
1009 active_animation
->run_state());
1012 // Tests that skipping a call to UpdateState works as expected.
1013 TEST(LayerAnimationControllerTest
, SkipUpdateState
) {
1014 scoped_ptr
<AnimationEventsVector
> events(
1015 make_scoped_ptr(new AnimationEventsVector
));
1016 FakeLayerAnimationValueObserver dummy
;
1017 scoped_refptr
<LayerAnimationController
> controller(
1018 LayerAnimationController::Create(0));
1019 controller
->AddValueObserver(&dummy
);
1021 controller
->AddAnimation(CreateAnimation(
1022 scoped_ptr
<AnimationCurve
>(new FakeTransformTransition(1)).Pass(),
1024 Animation::Transform
));
1026 controller
->Animate(0.0);
1027 controller
->UpdateState(true, events
.get());
1029 controller
->AddAnimation(CreateAnimation(
1030 scoped_ptr
<AnimationCurve
>(new FakeFloatTransition(1.0, 0.f
, 1.f
)).Pass(),
1032 Animation::Opacity
));
1034 // Animate but don't UpdateState.
1035 controller
->Animate(1.0);
1037 controller
->Animate(2.0);
1038 events
.reset(new AnimationEventsVector
);
1039 controller
->UpdateState(true, events
.get());
1041 // Should have one Started event and one Finished event.
1042 EXPECT_EQ(2u, events
->size());
1043 EXPECT_NE((*events
)[0].type
, (*events
)[1].type
);
1045 // The float transition should still be at its starting point.
1046 EXPECT_TRUE(controller
->HasActiveAnimation());
1047 EXPECT_EQ(0.f
, dummy
.opacity());
1049 controller
->Animate(3.0);
1050 controller
->UpdateState(true, events
.get());
1052 // The float tranisition should now be done.
1053 EXPECT_EQ(1.f
, dummy
.opacity());
1054 EXPECT_FALSE(controller
->HasActiveAnimation());
1057 // Tests that an animation controller with only an inactive observer gets ticked
1058 // but doesn't progress animations past the Starting state.
1059 TEST(LayerAnimationControllerTest
, InactiveObserverGetsTicked
) {
1060 scoped_ptr
<AnimationEventsVector
> events(
1061 make_scoped_ptr(new AnimationEventsVector
));
1062 FakeLayerAnimationValueObserver dummy
;
1063 FakeInactiveLayerAnimationValueObserver inactive_dummy
;
1064 scoped_refptr
<LayerAnimationController
> controller(
1065 LayerAnimationController::Create(0));
1068 controller
->AddAnimation(CreateAnimation(scoped_ptr
<AnimationCurve
>(
1069 new FakeFloatTransition(1.0, 0.5f
, 1.f
)).Pass(),
1071 Animation::Opacity
));
1073 // Without an observer, the animation shouldn't progress to the Starting
1075 controller
->Animate(0.0);
1076 controller
->UpdateState(true, events
.get());
1077 EXPECT_EQ(0u, events
->size());
1078 EXPECT_EQ(Animation::WaitingForTargetAvailability
,
1079 controller
->GetAnimation(id
, Animation::Opacity
)->run_state());
1081 controller
->AddValueObserver(&inactive_dummy
);
1083 // With only an inactive observer, the animation should progress to the
1084 // Starting state and get ticked at its starting point, but should not
1085 // progress to Running.
1086 controller
->Animate(1.0);
1087 controller
->UpdateState(true, events
.get());
1088 EXPECT_EQ(0u, events
->size());
1089 EXPECT_EQ(Animation::Starting
,
1090 controller
->GetAnimation(id
, Animation::Opacity
)->run_state());
1091 EXPECT_EQ(0.5f
, inactive_dummy
.opacity());
1093 // Even when already in the Starting state, the animation should stay
1094 // there, and shouldn't be ticked past its starting point.
1095 controller
->Animate(2.0);
1096 controller
->UpdateState(true, events
.get());
1097 EXPECT_EQ(0u, events
->size());
1098 EXPECT_EQ(Animation::Starting
,
1099 controller
->GetAnimation(id
, Animation::Opacity
)->run_state());
1100 EXPECT_EQ(0.5f
, inactive_dummy
.opacity());
1102 controller
->AddValueObserver(&dummy
);
1104 // Now that an active observer has been added, the animation should still
1105 // initially tick at its starting point, but should now progress to Running.
1106 controller
->Animate(3.0);
1107 controller
->UpdateState(true, events
.get());
1108 EXPECT_EQ(1u, events
->size());
1109 EXPECT_EQ(Animation::Running
,
1110 controller
->GetAnimation(id
, Animation::Opacity
)->run_state());
1111 EXPECT_EQ(0.5f
, inactive_dummy
.opacity());
1112 EXPECT_EQ(0.5f
, dummy
.opacity());
1114 // The animation should now tick past its starting point.
1115 controller
->Animate(3.5);
1116 EXPECT_NE(0.5f
, inactive_dummy
.opacity());
1117 EXPECT_NE(0.5f
, dummy
.opacity());