blob: e6d9f6728ce0b6fd7a863b6e126e9e71ab0c0371 [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 Titove4ed6ea2019-01-11 11:02:19 +010014#include <algorithm>
15#include <vector>
16
17#include "test/gtest.h"
18
19namespace webrtc {
20namespace {
Artem Titove6f6a0c2019-02-07 12:14:35 +010021
Artem Titove4ed6ea2019-01-11 11:02:19 +010022SamplesStatsCounter CreateStatsFilledWithIntsFrom1ToN(int n) {
23 std::vector<double> data;
24 for (int i = 1; i <= n; i++) {
25 data.push_back(i);
26 }
27 std::random_shuffle(data.begin(), data.end());
28
29 SamplesStatsCounter stats;
30 for (double v : data) {
31 stats.AddSample(v);
32 }
33 return stats;
34}
Artem Titove6f6a0c2019-02-07 12:14:35 +010035
Artem Titove4ed6ea2019-01-11 11:02:19 +010036} // namespace
37
38TEST(SamplesStatsCounter, FullSimpleTest) {
39 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(100);
40
Artem Titove6f6a0c2019-02-07 12:14:35 +010041 EXPECT_TRUE(!stats.IsEmpty());
42 EXPECT_DOUBLE_EQ(stats.GetMin(), 1.0);
43 EXPECT_DOUBLE_EQ(stats.GetMax(), 100.0);
44 EXPECT_DOUBLE_EQ(stats.GetAverage(), 50.5);
Artem Titove4ed6ea2019-01-11 11:02:19 +010045 for (int i = 1; i <= 100; i++) {
46 double p = i / 100.0;
Artem Titove6f6a0c2019-02-07 12:14:35 +010047 EXPECT_GE(stats.GetPercentile(p), i);
48 EXPECT_LT(stats.GetPercentile(p), i + 1);
Artem Titove4ed6ea2019-01-11 11:02:19 +010049 }
50}
51
Artem Titove6f6a0c2019-02-07 12:14:35 +010052TEST(SamplesStatsCounter, VarianceAndDeviation) {
53 SamplesStatsCounter stats;
54 stats.AddSample(2);
55 stats.AddSample(2);
56 stats.AddSample(-1);
57 stats.AddSample(5);
58
59 EXPECT_DOUBLE_EQ(stats.GetAverage(), 2.0);
60 EXPECT_DOUBLE_EQ(stats.GetVariance(), 4.5);
61 EXPECT_DOUBLE_EQ(stats.GetStandardDeviation(), sqrt(4.5));
62}
63
Artem Titove4ed6ea2019-01-11 11:02:19 +010064TEST(SamplesStatsCounter, FractionPercentile) {
65 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(5);
66
Artem Titove6f6a0c2019-02-07 12:14:35 +010067 EXPECT_DOUBLE_EQ(stats.GetPercentile(0.5), 3);
Artem Titove4ed6ea2019-01-11 11:02:19 +010068}
69
70TEST(SamplesStatsCounter, TestBorderValues) {
71 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(5);
72
Artem Titove6f6a0c2019-02-07 12:14:35 +010073 EXPECT_GE(stats.GetPercentile(0.01), 1);
74 EXPECT_LT(stats.GetPercentile(0.01), 2);
75 EXPECT_DOUBLE_EQ(stats.GetPercentile(1.0), 5);
Artem Titove4ed6ea2019-01-11 11:02:19 +010076}
77
78} // namespace webrtc