comparison tests/TestMathUtilities.cpp @ 348:50fae18236ee

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