15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2011 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/animation_delegate.h"
7d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/linear_animation.h"
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/gfx/animation/test_animation_delegate.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/win/windows_version.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)namespace gfx {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AnimationTest: public testing::Test {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoopForUI message_loop_;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RunAnimation
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RunAnimation : public LinearAnimation {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAnimation(int frame_rate, AnimationDelegate* delegate)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : LinearAnimation(frame_rate, delegate) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AnimateToState(double state) OVERRIDE {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_LE(0.0, state);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_GE(1.0, state);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CancelAnimation
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CancelAnimation : public LinearAnimation {
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelAnimation(int duration, int frame_rate, AnimationDelegate* delegate)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : LinearAnimation(duration, frame_rate, delegate) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AnimateToState(double state) OVERRIDE {
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (state >= 0.5)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Stop();
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// EndAnimation
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EndAnimation : public LinearAnimation {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndAnimation(int duration, int frame_rate, AnimationDelegate* delegate)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : LinearAnimation(duration, frame_rate, delegate) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AnimateToState(double state) OVERRIDE {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (state >= 0.5)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      End();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DeletingAnimationDelegate
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AnimationDelegate implementation that deletes the animation in ended.
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DeletingAnimationDelegate : public AnimationDelegate {
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AnimationEnded(const Animation* animation) OVERRIDE {
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete animation;
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    base::MessageLoop::current()->Quit();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)///////////////////////////////////////////////////////////////////////////////
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LinearCase
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AnimationTest, RunCase) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAnimationDelegate ad;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAnimation a1(150, &ad);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  a1.SetDuration(2000);
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  a1.Start();
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ad.finished());
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ad.canceled());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AnimationTest, CancelCase) {
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAnimationDelegate ad;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CancelAnimation a2(2000, 150, &ad);
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  a2.Start();
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ad.finished());
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ad.canceled());
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Lets an animation run, invoking End part way through and make sure we get the
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// right delegate methods invoked.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AnimationTest, EndCase) {
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TestAnimationDelegate ad;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EndAnimation a2(2000, 150, &ad);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  a2.Start();
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(ad.finished());
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_FALSE(ad.canceled());
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Runs an animation with a delegate that deletes the animation in end.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AnimationTest, DeleteFromEnd) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DeletingAnimationDelegate delegate;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RunAnimation* animation = new RunAnimation(150, &delegate);
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animation->Start();
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->Run();
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // delegate should have deleted animation.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AnimationTest, ShouldRenderRichAnimation) {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (base::win::GetVersion() >= base::win::VERSION_VISTA) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BOOL result;
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ASSERT_NE(
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        0, ::SystemParametersInfo(SPI_GETCLIENTAREAANIMATION, 0, &result, 0));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // ShouldRenderRichAnimation() should check the SPI_GETCLIENTAREAANIMATION
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // value on Vista.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(!!result, Animation::ShouldRenderRichAnimation());
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // On XP, the function should check the SM_REMOTESESSION value.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    EXPECT_EQ(!::GetSystemMetrics(SM_REMOTESESSION),
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              Animation::ShouldRenderRichAnimation());
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_TRUE(Animation::ShouldRenderRichAnimation());
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that current value is always 0 after Start() is called.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AnimationTest, StartState) {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LinearAnimation animation(100, 60, NULL);
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, animation.GetCurrentValue());
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animation.Start();
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, animation.GetCurrentValue());
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animation.End();
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(1.0, animation.GetCurrentValue());
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  animation.Start();
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(0.0, animation.GetCurrentValue());
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)}  // namespace gfx
159