// Copyright 2015 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/time/time.h"
#include "media/base/moving_average.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace media {

TEST(MovingAverageTest, AverageAndDeviation) {
  const int kSamples = 5;
  MovingAverage moving_average(kSamples);
  moving_average.AddSample(base::Seconds(1));
  EXPECT_EQ(base::Seconds(1), moving_average.Average());
  EXPECT_EQ(base::TimeDelta(), moving_average.Deviation());

  for (int i = 0; i < kSamples - 1; ++i)
    moving_average.AddSample(base::Seconds(1));
  EXPECT_EQ(base::Seconds(1), moving_average.Average());
  EXPECT_EQ(base::TimeDelta(), moving_average.Deviation());

  base::TimeDelta expect_deviation[] = {
      base::Microseconds(200000), base::Microseconds(244948),
      base::Microseconds(244948), base::Microseconds(200000),
      base::Milliseconds(0),
  };
  for (int i = 0; i < kSamples; ++i) {
    moving_average.AddSample(base::Milliseconds(500));
    EXPECT_EQ(base::Milliseconds(1000 - (i + 1) * 100),
              moving_average.Average());
    EXPECT_EQ(expect_deviation[i], moving_average.Deviation());
  }
}

TEST(MovingAverageTest, Reset) {
  MovingAverage moving_average(2);
  moving_average.AddSample(base::Seconds(1));
  EXPECT_EQ(base::Seconds(1), moving_average.Average());
  moving_average.Reset();
  moving_average.AddSample(base::TimeDelta());
  EXPECT_EQ(base::TimeDelta(), moving_average.Average());
  EXPECT_EQ(base::TimeDelta(), moving_average.Deviation());
}

TEST(MovingAverageTest, MinAndMax) {
  MovingAverage moving_average(5);
  base::TimeDelta min = base::Seconds(1);
  base::TimeDelta med = base::Seconds(50);
  base::TimeDelta max = base::Seconds(100);
  moving_average.AddSample(min);
  moving_average.AddSample(med);
  moving_average.AddSample(med);
  moving_average.AddSample(med);
  moving_average.AddSample(max);
  auto extremes = moving_average.GetMinAndMax();
  EXPECT_EQ(extremes.first, min);
  EXPECT_EQ(extremes.second, max);
}

}  // namespace media
