Serenity Operating System
1/*
2 * Copyright (c) 2023, the SerenityOS developers.
3 *
4 * SPDX-License-Identifier: BSD-2-Clause
5 */
6
7#include <AK/Statistics.h>
8#include <LibTest/TestSuite.h>
9
10TEST_CASE(Statistics)
11{
12 // Setup Test Data
13 AK::Statistics<double> odd_number_elements;
14 AK::Statistics<double> even_number_elements;
15 AK::Statistics<double> odd_number_elements_large;
16 AK::Statistics<double> even_number_elements_large;
17
18 odd_number_elements.add(5.0);
19 odd_number_elements.add(4.0);
20 odd_number_elements.add(3.0);
21 odd_number_elements.add(2.0);
22 odd_number_elements.add(1.0);
23
24 even_number_elements.add(6.0);
25 even_number_elements.add(5.0);
26 even_number_elements.add(4.0);
27 even_number_elements.add(3.0);
28 even_number_elements.add(2.0);
29 even_number_elements.add(1.0);
30
31 for (int i = 201; i > 0; i--) {
32 odd_number_elements_large.add(i);
33 }
34
35 for (int i = 360; i > 0; i--) {
36 even_number_elements_large.add(i);
37 }
38
39 // Sum
40 EXPECT_APPROXIMATE(odd_number_elements.sum(), 15.0);
41 EXPECT_APPROXIMATE(even_number_elements.sum(), 21.0);
42
43 // Average
44 EXPECT_APPROXIMATE(odd_number_elements.average(), 3.0);
45 EXPECT_APPROXIMATE(even_number_elements.average(), 3.5);
46
47 // Min
48 EXPECT_APPROXIMATE(odd_number_elements.min(), 1.0);
49 EXPECT_APPROXIMATE(even_number_elements.min(), 1.0);
50
51 // Max
52 EXPECT_APPROXIMATE(odd_number_elements.max(), 5.0);
53 EXPECT_APPROXIMATE(even_number_elements.max(), 6.0);
54
55 // Median
56 EXPECT_APPROXIMATE(odd_number_elements.median(), 3.0);
57 EXPECT_APPROXIMATE(even_number_elements.median(), 3.5);
58 EXPECT_APPROXIMATE(odd_number_elements_large.median(), 101.0);
59 EXPECT_APPROXIMATE(even_number_elements_large.median(), 180.5);
60
61 // The expected values for standard deviation and variance were calculated by my school issued scientific calculator
62
63 // Standard Deviation
64 EXPECT_APPROXIMATE(odd_number_elements.standard_deviation(), 1.4142135623731);
65 EXPECT_APPROXIMATE(even_number_elements.standard_deviation(), 1.7078251276599);
66
67 // Variance
68 EXPECT_APPROXIMATE(odd_number_elements.variance(), 2.0);
69 EXPECT_APPROXIMATE(even_number_elements.variance(), 2.9166666666667);
70}