diff options
Diffstat (limited to 'app/animation_container_unittest.cc')
-rw-r--r-- | app/animation_container_unittest.cc | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/app/animation_container_unittest.cc b/app/animation_container_unittest.cc new file mode 100644 index 0000000..4046ae3 --- /dev/null +++ b/app/animation_container_unittest.cc @@ -0,0 +1,120 @@ +// Copyright (c) 2010 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 "app/animation.h" +#include "app/animation_container.h" +#include "app/test_animation_delegate.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::AtLeast; + +namespace { + +class MockObserver : public AnimationContainer::Observer { + public: + MockObserver() {} + + MOCK_METHOD1(AnimationContainerProgressed, void(AnimationContainer*)); + MOCK_METHOD1(AnimationContainerEmpty, void(AnimationContainer*)); + + private: + DISALLOW_COPY_AND_ASSIGN(MockObserver); +}; + +class TestAnimation : public Animation { + public: + TestAnimation(AnimationDelegate* delegate) + : Animation(20, 20, delegate) { + } + + virtual void AnimateToState(double state) { + } + + private: + DISALLOW_COPY_AND_ASSIGN(TestAnimation); +}; + +} // namespace + +class AnimationContainerTest: public testing::Test { + private: + MessageLoopForUI message_loop_; +}; + +// Makes sure the animation ups the ref count of the container and releases it +// appropriately. +TEST_F(AnimationContainerTest, Ownership) { + TestAnimationDelegate delegate; + scoped_refptr<AnimationContainer> container(new AnimationContainer()); + scoped_ptr<Animation> animation(new TestAnimation(&delegate)); + animation->SetContainer(container.get()); + // Setting the container should up the ref count. + EXPECT_FALSE(container->HasOneRef()); + + animation.reset(); + + // Releasing the animation should decrement the ref count. + EXPECT_TRUE(container->HasOneRef()); +} + +// Makes sure multiple animations are managed correctly. +TEST_F(AnimationContainerTest, Multi) { + TestAnimationDelegate delegate1; + TestAnimationDelegate delegate2; + + scoped_refptr<AnimationContainer> container(new AnimationContainer()); + TestAnimation animation1(&delegate1); + TestAnimation animation2(&delegate2); + animation1.SetContainer(container.get()); + animation2.SetContainer(container.get()); + + // Start both animations. + animation1.Start(); + EXPECT_TRUE(container->is_running()); + animation2.Start(); + EXPECT_TRUE(container->is_running()); + + // Run the message loop the delegate quits the message loop when notified. + MessageLoop::current()->Run(); + + // Both timers should have finished. + EXPECT_TRUE(delegate1.finished()); + EXPECT_TRUE(delegate2.finished()); + + // And the container should no longer be runnings. + EXPECT_FALSE(container->is_running()); +} + +// Makes sure observer is notified appropriately. +TEST_F(AnimationContainerTest, Observer) { + MockObserver observer; + TestAnimationDelegate delegate1; + + scoped_refptr<AnimationContainer> container(new AnimationContainer()); + container->set_observer(&observer); + TestAnimation animation1(&delegate1); + animation1.SetContainer(container.get()); + + // We expect to get these two calls: the animation progressed, and then when + // the animation completed the container went empty. + EXPECT_CALL(observer, AnimationContainerProgressed(container.get())).Times( + AtLeast(1)); + EXPECT_CALL(observer, AnimationContainerEmpty(container.get())).Times(1); + + // Start the animation. + animation1.Start(); + EXPECT_TRUE(container->is_running()); + + // Run the message loop the delegate quits the message loop when notified. + MessageLoop::current()->Run(); + + // The timer should have finished. + EXPECT_TRUE(delegate1.finished()); + + // And the container should no longer be runnings. + EXPECT_FALSE(container->is_running()); + + container->set_observer(NULL); +} |