/*
 *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

#include "rtc_base/numerics/sample_counter.h"

#include <utility>
#include <vector>

#include "test/gmock.h"
#include "test/gtest.h"

using testing::Eq;

namespace rtc {

TEST(SampleCounterTest, ProcessesNoSamples) {
  constexpr int kMinSamples = 1;
  SampleCounter counter;
  EXPECT_THAT(counter.Avg(kMinSamples), Eq(absl::nullopt));
  EXPECT_THAT(counter.Max(), Eq(absl::nullopt));
}

TEST(SampleCounterTest, NotEnoughSamples) {
  constexpr int kMinSamples = 6;
  SampleCounter counter;
  for (int value : {1, 2, 3, 4, 5}) {
    counter.Add(value);
  }
  EXPECT_THAT(counter.Avg(kMinSamples), Eq(absl::nullopt));
  EXPECT_THAT(counter.Max(), Eq(5));
}

TEST(SampleCounterTest, EnoughSamples) {
  constexpr int kMinSamples = 5;
  SampleCounter counter;
  for (int value : {1, 2, 3, 4, 5}) {
    counter.Add(value);
  }
  EXPECT_THAT(counter.Avg(kMinSamples), Eq(3));
  EXPECT_THAT(counter.Max(), Eq(5));
}

TEST(SampleCounterTest, ComputesVariance) {
  constexpr int kMinSamples = 5;
  SampleCounterWithVariance counter;
  for (int value : {1, 2, 3, 4, 5}) {
    counter.Add(value);
  }
  EXPECT_THAT(counter.Variance(kMinSamples), Eq(2));
}

TEST(SampleCounterTest, AggregatesTwoCounters) {
  constexpr int kMinSamples = 5;
  SampleCounterWithVariance counter1;
  for (int value : {1, 2, 3}) {
    counter1.Add(value);
  }
  SampleCounterWithVariance counter2;
  for (int value : {4, 5}) {
    counter2.Add(value);
  }
  // Before aggregation there is not enough samples.
  EXPECT_THAT(counter1.Avg(kMinSamples), Eq(absl::nullopt));
  EXPECT_THAT(counter1.Variance(kMinSamples), Eq(absl::nullopt));
  // Aggregate counter2 in counter1.
  counter1.Add(counter2);
  EXPECT_THAT(counter1.Avg(kMinSamples), Eq(3));
  EXPECT_THAT(counter1.Max(), Eq(5));
  EXPECT_THAT(counter1.Variance(kMinSamples), Eq(2));
}

}  // namespace rtc
