To check out this repository please hg clone the following URL, or open the URL using EasyMercurial or your preferred Mercurial client.

The primary repository for this project is hosted at https://github.com/cannam/constant-q-cpp/ .
This repository is a read-only copy which is updated automatically every hour.

Statistics Download as Zip
| Branch: | Revision:

root / test / TestMathUtilities.cpp

History | View | Annotate | Download (5.63 KB)

1
/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
2

    
3
#include "dsp/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.0);
129
    BOOST_CHECK_EQUAL(MathUtilities::factorial(0), 1.0);
130
    BOOST_CHECK_EQUAL(MathUtilities::factorial(1), 1.0);
131
    BOOST_CHECK_EQUAL(MathUtilities::factorial(2), 2.0);
132
    BOOST_CHECK_EQUAL(MathUtilities::factorial(3), 6.0);
133
    BOOST_CHECK_EQUAL(MathUtilities::factorial(4), 24.0);
134

    
135
    // Too big for an int, hence double return value from factorial
136
    BOOST_CHECK_EQUAL(MathUtilities::factorial(20), 2432902008176640000.0);
137
}
138

    
139
BOOST_AUTO_TEST_CASE(gcd)
140
{
141
    BOOST_CHECK_EQUAL(MathUtilities::gcd(1, 1), 1);
142
    BOOST_CHECK_EQUAL(MathUtilities::gcd(2, 1), 1);
143
    BOOST_CHECK_EQUAL(MathUtilities::gcd(2, 3), 1);
144
    BOOST_CHECK_EQUAL(MathUtilities::gcd(4, 2), 2);
145
    BOOST_CHECK_EQUAL(MathUtilities::gcd(18, 24), 6);
146
    BOOST_CHECK_EQUAL(MathUtilities::gcd(27, 18), 9);
147
    BOOST_CHECK_EQUAL(MathUtilities::gcd(18, 36), 18);
148
    BOOST_CHECK_EQUAL(MathUtilities::gcd(37, 18), 1);
149
}
150

    
151
BOOST_AUTO_TEST_SUITE_END()
152

    
153