2011-05-23 17:18:52 +10:00
|
|
|
#include <cstdlib>
|
|
|
|
#include <limits>
|
|
|
|
|
|
|
|
#include "../debug.hpp"
|
|
|
|
#include "../range.hpp"
|
|
|
|
|
|
|
|
using namespace std;
|
2011-08-29 14:40:05 +10:00
|
|
|
using namespace util;
|
2011-05-23 17:18:52 +10:00
|
|
|
|
|
|
|
int
|
|
|
|
main (int, char **) {
|
2012-06-15 16:38:10 +10:00
|
|
|
// Check some simple cases close to the edges of a unit range. Tests float rounding.
|
2012-05-11 12:34:21 +10:00
|
|
|
CHECK_HARD ( range<double>::UNIT.contains ( 0.0));
|
|
|
|
CHECK_HARD ( range<double>::UNIT.contains ( 0.5));
|
|
|
|
CHECK_HARD ( range<double>::UNIT.contains ( 1.0));
|
2012-06-15 16:38:10 +10:00
|
|
|
CHECK_HARD ( range<double>::UNIT.contains (std::numeric_limits<double>::min ()));
|
2012-05-11 12:34:21 +10:00
|
|
|
CHECK_HARD (!range<double>::UNIT.contains (-0.00001));
|
|
|
|
CHECK_HARD (!range<double>::UNIT.contains ( 1.00001));
|
2011-05-23 17:18:52 +10:00
|
|
|
|
2012-06-15 16:38:10 +10:00
|
|
|
// Check edge cases of unit with integer values
|
2012-05-11 12:34:21 +10:00
|
|
|
CHECK_HARD ( range<uint16_t>::UNIT.contains (0));
|
|
|
|
CHECK_HARD ( range<uint16_t>::UNIT.contains (1));
|
|
|
|
CHECK_HARD (!range<uint16_t>::UNIT.contains (2));
|
|
|
|
CHECK_HARD (!range<uint16_t>::UNIT.contains (numeric_limits <uint16_t>::max ()));
|
2011-05-23 17:18:52 +10:00
|
|
|
|
2012-06-15 16:38:10 +10:00
|
|
|
// Check the inclusivity of UNLIMITED with special floating values
|
2012-05-11 12:34:21 +10:00
|
|
|
CHECK_HARD ( range<double>::UNLIMITED.contains (0.0));
|
|
|
|
CHECK_HARD ( range<double>::UNLIMITED.contains (+numeric_limits<double>::infinity ()));
|
|
|
|
CHECK_HARD ( range<double>::UNLIMITED.contains (-numeric_limits<double>::infinity ()));
|
|
|
|
CHECK_HARD (!range<double>::UNLIMITED.contains ( numeric_limits<double>::quiet_NaN ()));
|
2011-05-23 17:18:52 +10:00
|
|
|
|
2012-06-15 16:38:10 +10:00
|
|
|
// Check the inclusivity of UNLIMITED with some large numbers
|
2012-05-11 12:34:21 +10:00
|
|
|
CHECK_HARD ( range<uint16_t>::UNLIMITED.contains (numeric_limits<uint16_t>::min()));
|
|
|
|
CHECK_HARD ( range<uint16_t>::UNLIMITED.contains (numeric_limits<uint16_t>::max()));
|
2012-05-23 20:41:11 +10:00
|
|
|
|
2012-06-15 16:38:10 +10:00
|
|
|
// Check inclusivity of MAX
|
|
|
|
CHECK_HARD (!range<double>::MAX.contains ( numeric_limits<double>::infinity ()));
|
|
|
|
CHECK_HARD (!range<double>::MAX.contains (-numeric_limits<double>::infinity ()));
|
|
|
|
|
|
|
|
CHECK_HARD ( range<uint16_t>::MAX.contains (numeric_limits<uint16_t>::min()));
|
|
|
|
CHECK_HARD ( range<uint16_t>::MAX.contains (numeric_limits<uint16_t>::max()));
|
|
|
|
|
|
|
|
// Check that expansion via NaN is a noop
|
2012-05-23 20:41:11 +10:00
|
|
|
{
|
|
|
|
range<double> initial_nan (numeric_limits<double>::quiet_NaN (),
|
|
|
|
numeric_limits<double>::quiet_NaN ());
|
|
|
|
initial_nan.expand (1.0);
|
|
|
|
CHECK_EQ (initial_nan.min, 1.0);
|
|
|
|
CHECK_EQ (initial_nan.max, 1.0);
|
|
|
|
}
|
|
|
|
|
2011-05-23 17:18:52 +10:00
|
|
|
return EXIT_SUCCESS;
|
|
|
|
}
|
|
|
|
|