blob: 8634295c8e35b3ecfab1897684d7d9116ecac3bd [file] [log] [blame]
Artem Titove4ed6ea2019-01-11 11:02:19 +01001/*
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "rtc_base/numerics/samples_stats_counter.h"
12
Artem Titove6f6a0c2019-02-07 12:14:35 +010013#include <math.h>
Artem Titovd2a63782019-03-21 10:37:37 +010014#include <random>
Artem Titove4ed6ea2019-01-11 11:02:19 +010015#include <vector>
16
Steve Anton2acd1632019-03-25 13:48:30 -070017#include "absl/algorithm/container.h"
Artem Titove4ed6ea2019-01-11 11:02:19 +010018#include "test/gtest.h"
19
20namespace webrtc {
21namespace {
Artem Titove6f6a0c2019-02-07 12:14:35 +010022
Artem Titove4ed6ea2019-01-11 11:02:19 +010023SamplesStatsCounter CreateStatsFilledWithIntsFrom1ToN(int n) {
24 std::vector<double> data;
25 for (int i = 1; i <= n; i++) {
26 data.push_back(i);
27 }
Steve Anton2acd1632019-03-25 13:48:30 -070028 absl::c_shuffle(data, std::mt19937(std::random_device()()));
Artem Titove4ed6ea2019-01-11 11:02:19 +010029
30 SamplesStatsCounter stats;
31 for (double v : data) {
32 stats.AddSample(v);
33 }
34 return stats;
35}
Artem Titove6f6a0c2019-02-07 12:14:35 +010036
Artem Titove4ed6ea2019-01-11 11:02:19 +010037} // namespace
38
39TEST(SamplesStatsCounter, FullSimpleTest) {
40 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(100);
41
Artem Titove6f6a0c2019-02-07 12:14:35 +010042 EXPECT_TRUE(!stats.IsEmpty());
43 EXPECT_DOUBLE_EQ(stats.GetMin(), 1.0);
44 EXPECT_DOUBLE_EQ(stats.GetMax(), 100.0);
45 EXPECT_DOUBLE_EQ(stats.GetAverage(), 50.5);
Artem Titove4ed6ea2019-01-11 11:02:19 +010046 for (int i = 1; i <= 100; i++) {
47 double p = i / 100.0;
Artem Titove6f6a0c2019-02-07 12:14:35 +010048 EXPECT_GE(stats.GetPercentile(p), i);
49 EXPECT_LT(stats.GetPercentile(p), i + 1);
Artem Titove4ed6ea2019-01-11 11:02:19 +010050 }
51}
52
Artem Titove6f6a0c2019-02-07 12:14:35 +010053TEST(SamplesStatsCounter, VarianceAndDeviation) {
54 SamplesStatsCounter stats;
55 stats.AddSample(2);
56 stats.AddSample(2);
57 stats.AddSample(-1);
58 stats.AddSample(5);
59
60 EXPECT_DOUBLE_EQ(stats.GetAverage(), 2.0);
61 EXPECT_DOUBLE_EQ(stats.GetVariance(), 4.5);
62 EXPECT_DOUBLE_EQ(stats.GetStandardDeviation(), sqrt(4.5));
63}
64
Artem Titove4ed6ea2019-01-11 11:02:19 +010065TEST(SamplesStatsCounter, FractionPercentile) {
66 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(5);
67
Artem Titove6f6a0c2019-02-07 12:14:35 +010068 EXPECT_DOUBLE_EQ(stats.GetPercentile(0.5), 3);
Artem Titove4ed6ea2019-01-11 11:02:19 +010069}
70
71TEST(SamplesStatsCounter, TestBorderValues) {
72 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(5);
73
Artem Titove6f6a0c2019-02-07 12:14:35 +010074 EXPECT_GE(stats.GetPercentile(0.01), 1);
75 EXPECT_LT(stats.GetPercentile(0.01), 2);
76 EXPECT_DOUBLE_EQ(stats.GetPercentile(1.0), 5);
Artem Titove4ed6ea2019-01-11 11:02:19 +010077}
78
79} // namespace webrtc