Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Side by Side Diff: remoting/client/fling_animation_unittest.cc

Issue 2869723007: [CRD iOS] Viewport fling animation (Closed)
Patch Set: Merge branch 'master' into feat-fling-animation Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « remoting/client/fling_animation.cc ('k') | remoting/client/fling_tracker.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2017 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 "remoting/client/fling_animation.h"
6
7 #include <cmath>
8
9 #include "base/bind.h"
10 #include "base/memory/ptr_util.h"
11 #include "base/test/simple_test_tick_clock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 namespace remoting {
15
16 namespace {
17
18 const float kFlingTimeConstant = 325.f;
19
20 } // namespace
21
22 class FlingAnimationTest : public testing::Test {
23 public:
24 void SetUp() override;
25 void TearDown() override;
26
27 protected:
28 void TickAnimation(base::TimeDelta time_delta);
29
30 // Must be called after the animation ticks.
31 void AssertDeltaChanged();
32
33 FlingAnimation fling_animation_{
34 kFlingTimeConstant,
35 base::Bind(&FlingAnimationTest::OnDeltaChanged, base::Unretained(this))};
36
37 float received_dx_ = 0.f;
38 float received_dy_ = 0.f;
39
40 private:
41 void OnDeltaChanged(float dx, float dy);
42
43 bool change_received_ = false;
44
45 // Owned by |fling_animation_|.
46 base::SimpleTestTickClock* mock_clock_;
47 };
48
49 void FlingAnimationTest::SetUp() {
50 mock_clock_ = new base::SimpleTestTickClock();
51 fling_animation_.SetTickClockForTest(base::WrapUnique(mock_clock_));
52 }
53
54 void FlingAnimationTest::TearDown() {
55 ASSERT_FALSE(change_received_);
56 }
57
58 void FlingAnimationTest::TickAnimation(base::TimeDelta time_delta) {
59 mock_clock_->Advance(time_delta);
60 fling_animation_.Tick();
61 }
62
63 void FlingAnimationTest::AssertDeltaChanged() {
64 ASSERT_TRUE(change_received_);
65 change_received_ = false;
66 }
67
68 void FlingAnimationTest::OnDeltaChanged(float dx, float dy) {
69 received_dx_ = dx;
70 received_dy_ = dy;
71 change_received_ = true;
72 }
73
74 TEST_F(FlingAnimationTest, TestNoFling) {
75 EXPECT_FALSE(fling_animation_.IsAnimationInProgress());
76
77 // This should not change the delta.
78 TickAnimation(base::TimeDelta::FromMilliseconds(100));
79 }
80
81 TEST_F(FlingAnimationTest, TestFlingWillEventuallyStop) {
82 fling_animation_.SetVelocity(1500.f, 1200.f);
83
84 EXPECT_TRUE(fling_animation_.IsAnimationInProgress());
85
86 TickAnimation(base::TimeDelta::FromMinutes(1));
87
88 EXPECT_FALSE(fling_animation_.IsAnimationInProgress());
89 }
90
91 TEST_F(FlingAnimationTest, TestFlingDeltaIsDecreasing) {
92 fling_animation_.SetVelocity(1500.f, 1200.f);
93
94 float previous_dx = std::numeric_limits<float>::infinity();
95 float previous_dy = std::numeric_limits<float>::infinity();
96
97 while (true) {
98 TickAnimation(base::TimeDelta::FromMilliseconds(16));
99 if (!fling_animation_.IsAnimationInProgress()) {
100 break;
101 }
102 AssertDeltaChanged();
103 float hyp =
104 std::sqrt(received_dx_ * received_dx_ + received_dy_ * received_dy_);
105 float prev_hyp =
106 std::sqrt(previous_dx * previous_dx + previous_dy * previous_dy);
107 EXPECT_LT(hyp, prev_hyp);
108 previous_dx = received_dx_;
109 previous_dy = received_dy_;
110 }
111 }
112
113 TEST_F(FlingAnimationTest, TestIgnoreLowVelocity) {
114 fling_animation_.SetVelocity(5.f, 5.f);
115
116 EXPECT_FALSE(fling_animation_.IsAnimationInProgress());
117
118 // This should not change the delta.
119 TickAnimation(base::TimeDelta::FromMilliseconds(5));
120 }
121
122 TEST_F(FlingAnimationTest, TestAbortAnimation) {
123 fling_animation_.SetVelocity(1500.f, 1200.f);
124
125 EXPECT_TRUE(fling_animation_.IsAnimationInProgress());
126
127 TickAnimation(base::TimeDelta::FromMilliseconds(16));
128 AssertDeltaChanged();
129 EXPECT_TRUE(fling_animation_.IsAnimationInProgress());
130
131 fling_animation_.Abort();
132 EXPECT_FALSE(fling_animation_.IsAnimationInProgress());
133 }
134
135 TEST_F(FlingAnimationTest, TestResetVelocity) {
136 fling_animation_.SetVelocity(1000.f, -1000.f);
137 EXPECT_TRUE(fling_animation_.IsAnimationInProgress());
138 TickAnimation(base::TimeDelta::FromMilliseconds(16));
139 EXPECT_TRUE(fling_animation_.IsAnimationInProgress());
140 AssertDeltaChanged();
141 EXPECT_GT(received_dx_, 0);
142 EXPECT_LT(received_dy_, 0);
143
144 fling_animation_.SetVelocity(-1000.f, 1000.f);
145 EXPECT_TRUE(fling_animation_.IsAnimationInProgress());
146 TickAnimation(base::TimeDelta::FromMilliseconds(16));
147 EXPECT_TRUE(fling_animation_.IsAnimationInProgress());
148 AssertDeltaChanged();
149 EXPECT_LT(received_dx_, 0);
150 EXPECT_GT(received_dy_, 0);
151 }
152
153 } // namespace remoting
OLDNEW
« no previous file with comments | « remoting/client/fling_animation.cc ('k') | remoting/client/fling_tracker.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698