Chris@123
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@123
|
2
|
Chris@123
|
3 #include "maths/MathUtilities.h"
|
Chris@123
|
4
|
Chris@123
|
5 #include <cmath>
|
Chris@123
|
6
|
Chris@123
|
7 #define BOOST_TEST_DYN_LINK
|
Chris@123
|
8 #define BOOST_TEST_MAIN
|
Chris@123
|
9
|
Chris@123
|
10 #include <boost/test/unit_test.hpp>
|
Chris@123
|
11
|
Chris@123
|
12 BOOST_AUTO_TEST_SUITE(TestMathUtilities)
|
Chris@123
|
13
|
Chris@123
|
14 BOOST_AUTO_TEST_CASE(round)
|
Chris@123
|
15 {
|
Chris@123
|
16 BOOST_CHECK_EQUAL(MathUtilities::round(0.5), 1.0);
|
Chris@123
|
17 BOOST_CHECK_EQUAL(MathUtilities::round(0.49), 0.0);
|
Chris@123
|
18 BOOST_CHECK_EQUAL(MathUtilities::round(0.99), 1.0);
|
Chris@123
|
19 BOOST_CHECK_EQUAL(MathUtilities::round(0.01), 0.0);
|
Chris@123
|
20 BOOST_CHECK_EQUAL(MathUtilities::round(0.0), 0.0);
|
Chris@123
|
21 BOOST_CHECK_EQUAL(MathUtilities::round(100.0), 100.0);
|
Chris@123
|
22 BOOST_CHECK_EQUAL(MathUtilities::round(-0.2), 0.0);
|
Chris@123
|
23 BOOST_CHECK_EQUAL(MathUtilities::round(-0.5), -1.0);
|
Chris@123
|
24 BOOST_CHECK_EQUAL(MathUtilities::round(-0.99), -1.0);
|
Chris@123
|
25 BOOST_CHECK_EQUAL(MathUtilities::round(-1.0), -1.0);
|
Chris@123
|
26 BOOST_CHECK_EQUAL(MathUtilities::round(-1.1), -1.0);
|
Chris@123
|
27 BOOST_CHECK_EQUAL(MathUtilities::round(-1.5), -2.0);
|
Chris@123
|
28 }
|
Chris@123
|
29
|
Chris@123
|
30 BOOST_AUTO_TEST_CASE(mean)
|
Chris@123
|
31 {
|
Chris@123
|
32 BOOST_CHECK_EQUAL(MathUtilities::mean(0, 0), 0);
|
Chris@123
|
33 double d0[] = { 0, 4, 3, -1 };
|
Chris@123
|
34 BOOST_CHECK_EQUAL(MathUtilities::mean(d0, 4), 1.5);
|
Chris@123
|
35 double d1[] = { -2.6 };
|
Chris@123
|
36 BOOST_CHECK_EQUAL(MathUtilities::mean(d1, 1), -2.6);
|
Chris@123
|
37 std::vector<double> v;
|
Chris@123
|
38 v.push_back(0);
|
Chris@123
|
39 v.push_back(4);
|
Chris@123
|
40 v.push_back(3);
|
Chris@123
|
41 v.push_back(-1);
|
Chris@123
|
42 BOOST_CHECK_EQUAL(MathUtilities::mean(v, 0, 4), 1.5);
|
Chris@123
|
43 BOOST_CHECK_EQUAL(MathUtilities::mean(v, 1, 2), 3.5);
|
Chris@123
|
44 BOOST_CHECK_EQUAL(MathUtilities::mean(v, 3, 1), -1);
|
Chris@123
|
45 BOOST_CHECK_EQUAL(MathUtilities::mean(v, 3, 0), 0);
|
Chris@123
|
46 }
|
Chris@123
|
47
|
Chris@123
|
48 BOOST_AUTO_TEST_CASE(sum)
|
Chris@123
|
49 {
|
Chris@123
|
50 BOOST_CHECK_EQUAL(MathUtilities::sum(0, 0), 0);
|
Chris@123
|
51 double d0[] = { 0, 4, 3, -1 };
|
Chris@123
|
52 BOOST_CHECK_EQUAL(MathUtilities::sum(d0, 4), 6);
|
Chris@123
|
53 double d1[] = { -2.6 };
|
Chris@123
|
54 BOOST_CHECK_EQUAL(MathUtilities::sum(d1, 1), -2.6);
|
Chris@123
|
55 }
|
Chris@123
|
56
|
Chris@123
|
57 BOOST_AUTO_TEST_CASE(median)
|
Chris@123
|
58 {
|
Chris@123
|
59 BOOST_CHECK_EQUAL(MathUtilities::median(0, 0), 0);
|
Chris@123
|
60 double d0[] = { 0, 4, 3, -1 };
|
Chris@123
|
61 BOOST_CHECK_EQUAL(MathUtilities::median(d0, 4), 1.5);
|
Chris@123
|
62 double d1[] = { 0, 4, 3, -1, -1 };
|
Chris@123
|
63 BOOST_CHECK_EQUAL(MathUtilities::median(d1, 5), 0);
|
Chris@123
|
64 double d2[] = { 1.0, -2.0 };
|
Chris@123
|
65 BOOST_CHECK_EQUAL(MathUtilities::median(d2, 2), -0.5);
|
Chris@123
|
66 double d3[] = { -2.6 };
|
Chris@123
|
67 BOOST_CHECK_EQUAL(MathUtilities::median(d3, 1), -2.6);
|
Chris@123
|
68 }
|
Chris@123
|
69
|
Chris@123
|
70 BOOST_AUTO_TEST_CASE(princarg)
|
Chris@123
|
71 {
|
Chris@123
|
72 BOOST_CHECK_EQUAL(MathUtilities::princarg(M_PI), M_PI);
|
Chris@123
|
73 BOOST_CHECK_EQUAL(MathUtilities::princarg(-M_PI), M_PI);
|
Chris@123
|
74 BOOST_CHECK_EQUAL(MathUtilities::princarg(2 * M_PI), 0.0);
|
Chris@123
|
75 BOOST_CHECK_EQUAL(MathUtilities::princarg(5 * M_PI), M_PI);
|
Chris@123
|
76 BOOST_CHECK_EQUAL(MathUtilities::princarg(1.0), 1.0);
|
Chris@123
|
77 BOOST_CHECK_EQUAL(MathUtilities::princarg(-1.0), -1.0);
|
Chris@123
|
78 BOOST_CHECK_EQUAL(MathUtilities::princarg(-10.0), -10.0 + 4 * M_PI);
|
Chris@123
|
79 }
|
Chris@123
|
80
|
Chris@123
|
81 BOOST_AUTO_TEST_CASE(isPowerOfTwo)
|
Chris@123
|
82 {
|
Chris@123
|
83 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(0), false);
|
Chris@123
|
84 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(1), true);
|
Chris@123
|
85 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(-2), false);
|
Chris@123
|
86 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(2), true);
|
Chris@123
|
87 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(3), false);
|
Chris@123
|
88 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(12), false);
|
Chris@123
|
89 BOOST_CHECK_EQUAL(MathUtilities::isPowerOfTwo(16), true);
|
Chris@123
|
90 }
|
Chris@123
|
91
|
Chris@123
|
92 BOOST_AUTO_TEST_CASE(nextPowerOfTwo)
|
Chris@123
|
93 {
|
Chris@123
|
94 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(0), 1);
|
Chris@123
|
95 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(1), 1);
|
Chris@123
|
96 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(-2), 1);
|
Chris@123
|
97 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(2), 2);
|
Chris@123
|
98 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(3), 4);
|
Chris@123
|
99 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(12), 16);
|
Chris@123
|
100 BOOST_CHECK_EQUAL(MathUtilities::nextPowerOfTwo(16), 16);
|
Chris@123
|
101 }
|
Chris@123
|
102
|
Chris@123
|
103 BOOST_AUTO_TEST_CASE(previousPowerOfTwo)
|
Chris@123
|
104 {
|
Chris@123
|
105 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(0), 1);
|
Chris@123
|
106 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(1), 1);
|
Chris@123
|
107 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(-2), 1);
|
Chris@123
|
108 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(2), 2);
|
Chris@123
|
109 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(3), 2);
|
Chris@123
|
110 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(12), 8);
|
Chris@123
|
111 BOOST_CHECK_EQUAL(MathUtilities::previousPowerOfTwo(16), 16);
|
Chris@123
|
112 }
|
Chris@123
|
113
|
Chris@123
|
114 BOOST_AUTO_TEST_CASE(nearestPowerOfTwo)
|
Chris@123
|
115 {
|
Chris@123
|
116 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(0), 1);
|
Chris@123
|
117 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(1), 1);
|
Chris@123
|
118 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(-2), 1);
|
Chris@123
|
119 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(2), 2);
|
Chris@123
|
120 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(3), 4);
|
Chris@123
|
121 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(11), 8);
|
Chris@123
|
122 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(12), 16);
|
Chris@123
|
123 BOOST_CHECK_EQUAL(MathUtilities::nearestPowerOfTwo(16), 16);
|
Chris@123
|
124 }
|
Chris@123
|
125
|
Chris@123
|
126 BOOST_AUTO_TEST_CASE(factorial)
|
Chris@123
|
127 {
|
Chris@123
|
128 BOOST_CHECK_EQUAL(MathUtilities::factorial(-10), 0);
|
Chris@123
|
129 BOOST_CHECK_EQUAL(MathUtilities::factorial(0), 1);
|
Chris@123
|
130 BOOST_CHECK_EQUAL(MathUtilities::factorial(1), 1);
|
Chris@123
|
131 BOOST_CHECK_EQUAL(MathUtilities::factorial(2), 2);
|
Chris@123
|
132 BOOST_CHECK_EQUAL(MathUtilities::factorial(3), 6);
|
Chris@123
|
133 BOOST_CHECK_EQUAL(MathUtilities::factorial(4), 24);
|
Chris@123
|
134 }
|
Chris@123
|
135
|
Chris@125
|
136 BOOST_AUTO_TEST_CASE(gcd)
|
Chris@125
|
137 {
|
Chris@125
|
138 BOOST_CHECK_EQUAL(MathUtilities::gcd(1, 1), 1);
|
Chris@125
|
139 BOOST_CHECK_EQUAL(MathUtilities::gcd(2, 1), 1);
|
Chris@125
|
140 BOOST_CHECK_EQUAL(MathUtilities::gcd(2, 3), 1);
|
Chris@125
|
141 BOOST_CHECK_EQUAL(MathUtilities::gcd(4, 2), 2);
|
Chris@125
|
142 BOOST_CHECK_EQUAL(MathUtilities::gcd(18, 24), 6);
|
Chris@125
|
143 BOOST_CHECK_EQUAL(MathUtilities::gcd(27, 18), 9);
|
Chris@125
|
144 BOOST_CHECK_EQUAL(MathUtilities::gcd(18, 36), 18);
|
Chris@125
|
145 BOOST_CHECK_EQUAL(MathUtilities::gcd(37, 18), 1);
|
Chris@125
|
146 }
|
Chris@125
|
147
|
Chris@123
|
148 BOOST_AUTO_TEST_SUITE_END()
|
Chris@123
|
149
|
Chris@123
|
150
|