// Copyright 2014 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 "base/test/simple_test_tick_clock.h"
#include "media/base/time_delta_interpolator.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace media {

class TimeDeltaInterpolatorTest : public ::testing::Test {
 public:
  TimeDeltaInterpolatorTest() : interpolator_(&test_tick_clock_) {
    interpolator_.SetPlaybackRate(1.0);
  }

 protected:
  void AdvanceSystemTime(base::TimeDelta delta) {
    test_tick_clock_.Advance(delta);
  }

  base::SimpleTestTickClock test_tick_clock_;
  TimeDeltaInterpolator interpolator_;
};

TEST_F(TimeDeltaInterpolatorTest, Created) {
  const base::TimeDelta kExpected = base::Seconds(0);
  EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_NormalSpeed) {
  const base::TimeDelta kZero;
  const base::TimeDelta kTimeToAdvance = base::Seconds(2);

  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
  AdvanceSystemTime(kTimeToAdvance);
  EXPECT_EQ(kTimeToAdvance, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_DoubleSpeed) {
  const base::TimeDelta kZero;
  const base::TimeDelta kTimeToAdvance = base::Seconds(5);

  interpolator_.SetPlaybackRate(2.0);
  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
  AdvanceSystemTime(kTimeToAdvance);
  EXPECT_EQ(2 * kTimeToAdvance, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_HalfSpeed) {
  const base::TimeDelta kZero;
  const base::TimeDelta kTimeToAdvance = base::Seconds(4);

  interpolator_.SetPlaybackRate(0.5);
  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
  AdvanceSystemTime(kTimeToAdvance);
  EXPECT_EQ(kTimeToAdvance / 2, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_ZeroSpeed) {
  // We'll play for 2 seconds at normal speed, 4 seconds at zero speed, and 8
  // seconds at normal speed.
  const base::TimeDelta kZero;
  const base::TimeDelta kPlayDuration1 = base::Seconds(2);
  const base::TimeDelta kPlayDuration2 = base::Seconds(4);
  const base::TimeDelta kPlayDuration3 = base::Seconds(8);
  const base::TimeDelta kExpected = kPlayDuration1 + kPlayDuration3;

  EXPECT_EQ(kZero, interpolator_.StartInterpolating());

  AdvanceSystemTime(kPlayDuration1);
  interpolator_.SetPlaybackRate(0.0);
  AdvanceSystemTime(kPlayDuration2);
  interpolator_.SetPlaybackRate(1.0);
  AdvanceSystemTime(kPlayDuration3);

  EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, StartInterpolating_MultiSpeed) {
  // We'll play for 2 seconds at half speed, 4 seconds at normal speed, and 8
  // seconds at double speed.
  const base::TimeDelta kZero;
  const base::TimeDelta kPlayDuration1 = base::Seconds(2);
  const base::TimeDelta kPlayDuration2 = base::Seconds(4);
  const base::TimeDelta kPlayDuration3 = base::Seconds(8);
  const base::TimeDelta kExpected =
      kPlayDuration1 / 2 + kPlayDuration2 + 2 * kPlayDuration3;

  interpolator_.SetPlaybackRate(0.5);
  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
  AdvanceSystemTime(kPlayDuration1);

  interpolator_.SetPlaybackRate(1.0);
  AdvanceSystemTime(kPlayDuration2);

  interpolator_.SetPlaybackRate(2.0);
  AdvanceSystemTime(kPlayDuration3);
  EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, StopInterpolating) {
  const base::TimeDelta kZero;
  const base::TimeDelta kPlayDuration = base::Seconds(4);
  const base::TimeDelta kPauseDuration = base::Seconds(20);
  const base::TimeDelta kExpectedFirstPause = kPlayDuration;
  const base::TimeDelta kExpectedSecondPause = 2 * kPlayDuration;

  // Play for 4 seconds.
  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
  AdvanceSystemTime(kPlayDuration);

  // Pause for 20 seconds.
  EXPECT_EQ(kExpectedFirstPause, interpolator_.StopInterpolating());
  EXPECT_EQ(kExpectedFirstPause, interpolator_.GetInterpolatedTime());
  AdvanceSystemTime(kPauseDuration);
  EXPECT_EQ(kExpectedFirstPause, interpolator_.GetInterpolatedTime());

  // Play again for 4 more seconds.
  EXPECT_EQ(kExpectedFirstPause, interpolator_.StartInterpolating());
  AdvanceSystemTime(kPlayDuration);
  EXPECT_EQ(kExpectedSecondPause, interpolator_.StopInterpolating());
  EXPECT_EQ(kExpectedSecondPause, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, SetBounds_Stopped) {
  const base::TimeDelta kFirstTime = base::Seconds(4);
  const base::TimeDelta kSecondTime = base::Seconds(16);
  const base::TimeDelta kArbitraryMaxTime = base::Seconds(100);

  interpolator_.SetBounds(kFirstTime, kArbitraryMaxTime,
                          test_tick_clock_.NowTicks());
  EXPECT_EQ(kFirstTime, interpolator_.GetInterpolatedTime());
  interpolator_.SetBounds(kSecondTime, kArbitraryMaxTime,
                          test_tick_clock_.NowTicks());
  EXPECT_EQ(kSecondTime, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, SetBounds_Started) {
  // We'll play for 4 seconds, then set the time to 12, then play for 4 more
  // seconds.
  const base::TimeDelta kZero;
  const base::TimeDelta kPlayDuration = base::Seconds(4);
  const base::TimeDelta kUpdatedTime = base::Seconds(12);
  const base::TimeDelta kArbitraryMaxTime = base::Seconds(100);
  const base::TimeDelta kExpected = kUpdatedTime + kPlayDuration;

  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
  AdvanceSystemTime(kPlayDuration);

  interpolator_.SetBounds(kUpdatedTime, kArbitraryMaxTime,
                          test_tick_clock_.NowTicks());
  AdvanceSystemTime(kPlayDuration);
  EXPECT_EQ(kExpected, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, SetUpperBound) {
  const base::TimeDelta kZero;
  const base::TimeDelta kTimeInterval = base::Seconds(4);
  const base::TimeDelta kMaxTime = base::Seconds(6);

  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
  interpolator_.SetUpperBound(kMaxTime);
  AdvanceSystemTime(kTimeInterval);
  EXPECT_EQ(kTimeInterval, interpolator_.GetInterpolatedTime());

  AdvanceSystemTime(kTimeInterval);
  EXPECT_EQ(kMaxTime, interpolator_.GetInterpolatedTime());

  AdvanceSystemTime(kTimeInterval);
  EXPECT_EQ(kMaxTime, interpolator_.GetInterpolatedTime());
}

TEST_F(TimeDeltaInterpolatorTest, SetUpperBound_MultipleTimes) {
  const base::TimeDelta kZero;
  const base::TimeDelta kTimeInterval = base::Seconds(4);
  const base::TimeDelta kMaxTime0 = base::Seconds(120);
  const base::TimeDelta kMaxTime1 = base::Seconds(6);
  const base::TimeDelta kMaxTime2 = base::Seconds(12);

  EXPECT_EQ(kZero, interpolator_.StartInterpolating());
  interpolator_.SetUpperBound(kMaxTime0);
  AdvanceSystemTime(kTimeInterval);
  EXPECT_EQ(kTimeInterval, interpolator_.GetInterpolatedTime());

  interpolator_.SetUpperBound(kMaxTime1);
  AdvanceSystemTime(kTimeInterval);
  EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime());

  AdvanceSystemTime(kTimeInterval);
  EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime());

  interpolator_.SetUpperBound(kMaxTime2);
  EXPECT_EQ(kMaxTime1, interpolator_.GetInterpolatedTime());

  AdvanceSystemTime(kTimeInterval);
  EXPECT_EQ(kMaxTime1 + kTimeInterval, interpolator_.GetInterpolatedTime());

  AdvanceSystemTime(kTimeInterval);
  EXPECT_EQ(kMaxTime2, interpolator_.GetInterpolatedTime());
}

}  // namespace media
