/*
 *  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 <initializer_list>

#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.Sum(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.Sum(kMinSamples), Eq(15));
  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
