Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3250)

Unified Diff: cc/animation/animation_player_unittest.cc

Issue 947033002: CC Animations: Establish AnimationHost, AnimationTimeline and AnimationPlayer (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix MSVC warning. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/animation/animation_player.cc ('k') | cc/animation/animation_timeline.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/animation/animation_player_unittest.cc
diff --git a/cc/animation/animation_player_unittest.cc b/cc/animation/animation_player_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..466964f6d7741bf898e8133b07254e6a1373d495
--- /dev/null
+++ b/cc/animation/animation_player_unittest.cc
@@ -0,0 +1,336 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/animation/animation_player.h"
+
+#include "cc/animation/animation_delegate.h"
+#include "cc/animation/animation_host.h"
+#include "cc/animation/animation_id_provider.h"
+#include "cc/animation/animation_registrar.h"
+#include "cc/animation/animation_timeline.h"
+#include "cc/animation/element_animations.h"
+#include "cc/test/animation_test_common.h"
+#include "cc/test/animation_timelines_test_common.h"
+
+namespace cc {
+namespace {
+
+class AnimationPlayerTest : public AnimationTimelinesTest {
+ public:
+ AnimationPlayerTest() {}
+ ~AnimationPlayerTest() override {}
+};
+
+// See element_animations_unittest.cc for active/pending observers tests.
+
+TEST_F(AnimationPlayerTest, AttachDetachLayerIfTimelineAttached) {
+ host_->AddAnimationTimeline(timeline_);
+ timeline_->AttachPlayer(player_);
+ EXPECT_FALSE(player_->element_animations());
+ EXPECT_FALSE(player_->layer_id());
+
+ host_->PushPropertiesTo(host_impl_);
+
+ EXPECT_FALSE(GetImplPlayerForLayerId(layer_id_));
+
+ GetImplTimelineAndPlayerByID();
+
+ EXPECT_FALSE(player_impl_->element_animations());
+ EXPECT_FALSE(player_impl_->layer_id());
+
+ player_->AttachLayer(layer_id_);
+ EXPECT_EQ(player_, GetPlayerForLayerId(layer_id_));
+ EXPECT_TRUE(player_->element_animations());
+ EXPECT_EQ(player_->layer_id(), layer_id_);
+
+ host_->PushPropertiesTo(host_impl_);
+
+ EXPECT_EQ(player_impl_, GetImplPlayerForLayerId(layer_id_));
+ EXPECT_TRUE(player_impl_->element_animations());
+ EXPECT_EQ(player_impl_->layer_id(), layer_id_);
+
+ player_->DetachLayer();
+ EXPECT_FALSE(GetPlayerForLayerId(layer_id_));
+ EXPECT_FALSE(player_->element_animations());
+ EXPECT_FALSE(player_->layer_id());
+
+ host_->PushPropertiesTo(host_impl_);
+
+ EXPECT_FALSE(GetImplPlayerForLayerId(layer_id_));
+ EXPECT_FALSE(player_impl_->element_animations());
+ EXPECT_FALSE(player_impl_->layer_id());
+
+ timeline_->DetachPlayer(player_);
+ EXPECT_FALSE(player_->animation_timeline());
+ EXPECT_FALSE(player_->element_animations());
+ EXPECT_FALSE(player_->layer_id());
+}
+
+TEST_F(AnimationPlayerTest, AttachDetachTimelineIfLayerAttached) {
+ host_->AddAnimationTimeline(timeline_);
+
+ EXPECT_FALSE(player_->element_animations());
+ EXPECT_FALSE(player_->layer_id());
+
+ player_->AttachLayer(layer_id_);
+ EXPECT_FALSE(player_->animation_timeline());
+ EXPECT_FALSE(GetPlayerForLayerId(layer_id_));
+ EXPECT_FALSE(player_->element_animations());
+ EXPECT_EQ(player_->layer_id(), layer_id_);
+
+ timeline_->AttachPlayer(player_);
+ EXPECT_EQ(timeline_, player_->animation_timeline());
+ EXPECT_EQ(player_, GetPlayerForLayerId(layer_id_));
+ EXPECT_TRUE(player_->element_animations());
+ EXPECT_EQ(player_->layer_id(), layer_id_);
+
+ // Removing player from timeline detaches layer.
+ timeline_->DetachPlayer(player_);
+ EXPECT_FALSE(player_->animation_timeline());
+ EXPECT_FALSE(GetPlayerForLayerId(layer_id_));
+ EXPECT_FALSE(player_->element_animations());
+ EXPECT_FALSE(player_->layer_id());
+}
+
+TEST_F(AnimationPlayerTest, PropertiesMutate) {
+ client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING);
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
+
+ host_->AddAnimationTimeline(timeline_);
+ timeline_->AttachPlayer(player_);
+ player_->AttachLayer(layer_id_);
+
+ const float start_opacity = .7f;
+ const float end_opacity = .3f;
+
+ const float start_brightness = .6f;
+ const float end_brightness = .4f;
+
+ const int transform_x = 10;
+ const int transform_y = 20;
+
+ const double duration = 1.;
+
+ AddOpacityTransitionToPlayer(player_.get(), duration, start_opacity,
+ end_opacity, false);
+ AddAnimatedTransformToPlayer(player_.get(), duration, transform_x,
+ transform_y);
+ AddAnimatedFilterToPlayer(player_.get(), duration, start_brightness,
+ end_brightness);
+
+ host_->PushPropertiesTo(host_impl_);
+
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::OPACITY));
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::TRANSFORM));
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::FILTER));
+
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::OPACITY));
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::TRANSFORM));
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::FILTER));
+
+ host_impl_->animation_registrar()->ActivateAnimations();
+
+ base::TimeTicks time;
+ time += base::TimeDelta::FromSecondsD(0.1);
+ AnimateLayersTransferEvents(time, 3u);
+
+ time += base::TimeDelta::FromSecondsD(duration);
+ AnimateLayersTransferEvents(time, 3u);
+
+ client_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ end_opacity);
+ client_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ transform_x, transform_y);
+ client_.ExpectFilterPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ end_brightness);
+
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ end_opacity);
+ client_impl_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ transform_x, transform_y);
+ client_impl_.ExpectFilterPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ end_brightness);
+
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::PENDING,
+ end_opacity);
+ client_impl_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::PENDING,
+ transform_x, transform_y);
+ client_impl_.ExpectFilterPropertyMutated(layer_id_, LayerTreeType::PENDING,
+ end_brightness);
+}
+
+TEST_F(AnimationPlayerTest, AttachTwoPlayersToOneLayer) {
+ TestAnimationDelegate delegate1;
+ TestAnimationDelegate delegate2;
+
+ client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING);
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
+
+ scoped_refptr<AnimationPlayer> player1 =
+ AnimationPlayer::Create(AnimationIdProvider::NextPlayerId());
+ scoped_refptr<AnimationPlayer> player2 =
+ AnimationPlayer::Create(AnimationIdProvider::NextPlayerId());
+
+ host_->AddAnimationTimeline(timeline_);
+ timeline_->AttachPlayer(player1);
+ timeline_->AttachPlayer(player2);
+
+ player1->set_layer_animation_delegate(&delegate1);
+ player2->set_layer_animation_delegate(&delegate2);
+
+ // Attach players to the same layer.
+ player1->AttachLayer(layer_id_);
+ player2->AttachLayer(layer_id_);
+
+ const float start_opacity = .7f;
+ const float end_opacity = .3f;
+
+ const int transform_x = 10;
+ const int transform_y = 20;
+
+ const double duration = 1.;
+
+ AddOpacityTransitionToPlayer(player1.get(), duration, start_opacity,
+ end_opacity, false);
+ AddAnimatedTransformToPlayer(player2.get(), duration, transform_x,
+ transform_y);
+
+ host_->PushPropertiesTo(host_impl_);
+ host_impl_->animation_registrar()->ActivateAnimations();
+
+ EXPECT_FALSE(delegate1.started_);
+ EXPECT_FALSE(delegate1.finished_);
+
+ EXPECT_FALSE(delegate2.started_);
+ EXPECT_FALSE(delegate2.finished_);
+
+ base::TimeTicks time;
+ time += base::TimeDelta::FromSecondsD(0.1);
+ AnimateLayersTransferEvents(time, 2u);
+
+ EXPECT_TRUE(delegate1.started_);
+ EXPECT_FALSE(delegate1.finished_);
+
+ EXPECT_TRUE(delegate2.started_);
+ EXPECT_FALSE(delegate2.finished_);
+
+ time += base::TimeDelta::FromSecondsD(duration);
+ AnimateLayersTransferEvents(time, 2u);
+
+ EXPECT_TRUE(delegate1.finished_);
+ EXPECT_TRUE(delegate2.finished_);
+
+ client_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ end_opacity);
+ client_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ transform_x, transform_y);
+
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ end_opacity);
+ client_impl_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ transform_x, transform_y);
+
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::PENDING,
+ end_opacity);
+ client_impl_.ExpectTransformPropertyMutated(layer_id_, LayerTreeType::PENDING,
+ transform_x, transform_y);
+}
+
+TEST_F(AnimationPlayerTest, AddRemoveAnimationToNonAttachedPlayer) {
+ client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::PENDING);
+ client_impl_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
+
+ const double duration = 1.;
+ const float start_opacity = .7f;
+ const float end_opacity = .3f;
+
+ const int filter_id =
+ AddAnimatedFilterToPlayer(player_.get(), duration, 0.1f, 0.9f);
+ const int opacity_id = AddOpacityTransitionToPlayer(
+ player_.get(), duration, start_opacity, end_opacity, false);
+
+ host_->AddAnimationTimeline(timeline_);
+ timeline_->AttachPlayer(player_);
+
+ EXPECT_FALSE(player_->element_animations());
+ player_->RemoveAnimation(filter_id);
+
+ player_->AttachLayer(layer_id_);
+
+ EXPECT_TRUE(player_->element_animations());
+ EXPECT_FALSE(player_->element_animations()
+ ->layer_animation_controller()
+ ->GetAnimationById(filter_id));
+ EXPECT_TRUE(player_->element_animations()
+ ->layer_animation_controller()
+ ->GetAnimationById(opacity_id));
+
+ host_->PushPropertiesTo(host_impl_);
+
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::OPACITY));
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::OPACITY));
+
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::FILTER));
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::FILTER));
+
+ host_impl_->animation_registrar()->ActivateAnimations();
+
+ base::TimeTicks time;
+ time += base::TimeDelta::FromSecondsD(0.1);
+ AnimateLayersTransferEvents(time, 1u);
+
+ time += base::TimeDelta::FromSecondsD(duration);
+ AnimateLayersTransferEvents(time, 1u);
+
+ client_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ end_opacity);
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ end_opacity);
+ client_impl_.ExpectOpacityPropertyMutated(layer_id_, LayerTreeType::PENDING,
+ end_opacity);
+
+ EXPECT_FALSE(client_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::FILTER));
+ EXPECT_FALSE(client_impl_.IsPropertyMutated(layer_id_, LayerTreeType::ACTIVE,
+ Animation::FILTER));
+}
+
+TEST_F(AnimationPlayerTest, AddRemoveAnimationCausesSetNeedsCommit) {
+ client_.RegisterLayer(layer_id_, LayerTreeType::ACTIVE);
+ host_->AddAnimationTimeline(timeline_);
+ timeline_->AttachPlayer(player_);
+ player_->AttachLayer(layer_id_);
+
+ EXPECT_FALSE(client_.mutators_need_commit());
+
+ const int animation_id =
+ AddOpacityTransitionToPlayer(player_.get(), 1., .7f, .3f, false);
+
+ EXPECT_TRUE(client_.mutators_need_commit());
+ client_.set_mutators_need_commit(false);
+
+ player_->PauseAnimation(animation_id, 1.);
+ EXPECT_TRUE(client_.mutators_need_commit());
+ client_.set_mutators_need_commit(false);
+
+ player_->RemoveAnimation(animation_id);
+ EXPECT_TRUE(client_.mutators_need_commit());
+ client_.set_mutators_need_commit(false);
+}
+
+} // namespace
+} // namespace cc
« no previous file with comments | « cc/animation/animation_player.cc ('k') | cc/animation/animation_timeline.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698