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 |