mirror of
https://github.com/catchorg/Catch2.git
synced 2024-11-22 05:16:10 +01:00
Add float/int literal for Approx
This commit is contained in:
parent
d6c7392b24
commit
283e2e6d41
@ -35,6 +35,13 @@ namespace Detail {
|
|||||||
return Approx( 0 );
|
return Approx( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Approx Approx::operator-() const {
|
||||||
|
auto temp(*this);
|
||||||
|
temp.m_value = -temp.m_value;
|
||||||
|
return temp;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
std::string Approx::toString() const {
|
std::string Approx::toString() const {
|
||||||
ReusableStringStream rss;
|
ReusableStringStream rss;
|
||||||
rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )";
|
rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )";
|
||||||
@ -49,6 +56,15 @@ namespace Detail {
|
|||||||
|
|
||||||
} // end namespace Detail
|
} // end namespace Detail
|
||||||
|
|
||||||
|
namespace literals {
|
||||||
|
Detail::Approx operator "" _a(long double val) {
|
||||||
|
return Detail::Approx(val);
|
||||||
|
}
|
||||||
|
Detail::Approx operator "" _a(unsigned long long val) {
|
||||||
|
return Detail::Approx(val);
|
||||||
|
}
|
||||||
|
} // end namespace literals
|
||||||
|
|
||||||
std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) {
|
std::string StringMaker<Catch::Detail::Approx>::convert(Catch::Detail::Approx const& value) {
|
||||||
return value.toString();
|
return value.toString();
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,8 @@ namespace Detail {
|
|||||||
|
|
||||||
static Approx custom();
|
static Approx custom();
|
||||||
|
|
||||||
|
Approx operator-() const;
|
||||||
|
|
||||||
template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
|
template <typename T, typename = typename std::enable_if<std::is_constructible<double, T>::value>::type>
|
||||||
Approx operator()( T const& value ) {
|
Approx operator()( T const& value ) {
|
||||||
Approx approx( static_cast<double>(value) );
|
Approx approx( static_cast<double>(value) );
|
||||||
@ -121,7 +123,12 @@ namespace Detail {
|
|||||||
double m_scale;
|
double m_scale;
|
||||||
double m_value;
|
double m_value;
|
||||||
};
|
};
|
||||||
}
|
} // end namespace Detail
|
||||||
|
|
||||||
|
namespace literals {
|
||||||
|
Detail::Approx operator "" _a(long double val);
|
||||||
|
Detail::Approx operator "" _a(unsigned long long val);
|
||||||
|
} // end namespace literals
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
struct StringMaker<Catch::Detail::Approx> {
|
struct StringMaker<Catch::Detail::Approx> {
|
||||||
|
@ -60,6 +60,12 @@ Class.tests.cpp:<line number>: failed: s == "world" for: "hello" == "world"
|
|||||||
Class.tests.cpp:<line number>: passed: s == "hello" for: "hello" == "hello"
|
Class.tests.cpp:<line number>: passed: s == "hello" for: "hello" == "hello"
|
||||||
Class.tests.cpp:<line number>: failed: m_a == 2 for: 1 == 2
|
Class.tests.cpp:<line number>: failed: m_a == 2 for: 1 == 2
|
||||||
Class.tests.cpp:<line number>: passed: m_a == 1 for: 1 == 1
|
Class.tests.cpp:<line number>: passed: m_a == 1 for: 1 == 1
|
||||||
|
Approx.tests.cpp:<line number>: passed: d == 1.23_a for: 1.23 == Approx( 1.23 )
|
||||||
|
Approx.tests.cpp:<line number>: passed: d != 1.22_a for: 1.23 != Approx( 1.22 )
|
||||||
|
Approx.tests.cpp:<line number>: passed: -d == -1.23_a for: -1.23 == Approx( -1.23 )
|
||||||
|
Approx.tests.cpp:<line number>: passed: d == 1.2_a .epsilon(.1) for: 1.23 == Approx( 1.2 )
|
||||||
|
Approx.tests.cpp:<line number>: passed: d != 1.2_a .epsilon(.001) for: 1.23 != Approx( 1.2 )
|
||||||
|
Approx.tests.cpp:<line number>: passed: d == 1_a .epsilon(.3) for: 1.23 == Approx( 1.0 )
|
||||||
Misc.tests.cpp:<line number>: passed: with 1 message: 'that's not flying - that's failing in style'
|
Misc.tests.cpp:<line number>: passed: with 1 message: 'that's not flying - that's failing in style'
|
||||||
Misc.tests.cpp:<line number>: failed: explicitly with 1 message: 'to infinity and beyond'
|
Misc.tests.cpp:<line number>: failed: explicitly with 1 message: 'to infinity and beyond'
|
||||||
Tricky.tests.cpp:<line number>: failed: &o1 == &o2 for: 0x<hex digits> == 0x<hex digits>
|
Tricky.tests.cpp:<line number>: failed: &o1 == &o2 for: 0x<hex digits> == 0x<hex digits>
|
||||||
@ -613,6 +619,8 @@ A string sent to stderr via clog
|
|||||||
Approx.tests.cpp:<line number>: passed: d == Approx( 1.23 ) for: 1.23 == Approx( 1.23 )
|
Approx.tests.cpp:<line number>: passed: d == Approx( 1.23 ) for: 1.23 == Approx( 1.23 )
|
||||||
Approx.tests.cpp:<line number>: passed: d != Approx( 1.22 ) for: 1.23 != Approx( 1.22 )
|
Approx.tests.cpp:<line number>: passed: d != Approx( 1.22 ) for: 1.23 != Approx( 1.22 )
|
||||||
Approx.tests.cpp:<line number>: passed: d != Approx( 1.24 ) for: 1.23 != Approx( 1.24 )
|
Approx.tests.cpp:<line number>: passed: d != Approx( 1.24 ) for: 1.23 != Approx( 1.24 )
|
||||||
|
Approx.tests.cpp:<line number>: passed: d == 1.23_a for: 1.23 == Approx( 1.23 )
|
||||||
|
Approx.tests.cpp:<line number>: passed: d != 1.22_a for: 1.23 != Approx( 1.22 )
|
||||||
Approx.tests.cpp:<line number>: passed: Approx( d ) == 1.23 for: Approx( 1.23 ) == 1.23
|
Approx.tests.cpp:<line number>: passed: Approx( d ) == 1.23 for: Approx( 1.23 ) == 1.23
|
||||||
Approx.tests.cpp:<line number>: passed: Approx( d ) != 1.22 for: Approx( 1.23 ) != 1.22
|
Approx.tests.cpp:<line number>: passed: Approx( d ) != 1.22 for: Approx( 1.23 ) != 1.22
|
||||||
Approx.tests.cpp:<line number>: passed: Approx( d ) != 1.24 for: Approx( 1.23 ) != 1.24
|
Approx.tests.cpp:<line number>: passed: Approx( d ) != 1.24 for: Approx( 1.23 ) != 1.24
|
||||||
|
@ -1096,6 +1096,6 @@ due to unexpected exception with message:
|
|||||||
Why would you throw a std::string?
|
Why would you throw a std::string?
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 207 | 154 passed | 49 failed | 4 failed as expected
|
test cases: 208 | 155 passed | 49 failed | 4 failed as expected
|
||||||
assertions: 1073 | 944 passed | 108 failed | 21 failed as expected
|
assertions: 1081 | 952 passed | 108 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -535,6 +535,48 @@ PASSED:
|
|||||||
with expansion:
|
with expansion:
|
||||||
1 == 1
|
1 == 1
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
A comparison that uses literals instead of the normal constructor
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Approx.tests.cpp:<line number>
|
||||||
|
...............................................................................
|
||||||
|
|
||||||
|
Approx.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( d == 1.23_a )
|
||||||
|
with expansion:
|
||||||
|
1.23 == Approx( 1.23 )
|
||||||
|
|
||||||
|
Approx.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( d != 1.22_a )
|
||||||
|
with expansion:
|
||||||
|
1.23 != Approx( 1.22 )
|
||||||
|
|
||||||
|
Approx.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( -d == -1.23_a )
|
||||||
|
with expansion:
|
||||||
|
-1.23 == Approx( -1.23 )
|
||||||
|
|
||||||
|
Approx.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( d == 1.2_a .epsilon(.1) )
|
||||||
|
with expansion:
|
||||||
|
1.23 == Approx( 1.2 )
|
||||||
|
|
||||||
|
Approx.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( d != 1.2_a .epsilon(.001) )
|
||||||
|
with expansion:
|
||||||
|
1.23 != Approx( 1.2 )
|
||||||
|
|
||||||
|
Approx.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( d == 1_a .epsilon(.3) )
|
||||||
|
with expansion:
|
||||||
|
1.23 == Approx( 1.0 )
|
||||||
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
A couple of nested sections followed by a failure
|
A couple of nested sections followed by a failure
|
||||||
Outer
|
Outer
|
||||||
@ -4860,6 +4902,18 @@ PASSED:
|
|||||||
with expansion:
|
with expansion:
|
||||||
1.23 != Approx( 1.24 )
|
1.23 != Approx( 1.24 )
|
||||||
|
|
||||||
|
Approx.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( d == 1.23_a )
|
||||||
|
with expansion:
|
||||||
|
1.23 == Approx( 1.23 )
|
||||||
|
|
||||||
|
Approx.tests.cpp:<line number>:
|
||||||
|
PASSED:
|
||||||
|
REQUIRE( d != 1.22_a )
|
||||||
|
with expansion:
|
||||||
|
1.23 != Approx( 1.22 )
|
||||||
|
|
||||||
Approx.tests.cpp:<line number>:
|
Approx.tests.cpp:<line number>:
|
||||||
PASSED:
|
PASSED:
|
||||||
REQUIRE( Approx( d ) == 1.23 )
|
REQUIRE( Approx( d ) == 1.23 )
|
||||||
@ -9098,6 +9152,6 @@ Misc.tests.cpp:<line number>:
|
|||||||
PASSED:
|
PASSED:
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
test cases: 207 | 141 passed | 62 failed | 4 failed as expected
|
test cases: 208 | 142 passed | 62 failed | 4 failed as expected
|
||||||
assertions: 1087 | 944 passed | 122 failed | 21 failed as expected
|
assertions: 1095 | 952 passed | 122 failed | 21 failed as expected
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<testsuitesloose text artifact
|
<testsuitesloose text artifact
|
||||||
>
|
>
|
||||||
<testsuite name="<exe-name>" errors="17" failures="106" tests="1088" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
<testsuite name="<exe-name>" errors="17" failures="106" tests="1096" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}">
|
||||||
<testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
|
<testcase classname="<exe-name>.global" name="#1027" time="{duration}"/>
|
||||||
@ -81,6 +81,7 @@ Class.tests.cpp:<line number>
|
|||||||
</failure>
|
</failure>
|
||||||
</testcase>
|
</testcase>
|
||||||
<testcase classname="<exe-name>.Fixture" name="A TEST_CASE_METHOD based test run that succeeds" time="{duration}"/>
|
<testcase classname="<exe-name>.Fixture" name="A TEST_CASE_METHOD based test run that succeeds" time="{duration}"/>
|
||||||
|
<testcase classname="<exe-name>.global" name="A comparison that uses literals instead of the normal constructor" time="{duration}"/>
|
||||||
<testcase classname="<exe-name>.global" name="A couple of nested sections followed by a failure" time="{duration}">
|
<testcase classname="<exe-name>.global" name="A couple of nested sections followed by a failure" time="{duration}">
|
||||||
<failure type="FAIL">
|
<failure type="FAIL">
|
||||||
to infinity and beyond
|
to infinity and beyond
|
||||||
|
@ -554,6 +554,57 @@
|
|||||||
</Expression>
|
</Expression>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
|
<TestCase name="A comparison that uses literals instead of the normal constructor" tags="[Approx]" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
d == 1.23_a
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
1.23 == Approx( 1.23 )
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
d != 1.22_a
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
1.23 != Approx( 1.22 )
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
-d == -1.23_a
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
-1.23 == Approx( -1.23 )
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
d == 1.2_a .epsilon(.1)
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
1.23 == Approx( 1.2 )
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
d != 1.2_a .epsilon(.001)
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
1.23 != Approx( 1.2 )
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
d == 1_a .epsilon(.3)
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
1.23 == Approx( 1.0 )
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<OverallResult success="true"/>
|
||||||
|
</TestCase>
|
||||||
<TestCase name="A couple of nested sections followed by a failure" tags="[.][failing]" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
|
<TestCase name="A couple of nested sections followed by a failure" tags="[.][failing]" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
|
||||||
<Section name="Outer" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
|
<Section name="Outer" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
|
||||||
<Section name="Inner" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
|
<Section name="Inner" filename="projects/<exe-name>/UsageTests/Misc.tests.cpp" >
|
||||||
@ -5580,6 +5631,22 @@ A string sent to stderr via clog
|
|||||||
1.23 != Approx( 1.24 )
|
1.23 != Approx( 1.24 )
|
||||||
</Expanded>
|
</Expanded>
|
||||||
</Expression>
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
d == 1.23_a
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
1.23 == Approx( 1.23 )
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
|
<Original>
|
||||||
|
d != 1.22_a
|
||||||
|
</Original>
|
||||||
|
<Expanded>
|
||||||
|
1.23 != Approx( 1.22 )
|
||||||
|
</Expanded>
|
||||||
|
</Expression>
|
||||||
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
<Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" >
|
||||||
<Original>
|
<Original>
|
||||||
Approx( d ) == 1.23
|
Approx( d ) == 1.23
|
||||||
@ -10024,7 +10091,7 @@ loose text artifact
|
|||||||
</Section>
|
</Section>
|
||||||
<OverallResult success="true"/>
|
<OverallResult success="true"/>
|
||||||
</TestCase>
|
</TestCase>
|
||||||
<OverallResults successes="944" failures="123" expectedFailures="21"/>
|
<OverallResults successes="952" failures="123" expectedFailures="21"/>
|
||||||
</Group>
|
</Group>
|
||||||
<OverallResults successes="944" failures="122" expectedFailures="21"/>
|
<OverallResults successes="952" failures="122" expectedFailures="21"/>
|
||||||
</Catch>
|
</Catch>
|
||||||
|
@ -33,8 +33,21 @@ namespace { namespace ApproxTests {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
using namespace Catch::literals;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
TEST_CASE( "A comparison that uses literals instead of the normal constructor", "[Approx]" ) {
|
||||||
|
double d = 1.23;
|
||||||
|
|
||||||
|
REQUIRE( d == 1.23_a );
|
||||||
|
REQUIRE( d != 1.22_a );
|
||||||
|
REQUIRE( -d == -1.23_a );
|
||||||
|
|
||||||
|
REQUIRE( d == 1.2_a .epsilon(.1) );
|
||||||
|
REQUIRE( d != 1.2_a .epsilon(.001) );
|
||||||
|
REQUIRE( d == 1_a .epsilon(.3) );
|
||||||
|
}
|
||||||
|
|
||||||
TEST_CASE( "Some simple comparisons between doubles", "[Approx]" ) {
|
TEST_CASE( "Some simple comparisons between doubles", "[Approx]" ) {
|
||||||
double d = 1.23;
|
double d = 1.23;
|
||||||
|
|
||||||
@ -42,6 +55,9 @@ TEST_CASE( "Some simple comparisons between doubles", "[Approx]" ) {
|
|||||||
REQUIRE( d != Approx( 1.22 ) );
|
REQUIRE( d != Approx( 1.22 ) );
|
||||||
REQUIRE( d != Approx( 1.24 ) );
|
REQUIRE( d != Approx( 1.24 ) );
|
||||||
|
|
||||||
|
REQUIRE( d == 1.23_a );
|
||||||
|
REQUIRE( d != 1.22_a );
|
||||||
|
|
||||||
REQUIRE( Approx( d ) == 1.23 );
|
REQUIRE( Approx( d ) == 1.23 );
|
||||||
REQUIRE( Approx( d ) != 1.22 );
|
REQUIRE( Approx( d ) != 1.22 );
|
||||||
REQUIRE( Approx( d ) != 1.24 );
|
REQUIRE( Approx( d ) != 1.24 );
|
||||||
|
Loading…
Reference in New Issue
Block a user