|
1 | 1 | #include <cmath>
|
2 | 2 | #include <limits>
|
| 3 | +#include <vector> |
3 | 4 |
|
4 | 5 | #include "catch2/catch_test_macros.hpp"
|
5 | 6 | #include "catch2/catch_approx.hpp"
|
@@ -62,46 +63,62 @@ TEST_CASE("Median", "[vtr_math]") {
|
62 | 63 | // Check the median of a vector with a singular value.
|
63 | 64 | std::vector<double> single_vec = {1.0};
|
64 | 65 | REQUIRE(vtr::median(single_vec) == 1.0);
|
| 66 | + REQUIRE(vtr::median_presorted(single_vec) == 1.0); |
65 | 67 |
|
66 | 68 | // Check the median of a vector with two elements.
|
67 | 69 | std::vector<double> double_vec = {1.0, 2.0};
|
68 | 70 | REQUIRE(vtr::median(double_vec) == 1.5);
|
| 71 | + REQUIRE(vtr::median_presorted(double_vec) == 1.5); |
69 | 72 |
|
70 | 73 | // Check the median of a vector with an odd length.
|
71 | 74 | std::vector<double> odd_vec = {1.0, 2.0, 3.0, 4.0, 5.0};
|
72 | 75 | REQUIRE(vtr::median(odd_vec) == 3.0);
|
| 76 | + REQUIRE(vtr::median_presorted(odd_vec) == 3.0); |
73 | 77 |
|
74 | 78 | // Check the median of a vector with a median length.
|
75 | 79 | std::vector<double> even_vec = {1.0, 2.0, 3.0, 4.0};
|
76 | 80 | REQUIRE(vtr::median(even_vec) == 2.5);
|
77 | 81 |
|
| 82 | + // Check unsorted list gives correct median. |
| 83 | + std::vector<double> unsorted_odd_vec = {2.0, 3.0, 1.0, 5.0, 4.0}; |
| 84 | + REQUIRE(vtr::median(unsorted_odd_vec) == 3.0); |
| 85 | + std::vector<double> unsorted_even_vec = {2.0, 3.0, 1.0, 4.0}; |
| 86 | + REQUIRE(vtr::median(unsorted_even_vec) == 2.5); |
| 87 | + |
78 | 88 | // Check the median of a negative, odd-lengthed vector works.
|
79 | 89 | std::vector<double> negative_odd_vec = {-1.0, -2.0, -3.0, -4.0, -5.0};
|
80 | 90 | REQUIRE(vtr::median(negative_odd_vec) == -3.0);
|
| 91 | + REQUIRE(vtr::median_presorted(negative_odd_vec) == -3.0); |
81 | 92 |
|
82 | 93 | // Check the median of a negative, even-lengthed vector works.
|
83 | 94 | std::vector<double> negative_even_vec = {-1.0, -2.0, -3.0, -4.0};
|
84 | 95 | REQUIRE(vtr::median(negative_even_vec) == -2.5);
|
| 96 | + REQUIRE(vtr::median_presorted(negative_even_vec) == -2.5); |
85 | 97 |
|
86 | 98 | // Check the median of an fp vector with an odd length.
|
87 | 99 | std::vector<float> fp_odd_vec = {1.0f, 2.0f, 3.0f, 4.0f, 5.0f};
|
88 | 100 | REQUIRE(vtr::median(fp_odd_vec) == 3.0);
|
89 | 101 | REQUIRE(vtr::median<float>(fp_odd_vec) == 3.0f);
|
| 102 | + REQUIRE(vtr::median_presorted<float>(fp_odd_vec) == 3.0f); |
90 | 103 |
|
91 | 104 | // Check the median of an fp vector with a median length.
|
92 | 105 | std::vector<float> fp_even_vec = {1.0f, 2.0f, 3.0f, 4.0f};
|
93 | 106 | REQUIRE(vtr::median(fp_even_vec) == 2.5);
|
94 | 107 | REQUIRE(vtr::median<float>(fp_even_vec) == 2.5f);
|
| 108 | + REQUIRE(vtr::median_presorted<float>(fp_even_vec) == 2.5f); |
95 | 109 |
|
96 | 110 | // Check the median of an integral, odd-lengthed vecor.
|
97 | 111 | std::vector<int> int_vec_odd = {1, 2, 3, 4, 5};
|
98 | 112 | REQUIRE(vtr::median(int_vec_odd) == 3.0);
|
| 113 | + REQUIRE(vtr::median_presorted(int_vec_odd) == 3.0); |
99 | 114 |
|
100 | 115 | // Check the median of an integral, even-lengthed vecor.
|
101 | 116 | std::vector<int> int_vec_even = {1, 2, 3, 4};
|
102 | 117 | REQUIRE(vtr::median(int_vec_even) == 2.5);
|
| 118 | + REQUIRE(vtr::median_presorted(int_vec_even) == 2.5); |
103 | 119 |
|
104 | 120 | // Check that trying to get the median of an empty vector returns a NaN.
|
105 | 121 | std::vector<double> empty_vec;
|
106 | 122 | REQUIRE(std::isnan(vtr::median(empty_vec)));
|
| 123 | + REQUIRE(std::isnan(vtr::median_presorted(empty_vec))); |
107 | 124 | }
|
0 commit comments