1// Copyright 2014 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 "base/logging.h" 6#include "base/test/simple_test_tick_clock.h" 7#include "media/base/time_delta_interpolator.h" 8#include "testing/gtest/include/gtest/gtest.h" 9 10namespace media { 11 12class TimeDeltaInterpolatorTest : public ::testing::Test { 13 public: 14 TimeDeltaInterpolatorTest() : interpolator_(&test_tick_clock_) {} 15 16 protected: 17 void AdvanceSystemTime(base::TimeDelta delta) { 18 test_tick_clock_.Advance(delta); 19 } 20 21 base::SimpleTestTickClock test_tick_clock_; 22 TimeDeltaInterpolator interpolator_; 23}; 24 25TEST_F(TimeDeltaInterpolatorTest, Created) { 26 const base::TimeDelta kExpected = base::TimeDelta::FromSeconds(0); 27 EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime()); 28} 29 30TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_NormalSpeed) { 31 const base::TimeDelta kZero; 32 const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(2); 33 34 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 35 AdvanceSystemTime(kTimeToAdvance); 36 EXPECT_EQ(kTimeToAdvance, interpolator_.GetInterpolatedTime()); 37} 38 39TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_DoubleSpeed) { 40 const base::TimeDelta kZero; 41 const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(5); 42 43 interpolator_.SetPlaybackRate(2.0f); 44 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 45 AdvanceSystemTime(kTimeToAdvance); 46 EXPECT_EQ(2 * kTimeToAdvance, interpolator_.GetInterpolatedTime()); 47} 48 49TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_HalfSpeed) { 50 const base::TimeDelta kZero; 51 const base::TimeDelta kTimeToAdvance = base::TimeDelta::FromSeconds(4); 52 53 interpolator_.SetPlaybackRate(0.5f); 54 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 55 AdvanceSystemTime(kTimeToAdvance); 56 EXPECT_EQ(kTimeToAdvance / 2, interpolator_.GetInterpolatedTime()); 57} 58 59TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_ZeroSpeed) { 60 // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8 61 // seconds at normal speed. 62 const base::TimeDelta kZero; 63 const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2); 64 const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4); 65 const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8); 66 const base::TimeDelta kExpected = kPlayDuration1 + kPlayDuration3; 67 68 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 69 70 AdvanceSystemTime(kPlayDuration1); 71 interpolator_.SetPlaybackRate(0.0f); 72 AdvanceSystemTime(kPlayDuration2); 73 interpolator_.SetPlaybackRate(1.0f); 74 AdvanceSystemTime(kPlayDuration3); 75 76 EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime()); 77} 78 79TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_MultiSpeed) { 80 // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8 81 // seconds at double speed. 82 const base::TimeDelta kZero; 83 const base::TimeDelta kPlayDuration1 = base::TimeDelta::FromSeconds(2); 84 const base::TimeDelta kPlayDuration2 = base::TimeDelta::FromSeconds(4); 85 const base::TimeDelta kPlayDuration3 = base::TimeDelta::FromSeconds(8); 86 const base::TimeDelta kExpected = 87 kPlayDuration1 / 2 + kPlayDuration2 + 2 * kPlayDuration3; 88 89 interpolator_.SetPlaybackRate(0.5f); 90 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 91 AdvanceSystemTime(kPlayDuration1); 92 93 interpolator_.SetPlaybackRate(1.0f); 94 AdvanceSystemTime(kPlayDuration2); 95 96 interpolator_.SetPlaybackRate(2.0f); 97 AdvanceSystemTime(kPlayDuration3); 98 EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime()); 99} 100 101TEST_F(TimeDeltaInterpolatorTest, StopInterpolating) { 102 const base::TimeDelta kZero; 103 const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4); 104 const base::TimeDelta kPauseDuration = base::TimeDelta::FromSeconds(20); 105 const base::TimeDelta kExpectedFirstPause = kPlayDuration; 106 const base::TimeDelta kExpectedSecondPause = 2 * kPlayDuration; 107 108 // Play for 4 seconds. 109 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 110 AdvanceSystemTime(kPlayDuration); 111 112 // Pause for 20 seconds. 113 EXPECT_EQ(kExpectedFirstPause, interpolator_.StopInterpolating()); 114 EXPECT_EQ(kExpectedFirstPause, interpolator_.GetInterpolatedTime()); 115 AdvanceSystemTime(kPauseDuration); 116 EXPECT_EQ(kExpectedFirstPause, interpolator_.GetInterpolatedTime()); 117 118 // Play again for 4 more seconds. 119 EXPECT_EQ(kExpectedFirstPause, interpolator_.StartInterpolating()); 120 AdvanceSystemTime(kPlayDuration); 121 EXPECT_EQ(kExpectedSecondPause, interpolator_.StopInterpolating()); 122 EXPECT_EQ(kExpectedSecondPause, interpolator_.GetInterpolatedTime()); 123} 124 125TEST_F(TimeDeltaInterpolatorTest, SetBounds_Stopped) { 126 const base::TimeDelta kFirstTime = base::TimeDelta::FromSeconds(4); 127 const base::TimeDelta kSecondTime = base::TimeDelta::FromSeconds(16); 128 const base::TimeDelta kArbitraryMaxTime = base::TimeDelta::FromSeconds(100); 129 130 interpolator_.SetBounds(kFirstTime, kArbitraryMaxTime); 131 EXPECT_EQ(kFirstTime, interpolator_.GetInterpolatedTime()); 132 interpolator_.SetBounds(kSecondTime, kArbitraryMaxTime); 133 EXPECT_EQ(kSecondTime, interpolator_.GetInterpolatedTime()); 134} 135 136TEST_F(TimeDeltaInterpolatorTest, SetBounds_Started) { 137 // We'll play for 4 seconds, then set the time to 12, then play for 4 more 138 // seconds. 139 const base::TimeDelta kZero; 140 const base::TimeDelta kPlayDuration = base::TimeDelta::FromSeconds(4); 141 const base::TimeDelta kUpdatedTime = base::TimeDelta::FromSeconds(12); 142 const base::TimeDelta kArbitraryMaxTime = base::TimeDelta::FromSeconds(100); 143 const base::TimeDelta kExpected = kUpdatedTime + kPlayDuration; 144 145 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 146 AdvanceSystemTime(kPlayDuration); 147 148 interpolator_.SetBounds(kUpdatedTime, kArbitraryMaxTime); 149 AdvanceSystemTime(kPlayDuration); 150 EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime()); 151} 152 153TEST_F(TimeDeltaInterpolatorTest, SetUpperBound) { 154 const base::TimeDelta kZero; 155 const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4); 156 const base::TimeDelta kMaxTime = base::TimeDelta::FromSeconds(6); 157 158 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 159 interpolator_.SetUpperBound(kMaxTime); 160 AdvanceSystemTime(kTimeInterval); 161 EXPECT_EQ(kTimeInterval, interpolator_.GetInterpolatedTime()); 162 163 AdvanceSystemTime(kTimeInterval); 164 EXPECT_EQ(kMaxTime, interpolator_.GetInterpolatedTime()); 165 166 AdvanceSystemTime(kTimeInterval); 167 EXPECT_EQ(kMaxTime, interpolator_.GetInterpolatedTime()); 168} 169 170TEST_F(TimeDeltaInterpolatorTest, SetUpperBound_MultipleTimes) { 171 const base::TimeDelta kZero; 172 const base::TimeDelta kTimeInterval = base::TimeDelta::FromSeconds(4); 173 const base::TimeDelta kMaxTime0 = base::TimeDelta::FromSeconds(120); 174 const base::TimeDelta kMaxTime1 = base::TimeDelta::FromSeconds(6); 175 const base::TimeDelta kMaxTime2 = base::TimeDelta::FromSeconds(12); 176 177 EXPECT_EQ(kZero, interpolator_.StartInterpolating()); 178 interpolator_.SetUpperBound(kMaxTime0); 179 AdvanceSystemTime(kTimeInterval); 180 EXPECT_EQ(kTimeInterval, interpolator_.GetInterpolatedTime()); 181 182 interpolator_.SetUpperBound(kMaxTime1); 183 AdvanceSystemTime(kTimeInterval); 184 EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime()); 185 186 AdvanceSystemTime(kTimeInterval); 187 EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime()); 188 189 interpolator_.SetUpperBound(kMaxTime2); 190 EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime()); 191 192 AdvanceSystemTime(kTimeInterval); 193 EXPECT_EQ(kMaxTime1 + kTimeInterval, interpolator_.GetInterpolatedTime()); 194 195 AdvanceSystemTime(kTimeInterval); 196 EXPECT_EQ(kMaxTime2, interpolator_.GetInterpolatedTime()); 197} 198 199} // namespace media 200