|  | // 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 "testing/gtest/include/gtest/gtest.h" | 
|  | #include "ui/gfx/animation/animation_delegate.h" | 
|  | #include "ui/gfx/animation/linear_animation.h" | 
|  | #include "ui/gfx/animation/test_animation_delegate.h" | 
|  |  | 
|  | namespace gfx { | 
|  |  | 
|  | class AnimationTest: public testing::Test { | 
|  | private: | 
|  | base::MessageLoopForUI message_loop_; | 
|  | }; | 
|  |  | 
|  | namespace { | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // RunAnimation | 
|  |  | 
|  | class RunAnimation : public LinearAnimation { | 
|  | public: | 
|  | RunAnimation(int frame_rate, AnimationDelegate* delegate) | 
|  | : LinearAnimation(frame_rate, delegate) { | 
|  | } | 
|  |  | 
|  | void AnimateToState(double state) override { | 
|  | EXPECT_LE(0.0, state); | 
|  | EXPECT_GE(1.0, state); | 
|  | } | 
|  | }; | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // CancelAnimation | 
|  |  | 
|  | class CancelAnimation : public LinearAnimation { | 
|  | public: | 
|  | CancelAnimation(int duration, int frame_rate, AnimationDelegate* delegate) | 
|  | : LinearAnimation(duration, frame_rate, delegate) { | 
|  | } | 
|  |  | 
|  | void AnimateToState(double state) override { | 
|  | if (state >= 0.5) | 
|  | Stop(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // EndAnimation | 
|  |  | 
|  | class EndAnimation : public LinearAnimation { | 
|  | public: | 
|  | EndAnimation(int duration, int frame_rate, AnimationDelegate* delegate) | 
|  | : LinearAnimation(duration, frame_rate, delegate) { | 
|  | } | 
|  |  | 
|  | void AnimateToState(double state) override { | 
|  | if (state >= 0.5) | 
|  | End(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // DeletingAnimationDelegate | 
|  |  | 
|  | // AnimationDelegate implementation that deletes the animation in ended. | 
|  | class DeletingAnimationDelegate : public AnimationDelegate { | 
|  | public: | 
|  | void AnimationEnded(const Animation* animation) override { | 
|  | delete animation; | 
|  | base::MessageLoop::current()->Quit(); | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace | 
|  |  | 
|  | /////////////////////////////////////////////////////////////////////////////// | 
|  | // LinearCase | 
|  |  | 
|  | TEST_F(AnimationTest, RunCase) { | 
|  | TestAnimationDelegate ad; | 
|  | RunAnimation a1(150, &ad); | 
|  | a1.SetDuration(2000); | 
|  | a1.Start(); | 
|  | base::MessageLoop::current()->Run(); | 
|  |  | 
|  | EXPECT_TRUE(ad.finished()); | 
|  | EXPECT_FALSE(ad.canceled()); | 
|  | } | 
|  |  | 
|  | TEST_F(AnimationTest, CancelCase) { | 
|  | TestAnimationDelegate ad; | 
|  | CancelAnimation a2(2000, 150, &ad); | 
|  | a2.Start(); | 
|  | base::MessageLoop::current()->Run(); | 
|  |  | 
|  | EXPECT_TRUE(ad.finished()); | 
|  | EXPECT_TRUE(ad.canceled()); | 
|  | } | 
|  |  | 
|  | // Lets an animation run, invoking End part way through and make sure we get the | 
|  | // right delegate methods invoked. | 
|  | TEST_F(AnimationTest, EndCase) { | 
|  | TestAnimationDelegate ad; | 
|  | EndAnimation a2(2000, 150, &ad); | 
|  | a2.Start(); | 
|  | base::MessageLoop::current()->Run(); | 
|  |  | 
|  | EXPECT_TRUE(ad.finished()); | 
|  | EXPECT_FALSE(ad.canceled()); | 
|  | } | 
|  |  | 
|  | // Runs an animation with a delegate that deletes the animation in end. | 
|  | TEST_F(AnimationTest, DeleteFromEnd) { | 
|  | DeletingAnimationDelegate delegate; | 
|  | RunAnimation* animation = new RunAnimation(150, &delegate); | 
|  | animation->Start(); | 
|  | base::MessageLoop::current()->Run(); | 
|  | // delegate should have deleted animation. | 
|  | } | 
|  |  | 
|  | TEST_F(AnimationTest, ShouldRenderRichAnimation) { | 
|  | EXPECT_TRUE(Animation::ShouldRenderRichAnimation()); | 
|  | } | 
|  |  | 
|  | // Test that current value is always 0 after Start() is called. | 
|  | TEST_F(AnimationTest, StartState) { | 
|  | LinearAnimation animation(100, 60, NULL); | 
|  | EXPECT_EQ(0.0, animation.GetCurrentValue()); | 
|  | animation.Start(); | 
|  | EXPECT_EQ(0.0, animation.GetCurrentValue()); | 
|  | animation.End(); | 
|  | EXPECT_EQ(1.0, animation.GetCurrentValue()); | 
|  | animation.Start(); | 
|  | EXPECT_EQ(0.0, animation.GetCurrentValue()); | 
|  | } | 
|  |  | 
|  | }  // namespace gfx |