blob: e6d9f6728ce0b6fd7a863b6e126e9e71ab0c0371 [file] [log] [blame]
Artem Titove4ed6ea2019-01-11 10:02:191/*
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 11:14:3513#include <math.h>
Artem Titove4ed6ea2019-01-11 10:02:1914#include <algorithm>
15#include <vector>
16
17#include "test/gtest.h"
18
19namespace webrtc {
20namespace {
Artem Titove6f6a0c2019-02-07 11:14:3521
Artem Titove4ed6ea2019-01-11 10:02:1922SamplesStatsCounter 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 11:14:3535
Artem Titove4ed6ea2019-01-11 10:02:1936} // namespace
37
38TEST(SamplesStatsCounter, FullSimpleTest) {
39 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(100);
40
Artem Titove6f6a0c2019-02-07 11:14:3541 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 10:02:1945 for (int i = 1; i <= 100; i++) {
46 double p = i / 100.0;
Artem Titove6f6a0c2019-02-07 11:14:3547 EXPECT_GE(stats.GetPercentile(p), i);
48 EXPECT_LT(stats.GetPercentile(p), i + 1);
Artem Titove4ed6ea2019-01-11 10:02:1949 }
50}
51
Artem Titove6f6a0c2019-02-07 11:14:3552TEST(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 10:02:1964TEST(SamplesStatsCounter, FractionPercentile) {
65 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(5);
66
Artem Titove6f6a0c2019-02-07 11:14:3567 EXPECT_DOUBLE_EQ(stats.GetPercentile(0.5), 3);
Artem Titove4ed6ea2019-01-11 10:02:1968}
69
70TEST(SamplesStatsCounter, TestBorderValues) {
71 SamplesStatsCounter stats = CreateStatsFilledWithIntsFrom1ToN(5);
72
Artem Titove6f6a0c2019-02-07 11:14:3573 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 10:02:1976}
77
78} // namespace webrtc