Mercurial > hg > qm-dsp
comparison tests/TestMedianFilter.cpp @ 407:f898c901c055
Fix handling of NaNs in MedianFilter, & test for it
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Mon, 23 Feb 2015 10:42:54 +0000 |
parents | e7010b8eb0c6 |
children | 2de6184b2ce0 |
comparison
equal
deleted
inserted
replaced
406:ebde9a50bb74 | 407:f898c901c055 |
---|---|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ | 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ |
2 | 2 |
3 #include "maths/MedianFilter.h" | 3 #include "maths/MedianFilter.h" |
4 | 4 |
5 #include <cmath> | 5 #include <cmath> |
6 #include <cstdlib> | |
6 | 7 |
7 #define BOOST_TEST_DYN_LINK | 8 #define BOOST_TEST_DYN_LINK |
8 #define BOOST_TEST_MAIN | 9 #define BOOST_TEST_MAIN |
9 | 10 |
10 #include <boost/test/unit_test.hpp> | 11 #include <boost/test/unit_test.hpp> |
169 BOOST_CHECK_EQUAL(ifilt.get(), 1); | 170 BOOST_CHECK_EQUAL(ifilt.get(), 1); |
170 ifilt.push(1000); | 171 ifilt.push(1000); |
171 BOOST_CHECK_EQUAL(ifilt.get(), 2); | 172 BOOST_CHECK_EQUAL(ifilt.get(), 2); |
172 } | 173 } |
173 | 174 |
175 BOOST_AUTO_TEST_CASE(inf) | |
176 { | |
177 // Inf and -Inf should behave normally | |
178 double pinf = strtod("Inf", 0); | |
179 double ninf = strtod("-Inf", 0); | |
180 MedianFilter<double> dfilt(3); | |
181 dfilt.push(1.0); | |
182 dfilt.push(2.0); | |
183 dfilt.push(pinf); | |
184 BOOST_CHECK_EQUAL(dfilt.get(), 2.0); | |
185 dfilt.push(pinf); | |
186 BOOST_CHECK_EQUAL(dfilt.get(), pinf); | |
187 dfilt.push(pinf); | |
188 BOOST_CHECK_EQUAL(dfilt.get(), pinf); | |
189 dfilt.push(2.0); | |
190 BOOST_CHECK_EQUAL(dfilt.get(), pinf); | |
191 dfilt.push(1.0); | |
192 BOOST_CHECK_EQUAL(dfilt.get(), 2.0); | |
193 dfilt.push(ninf); | |
194 BOOST_CHECK_EQUAL(dfilt.get(), 1.0); | |
195 dfilt.push(pinf); | |
196 BOOST_CHECK_EQUAL(dfilt.get(), 1.0); | |
197 dfilt.push(ninf); | |
198 BOOST_CHECK_EQUAL(dfilt.get(), ninf); | |
199 } | |
200 | |
201 BOOST_AUTO_TEST_CASE(nan) | |
202 { | |
203 // The filter should never accept a NaN, because it breaks sorting | |
204 // and comparison and that will break the filter. Instead it | |
205 // should insert 0. | |
206 double nan = strtod("NaN", 0); | |
207 MedianFilter<double> dfilt(3); | |
208 dfilt.push(1.0); | |
209 dfilt.push(2.0); | |
210 dfilt.push(nan); | |
211 BOOST_CHECK_EQUAL(dfilt.get(), 1.0); | |
212 dfilt.push(nan); | |
213 BOOST_CHECK_EQUAL(dfilt.get(), 0.0); | |
214 dfilt.push(-11.0); | |
215 BOOST_CHECK_EQUAL(dfilt.get(), 0.0); | |
216 dfilt.push(-1.0); | |
217 BOOST_CHECK_EQUAL(dfilt.get(), -1.0); | |
218 } | |
219 | |
174 BOOST_AUTO_TEST_SUITE_END() | 220 BOOST_AUTO_TEST_SUITE_END() |
175 | 221 |
176 | 222 |