1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ui/gfx/animation/slide_animation.h"
6
7#include "base/memory/scoped_ptr.h"
8#include "base/time/time.h"
9#include "testing/gtest/include/gtest/gtest.h"
10#include "ui/gfx/animation/test_animation_delegate.h"
11
12namespace gfx {
13
14// Class to provide access to SlideAnimation internals for testing.
15class SlideAnimation::TestApi {
16 public:
17  explicit TestApi(SlideAnimation* animation) : animation_(animation) {}
18
19  void SetStartTime(base::TimeTicks ticks) {
20    animation_->SetStartTime(ticks);
21  }
22
23  void Step(base::TimeTicks ticks) {
24    animation_->Step(ticks);
25  }
26
27 private:
28  SlideAnimation* animation_;
29
30  DISALLOW_COPY_AND_ASSIGN(TestApi);
31};
32
33////////////////////////////////////////////////////////////////////////////////
34// SlideAnimationTest
35class SlideAnimationTest: public testing::Test {
36 private:
37  base::MessageLoopForUI message_loop_;
38};
39
40// Tests animation construction.
41TEST_F(SlideAnimationTest, InitialState) {
42  SlideAnimation animation(NULL);
43  // By default, slide animations are 60 Hz, so the timer interval should be
44  // 1/60th of a second.
45  EXPECT_EQ(1000 / 60, animation.timer_interval().InMilliseconds());
46  // Duration defaults to 120 ms.
47  EXPECT_EQ(120, animation.GetSlideDuration());
48  // Slide is neither showing nor closing.
49  EXPECT_FALSE(animation.IsShowing());
50  EXPECT_FALSE(animation.IsClosing());
51  // Starts at 0.
52  EXPECT_EQ(0.0, animation.GetCurrentValue());
53}
54
55TEST_F(SlideAnimationTest, Basics) {
56  SlideAnimation animation(NULL);
57  SlideAnimation::TestApi test_api(&animation);
58
59  // Use linear tweening to make the math easier below.
60  animation.SetTweenType(Tween::LINEAR);
61
62  // Duration can be set after construction.
63  animation.SetSlideDuration(100);
64  EXPECT_EQ(100, animation.GetSlideDuration());
65
66  // Show toggles the appropriate state.
67  animation.Show();
68  EXPECT_TRUE(animation.IsShowing());
69  EXPECT_FALSE(animation.IsClosing());
70
71  // Simulate running the animation.
72  test_api.SetStartTime(base::TimeTicks());
73  test_api.Step(base::TimeTicks() + base::TimeDelta::FromMilliseconds(50));
74  EXPECT_EQ(0.5, animation.GetCurrentValue());
75
76  // We can start hiding mid-way through the animation.
77  animation.Hide();
78  EXPECT_FALSE(animation.IsShowing());
79  EXPECT_TRUE(animation.IsClosing());
80
81  // Reset stops the animation.
82  animation.Reset();
83  EXPECT_EQ(0.0, animation.GetCurrentValue());
84  EXPECT_FALSE(animation.IsShowing());
85  EXPECT_FALSE(animation.IsClosing());
86}
87
88// Tests that delegate is not notified when animation is running and is deleted.
89// (Such a scenario would cause problems for BoundsAnimator).
90TEST_F(SlideAnimationTest, DontNotifyOnDelete) {
91  TestAnimationDelegate delegate;
92  scoped_ptr<SlideAnimation> animation(new SlideAnimation(&delegate));
93
94  // Start the animation.
95  animation->Show();
96
97  // Delete the animation.
98  animation.reset();
99
100  // Make sure the delegate wasn't notified.
101  EXPECT_FALSE(delegate.finished());
102  EXPECT_FALSE(delegate.canceled());
103}
104
105}  // namespace gfx
106