2011-04-28 09:28:03 +02:00
|
|
|
/*
|
|
|
|
* Created by Phil on 28/04/2011.
|
|
|
|
* Copyright 2011 Two Blue Cubes Ltd. All rights reserved.
|
|
|
|
*
|
|
|
|
* Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
|
|
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "catch.hpp"
|
|
|
|
|
2016-06-10 20:32:33 +02:00
|
|
|
#ifdef __clang__
|
|
|
|
# ifdef __ICC // icpc defines the __clang__ macro
|
|
|
|
# else // __ICC
|
|
|
|
# pragma clang diagnostic ignored "-Wdouble-promotion"
|
|
|
|
# endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
|
2011-04-28 09:28:03 +02:00
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2013-11-19 08:21:03 +01:00
|
|
|
"Some simple comparisons between doubles",
|
|
|
|
"[Approx]"
|
2011-05-24 09:23:02 +02:00
|
|
|
)
|
2011-04-28 09:28:03 +02:00
|
|
|
{
|
|
|
|
double d = 1.23;
|
2015-11-04 19:01:28 +01:00
|
|
|
|
2011-04-28 09:28:03 +02:00
|
|
|
REQUIRE( d == Approx( 1.23 ) );
|
|
|
|
REQUIRE( d != Approx( 1.22 ) );
|
|
|
|
REQUIRE( d != Approx( 1.24 ) );
|
|
|
|
|
|
|
|
REQUIRE( Approx( d ) == 1.23 );
|
|
|
|
REQUIRE( Approx( d ) != 1.22 );
|
|
|
|
REQUIRE( Approx( d ) != 1.24 );
|
|
|
|
}
|
2011-05-24 09:23:02 +02:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2013-11-19 08:21:03 +01:00
|
|
|
"Approximate comparisons with different epsilons",
|
|
|
|
"[Approx]"
|
2011-05-24 09:23:02 +02:00
|
|
|
)
|
|
|
|
{
|
|
|
|
double d = 1.23;
|
2015-11-04 19:01:28 +01:00
|
|
|
|
2011-05-24 09:23:02 +02:00
|
|
|
REQUIRE( d != Approx( 1.231 ) );
|
|
|
|
REQUIRE( d == Approx( 1.231 ).epsilon( 0.1 ) );
|
2011-06-03 19:56:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2013-11-19 08:21:03 +01:00
|
|
|
"Approximate comparisons with floats",
|
|
|
|
"[Approx]"
|
2011-06-03 19:56:47 +02:00
|
|
|
)
|
|
|
|
{
|
|
|
|
REQUIRE( 1.23f == Approx( 1.23f ) );
|
|
|
|
REQUIRE( 0.0f == Approx( 0.0f ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2013-11-19 08:21:03 +01:00
|
|
|
"Approximate comparisons with ints",
|
|
|
|
"[Approx]"
|
2011-06-03 19:56:47 +02:00
|
|
|
)
|
|
|
|
{
|
|
|
|
REQUIRE( 1 == Approx( 1 ) );
|
|
|
|
REQUIRE( 0 == Approx( 0 ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2013-11-19 08:21:03 +01:00
|
|
|
"Approximate comparisons with mixed numeric types",
|
|
|
|
"[Approx]"
|
2011-06-03 19:56:47 +02:00
|
|
|
)
|
|
|
|
{
|
|
|
|
const double dZero = 0;
|
|
|
|
const double dSmall = 0.00001;
|
|
|
|
const double dMedium = 1.234;
|
2015-11-04 19:01:28 +01:00
|
|
|
|
2011-06-03 19:56:47 +02:00
|
|
|
REQUIRE( 1.0f == Approx( 1 ) );
|
|
|
|
REQUIRE( 0 == Approx( dZero) );
|
|
|
|
REQUIRE( 0 == Approx( dSmall ).epsilon( 0.001 ) );
|
|
|
|
REQUIRE( 1.234f == Approx( dMedium ) );
|
|
|
|
REQUIRE( dMedium == Approx( 1.234f ) );
|
2011-05-24 09:23:02 +02:00
|
|
|
}
|
2011-06-06 09:21:21 +02:00
|
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
TEST_CASE
|
|
|
|
(
|
2013-11-19 08:21:03 +01:00
|
|
|
"Use a custom approx",
|
|
|
|
"[Approx][custom]"
|
2011-06-06 09:21:21 +02:00
|
|
|
)
|
|
|
|
{
|
|
|
|
double d = 1.23;
|
2015-11-04 19:01:28 +01:00
|
|
|
|
2011-06-06 09:21:21 +02:00
|
|
|
Approx approx = Approx::custom().epsilon( 0.005 );
|
2015-11-04 19:01:28 +01:00
|
|
|
|
2011-06-06 09:21:21 +02:00
|
|
|
REQUIRE( d == approx( 1.23 ) );
|
|
|
|
REQUIRE( d == approx( 1.22 ) );
|
|
|
|
REQUIRE( d == approx( 1.24 ) );
|
|
|
|
REQUIRE( d != approx( 1.25 ) );
|
2015-11-04 19:01:28 +01:00
|
|
|
|
2011-06-06 09:21:21 +02:00
|
|
|
REQUIRE( approx( d ) == 1.23 );
|
|
|
|
REQUIRE( approx( d ) == 1.22 );
|
|
|
|
REQUIRE( approx( d ) == 1.24 );
|
|
|
|
REQUIRE( approx( d ) != 1.25 );
|
|
|
|
}
|
|
|
|
|
2013-03-04 12:19:15 +01:00
|
|
|
inline double divide( double a, double b ) {
|
|
|
|
return a/b;
|
|
|
|
}
|
|
|
|
|
|
|
|
TEST_CASE( "Approximate PI", "[Approx][PI]" )
|
|
|
|
{
|
|
|
|
REQUIRE( divide( 22, 7 ) == Approx( 3.141 ).epsilon( 0.001 ) );
|
|
|
|
REQUIRE( divide( 22, 7 ) != Approx( 3.141 ).epsilon( 0.0001 ) );
|
|
|
|
}
|