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