| Index: ui/gfx/compositor/layer_animation_sequence_unittest.cc
|
| diff --git a/ui/gfx/compositor/layer_animation_sequence_unittest.cc b/ui/gfx/compositor/layer_animation_sequence_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..3b283a3fe12bedb653ae2485202c7cb3f279924c
|
| --- /dev/null
|
| +++ b/ui/gfx/compositor/layer_animation_sequence_unittest.cc
|
| @@ -0,0 +1,158 @@
|
| +// Copyright (c) 2011 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 "ui/gfx/compositor/layer_animation_sequence.h"
|
| +
|
| +#include "base/basictypes.h"
|
| +#include "base/compiler_specific.h"
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/time.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +#include "ui/gfx/rect.h"
|
| +#include "ui/gfx/transform.h"
|
| +#include "ui/gfx/compositor/layer_animation_delegate.h"
|
| +#include "ui/gfx/compositor/layer_animation_element.h"
|
| +#include "ui/gfx/compositor/test_utils.h"
|
| +#include "ui/gfx/compositor/test_layer_animation_delegate.h"
|
| +
|
| +namespace ui {
|
| +
|
| +namespace {
|
| +
|
| +// Check that the sequence behaves sanely when it contains no elements.
|
| +TEST(LayerAnimationSequenceTest, NoElement) {
|
| + LayerAnimationSequence sequence;
|
| + EXPECT_EQ(sequence.duration(), base::TimeDelta());
|
| + EXPECT_TRUE(sequence.properties().size() == 0);
|
| + LayerAnimationElement::AnimatableProperties properties;
|
| + EXPECT_FALSE(sequence.HasCommonProperty(properties));
|
| +}
|
| +
|
| +// Check that the sequences progresses the delegate as expected when it contains
|
| +// a single element.
|
| +TEST(LayerAnimationSequenceTest, SingleElement) {
|
| + LayerAnimationSequence sequence;
|
| + TestLayerAnimationDelegate delegate;
|
| + float start = 0.0;
|
| + float middle = 0.5;
|
| + float target = 1.0;
|
| + base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
|
| + sequence.AddElement(
|
| + LayerAnimationElement::CreateOpacityElement(target, delta));
|
| +
|
| + for (int i = 0; i < 2; ++i) {
|
| + delegate.SetOpacityFromAnimation(start);
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(0), &delegate);
|
| + EXPECT_FLOAT_EQ(start, delegate.GetOpacityForAnimation());
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(500), &delegate);
|
| + EXPECT_FLOAT_EQ(middle, delegate.GetOpacityForAnimation());
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(1000), &delegate);
|
| + EXPECT_FLOAT_EQ(target, delegate.GetOpacityForAnimation());
|
| + }
|
| +
|
| + EXPECT_TRUE(sequence.properties().size() == 1);
|
| + EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::OPACITY) !=
|
| + sequence.properties().end());
|
| + EXPECT_EQ(delta, sequence.duration());
|
| +}
|
| +
|
| +// Check that the sequences progresses the delegate as expected when it contains
|
| +// multiple elements. Note, see the layer animator tests for cyclic sequences.
|
| +TEST(LayerAnimationSequenceTest, MultipleElement) {
|
| + LayerAnimationSequence sequence;
|
| + TestLayerAnimationDelegate delegate;
|
| + float start_opacity = 0.0;
|
| + float middle_opacity = 0.5;
|
| + float target_opacity = 1.0;
|
| + base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
|
| + sequence.AddElement(
|
| + LayerAnimationElement::CreateOpacityElement(target_opacity, delta));
|
| +
|
| + // Pause bounds for a second.
|
| + LayerAnimationElement::AnimatableProperties properties;
|
| + properties.insert(LayerAnimationElement::BOUNDS);
|
| +
|
| + sequence.AddElement(
|
| + LayerAnimationElement::CreatePauseElement(properties, delta));
|
| +
|
| + Transform start_transform, target_transform, middle_transform;
|
| + start_transform.SetRotate(-90);
|
| + target_transform.SetRotate(90);
|
| +
|
| + sequence.AddElement(
|
| + LayerAnimationElement::CreateTransformElement(target_transform, delta));
|
| +
|
| + for (int i = 0; i < 2; ++i) {
|
| + delegate.SetOpacityFromAnimation(start_opacity);
|
| + delegate.SetTransformFromAnimation(start_transform);
|
| +
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(0), &delegate);
|
| + EXPECT_FLOAT_EQ(start_opacity, delegate.GetOpacityForAnimation());
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(500), &delegate);
|
| + EXPECT_FLOAT_EQ(middle_opacity, delegate.GetOpacityForAnimation());
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(1000), &delegate);
|
| + EXPECT_FLOAT_EQ(target_opacity, delegate.GetOpacityForAnimation());
|
| + TestLayerAnimationDelegate copy = delegate;
|
| +
|
| + // In the middle of the pause -- nothing should have changed.
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(1500), &delegate);
|
| + CheckApproximatelyEqual(delegate.GetBoundsForAnimation(),
|
| + copy.GetBoundsForAnimation());
|
| + CheckApproximatelyEqual(delegate.GetTransformForAnimation(),
|
| + copy.GetTransformForAnimation());
|
| + EXPECT_FLOAT_EQ(delegate.GetOpacityForAnimation(),
|
| + copy.GetOpacityForAnimation());
|
| +
|
| +
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(2000), &delegate);
|
| + CheckApproximatelyEqual(start_transform,
|
| + delegate.GetTransformForAnimation());
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(2500), &delegate);
|
| + CheckApproximatelyEqual(middle_transform,
|
| + delegate.GetTransformForAnimation());
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(3000), &delegate);
|
| + CheckApproximatelyEqual(target_transform,
|
| + delegate.GetTransformForAnimation());
|
| + }
|
| +
|
| + EXPECT_TRUE(sequence.properties().size() == 3);
|
| + EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::OPACITY) !=
|
| + sequence.properties().end());
|
| + EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::TRANSFORM) !=
|
| + sequence.properties().end());
|
| + EXPECT_TRUE(sequence.properties().find(LayerAnimationElement::BOUNDS) !=
|
| + sequence.properties().end());
|
| + EXPECT_EQ(delta + delta + delta, sequence.duration());
|
| +}
|
| +
|
| +// Check that a sequence can still be aborted if it has cycled many times.
|
| +TEST(LayerAnimationSequenceTest, AbortingCyclicSequence) {
|
| + LayerAnimationSequence sequence;
|
| + TestLayerAnimationDelegate delegate;
|
| + float start_opacity = 0.0;
|
| + float target_opacity = 1.0;
|
| + base::TimeDelta delta = base::TimeDelta::FromSeconds(1);
|
| + sequence.AddElement(
|
| + LayerAnimationElement::CreateOpacityElement(target_opacity, delta));
|
| +
|
| + sequence.AddElement(
|
| + LayerAnimationElement::CreateOpacityElement(start_opacity, delta));
|
| +
|
| + sequence.set_is_cyclic(true);
|
| +
|
| + delegate.SetOpacityFromAnimation(start_opacity);
|
| +
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(101000), &delegate);
|
| + EXPECT_FLOAT_EQ(target_opacity, delegate.GetOpacityForAnimation());
|
| + sequence.Abort();
|
| +
|
| + // Should be able to reuse the sequence after aborting.
|
| + delegate.SetOpacityFromAnimation(start_opacity);
|
| + sequence.Progress(base::TimeDelta::FromMilliseconds(100000), &delegate);
|
| + EXPECT_FLOAT_EQ(start_opacity, delegate.GetOpacityForAnimation());
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +} // namespace ui
|
|
|