/*
 *  Copyright 2017 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/histogram_percentile_counter.h"

#include <utility>
#include <vector>

#include "test/gtest.h"

TEST(HistogramPercentileCounterTest, ReturnsCorrectPercentiles) {
  rtc::HistogramPercentileCounter counter(10);
  const std::vector<int> kTestValues = {1,  2,  3,  4,  5,  6,  7,  8,  9,  10,
                                        11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

  EXPECT_FALSE(counter.GetPercentile(0.5f));
  // Pairs of {fraction, percentile value} computed by hand
  // for |kTestValues|.
  const std::vector<std::pair<float, uint32_t>> kTestPercentiles = {
      {0.0f, 1},   {0.01f, 1},  {0.5f, 10}, {0.9f, 18},
      {0.95f, 19}, {0.99f, 20}, {1.0f, 20}};
  for (int value : kTestValues) {
    counter.Add(value);
  }
  for (const auto& test_percentile : kTestPercentiles) {
    EXPECT_EQ(test_percentile.second,
              counter.GetPercentile(test_percentile.first).value_or(0));
  }
}

TEST(HistogramPercentileCounterTest, HandlesEmptySequence) {
  rtc::HistogramPercentileCounter counter(10);
  EXPECT_FALSE(counter.GetPercentile(0.5f));
  counter.Add(1u);
  EXPECT_TRUE(counter.GetPercentile(0.5f));
}
