Mercurial > hg > qm-dsp
diff tests/TestMedianFilter.cpp @ 182:5ec47007b873
Fix handling of NaNs in MedianFilter, & test for it
author | Chris Cannam |
---|---|
date | Mon, 23 Feb 2015 10:42:54 +0000 |
parents | a82362d50144 |
children | 2de6184b2ce0 |
line wrap: on
line diff
--- a/tests/TestMedianFilter.cpp Tue Aug 05 17:12:46 2014 +0100 +++ b/tests/TestMedianFilter.cpp Mon Feb 23 10:42:54 2015 +0000 @@ -3,6 +3,7 @@ #include "maths/MedianFilter.h" #include <cmath> +#include <cstdlib> #define BOOST_TEST_DYN_LINK #define BOOST_TEST_MAIN @@ -171,6 +172,51 @@ BOOST_CHECK_EQUAL(ifilt.get(), 2); } +BOOST_AUTO_TEST_CASE(inf) +{ + // Inf and -Inf should behave normally + double pinf = strtod("Inf", 0); + double ninf = strtod("-Inf", 0); + MedianFilter<double> dfilt(3); + dfilt.push(1.0); + dfilt.push(2.0); + dfilt.push(pinf); + BOOST_CHECK_EQUAL(dfilt.get(), 2.0); + dfilt.push(pinf); + BOOST_CHECK_EQUAL(dfilt.get(), pinf); + dfilt.push(pinf); + BOOST_CHECK_EQUAL(dfilt.get(), pinf); + dfilt.push(2.0); + BOOST_CHECK_EQUAL(dfilt.get(), pinf); + dfilt.push(1.0); + BOOST_CHECK_EQUAL(dfilt.get(), 2.0); + dfilt.push(ninf); + BOOST_CHECK_EQUAL(dfilt.get(), 1.0); + dfilt.push(pinf); + BOOST_CHECK_EQUAL(dfilt.get(), 1.0); + dfilt.push(ninf); + BOOST_CHECK_EQUAL(dfilt.get(), ninf); +} + +BOOST_AUTO_TEST_CASE(nan) +{ + // The filter should never accept a NaN, because it breaks sorting + // and comparison and that will break the filter. Instead it + // should insert 0. + double nan = strtod("NaN", 0); + MedianFilter<double> dfilt(3); + dfilt.push(1.0); + dfilt.push(2.0); + dfilt.push(nan); + BOOST_CHECK_EQUAL(dfilt.get(), 1.0); + dfilt.push(nan); + BOOST_CHECK_EQUAL(dfilt.get(), 0.0); + dfilt.push(-11.0); + BOOST_CHECK_EQUAL(dfilt.get(), 0.0); + dfilt.push(-1.0); + BOOST_CHECK_EQUAL(dfilt.get(), -1.0); +} + BOOST_AUTO_TEST_SUITE_END()