From 283e2e6d41b181fd1c35cecd94c7b2f8e853d888 Mon Sep 17 00:00:00 2001 From: Henry Schreiner Date: Mon, 21 May 2018 15:42:40 +0200 Subject: [PATCH] Add float/int literal for Approx --- include/internal/catch_approx.cpp | 16 +++++ include/internal/catch_approx.h | 9 ++- .../Baselines/compact.sw.approved.txt | 8 +++ .../Baselines/console.std.approved.txt | 4 +- .../Baselines/console.sw.approved.txt | 58 ++++++++++++++- .../SelfTest/Baselines/junit.sw.approved.txt | 3 +- .../SelfTest/Baselines/xml.sw.approved.txt | 71 ++++++++++++++++++- projects/SelfTest/UsageTests/Approx.tests.cpp | 16 +++++ 8 files changed, 177 insertions(+), 8 deletions(-) diff --git a/include/internal/catch_approx.cpp b/include/internal/catch_approx.cpp index 20f7b165..efe245cb 100644 --- a/include/internal/catch_approx.cpp +++ b/include/internal/catch_approx.cpp @@ -35,6 +35,13 @@ namespace Detail { return Approx( 0 ); } + Approx Approx::operator-() const { + auto temp(*this); + temp.m_value = -temp.m_value; + return temp; + } + + std::string Approx::toString() const { ReusableStringStream rss; rss << "Approx( " << ::Catch::Detail::stringify( m_value ) << " )"; @@ -49,6 +56,15 @@ 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::convert(Catch::Detail::Approx const& value) { return value.toString(); } diff --git a/include/internal/catch_approx.h b/include/internal/catch_approx.h index 27068872..287e8307 100644 --- a/include/internal/catch_approx.h +++ b/include/internal/catch_approx.h @@ -25,6 +25,8 @@ namespace Detail { static Approx custom(); + Approx operator-() const; + template ::value>::type> Approx operator()( T const& value ) { Approx approx( static_cast(value) ); @@ -121,7 +123,12 @@ namespace Detail { double m_scale; 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<> struct StringMaker { diff --git a/projects/SelfTest/Baselines/compact.sw.approved.txt b/projects/SelfTest/Baselines/compact.sw.approved.txt index 7780a5cc..4386582c 100644 --- a/projects/SelfTest/Baselines/compact.sw.approved.txt +++ b/projects/SelfTest/Baselines/compact.sw.approved.txt @@ -60,6 +60,12 @@ Class.tests.cpp:: failed: s == "world" for: "hello" == "world" Class.tests.cpp:: passed: s == "hello" for: "hello" == "hello" Class.tests.cpp:: failed: m_a == 2 for: 1 == 2 Class.tests.cpp:: passed: m_a == 1 for: 1 == 1 +Approx.tests.cpp:: passed: d == 1.23_a for: 1.23 == Approx( 1.23 ) +Approx.tests.cpp:: passed: d != 1.22_a for: 1.23 != Approx( 1.22 ) +Approx.tests.cpp:: passed: -d == -1.23_a for: -1.23 == Approx( -1.23 ) +Approx.tests.cpp:: passed: d == 1.2_a .epsilon(.1) for: 1.23 == Approx( 1.2 ) +Approx.tests.cpp:: passed: d != 1.2_a .epsilon(.001) for: 1.23 != Approx( 1.2 ) +Approx.tests.cpp:: passed: d == 1_a .epsilon(.3) for: 1.23 == Approx( 1.0 ) Misc.tests.cpp:: passed: with 1 message: 'that's not flying - that's failing in style' Misc.tests.cpp:: failed: explicitly with 1 message: 'to infinity and beyond' Tricky.tests.cpp:: failed: &o1 == &o2 for: 0x == 0x @@ -613,6 +619,8 @@ A string sent to stderr via clog Approx.tests.cpp:: passed: d == Approx( 1.23 ) for: 1.23 == Approx( 1.23 ) Approx.tests.cpp:: passed: d != Approx( 1.22 ) for: 1.23 != Approx( 1.22 ) Approx.tests.cpp:: passed: d != Approx( 1.24 ) for: 1.23 != Approx( 1.24 ) +Approx.tests.cpp:: passed: d == 1.23_a for: 1.23 == Approx( 1.23 ) +Approx.tests.cpp:: passed: d != 1.22_a for: 1.23 != Approx( 1.22 ) Approx.tests.cpp:: passed: Approx( d ) == 1.23 for: Approx( 1.23 ) == 1.23 Approx.tests.cpp:: passed: Approx( d ) != 1.22 for: Approx( 1.23 ) != 1.22 Approx.tests.cpp:: passed: Approx( d ) != 1.24 for: Approx( 1.23 ) != 1.24 diff --git a/projects/SelfTest/Baselines/console.std.approved.txt b/projects/SelfTest/Baselines/console.std.approved.txt index 208b1afd..4c8b5540 100644 --- a/projects/SelfTest/Baselines/console.std.approved.txt +++ b/projects/SelfTest/Baselines/console.std.approved.txt @@ -1096,6 +1096,6 @@ due to unexpected exception with message: Why would you throw a std::string? =============================================================================== -test cases: 207 | 154 passed | 49 failed | 4 failed as expected -assertions: 1073 | 944 passed | 108 failed | 21 failed as expected +test cases: 208 | 155 passed | 49 failed | 4 failed as expected +assertions: 1081 | 952 passed | 108 failed | 21 failed as expected diff --git a/projects/SelfTest/Baselines/console.sw.approved.txt b/projects/SelfTest/Baselines/console.sw.approved.txt index 123abae5..533fba15 100644 --- a/projects/SelfTest/Baselines/console.sw.approved.txt +++ b/projects/SelfTest/Baselines/console.sw.approved.txt @@ -535,6 +535,48 @@ PASSED: with expansion: 1 == 1 +------------------------------------------------------------------------------- +A comparison that uses literals instead of the normal constructor +------------------------------------------------------------------------------- +Approx.tests.cpp: +............................................................................... + +Approx.tests.cpp:: +PASSED: + REQUIRE( d == 1.23_a ) +with expansion: + 1.23 == Approx( 1.23 ) + +Approx.tests.cpp:: +PASSED: + REQUIRE( d != 1.22_a ) +with expansion: + 1.23 != Approx( 1.22 ) + +Approx.tests.cpp:: +PASSED: + REQUIRE( -d == -1.23_a ) +with expansion: + -1.23 == Approx( -1.23 ) + +Approx.tests.cpp:: +PASSED: + REQUIRE( d == 1.2_a .epsilon(.1) ) +with expansion: + 1.23 == Approx( 1.2 ) + +Approx.tests.cpp:: +PASSED: + REQUIRE( d != 1.2_a .epsilon(.001) ) +with expansion: + 1.23 != Approx( 1.2 ) + +Approx.tests.cpp:: +PASSED: + REQUIRE( d == 1_a .epsilon(.3) ) +with expansion: + 1.23 == Approx( 1.0 ) + ------------------------------------------------------------------------------- A couple of nested sections followed by a failure Outer @@ -4860,6 +4902,18 @@ PASSED: with expansion: 1.23 != Approx( 1.24 ) +Approx.tests.cpp:: +PASSED: + REQUIRE( d == 1.23_a ) +with expansion: + 1.23 == Approx( 1.23 ) + +Approx.tests.cpp:: +PASSED: + REQUIRE( d != 1.22_a ) +with expansion: + 1.23 != Approx( 1.22 ) + Approx.tests.cpp:: PASSED: REQUIRE( Approx( d ) == 1.23 ) @@ -9098,6 +9152,6 @@ Misc.tests.cpp:: PASSED: =============================================================================== -test cases: 207 | 141 passed | 62 failed | 4 failed as expected -assertions: 1087 | 944 passed | 122 failed | 21 failed as expected +test cases: 208 | 142 passed | 62 failed | 4 failed as expected +assertions: 1095 | 952 passed | 122 failed | 21 failed as expected diff --git a/projects/SelfTest/Baselines/junit.sw.approved.txt b/projects/SelfTest/Baselines/junit.sw.approved.txt index c5ad4596..fb66299d 100644 --- a/projects/SelfTest/Baselines/junit.sw.approved.txt +++ b/projects/SelfTest/Baselines/junit.sw.approved.txt @@ -1,7 +1,7 @@ - + @@ -81,6 +81,7 @@ Class.tests.cpp: + to infinity and beyond diff --git a/projects/SelfTest/Baselines/xml.sw.approved.txt b/projects/SelfTest/Baselines/xml.sw.approved.txt index 268537cb..449448ce 100644 --- a/projects/SelfTest/Baselines/xml.sw.approved.txt +++ b/projects/SelfTest/Baselines/xml.sw.approved.txt @@ -554,6 +554,57 @@ + + + + d == 1.23_a + + + 1.23 == Approx( 1.23 ) + + + + + d != 1.22_a + + + 1.23 != Approx( 1.22 ) + + + + + -d == -1.23_a + + + -1.23 == Approx( -1.23 ) + + + + + d == 1.2_a .epsilon(.1) + + + 1.23 == Approx( 1.2 ) + + + + + d != 1.2_a .epsilon(.001) + + + 1.23 != Approx( 1.2 ) + + + + + d == 1_a .epsilon(.3) + + + 1.23 == Approx( 1.0 ) + + + +
@@ -5580,6 +5631,22 @@ A string sent to stderr via clog 1.23 != Approx( 1.24 ) + + + d == 1.23_a + + + 1.23 == Approx( 1.23 ) + + + + + d != 1.22_a + + + 1.23 != Approx( 1.22 ) + + Approx( d ) == 1.23 @@ -10024,7 +10091,7 @@ loose text artifact
- + - + diff --git a/projects/SelfTest/UsageTests/Approx.tests.cpp b/projects/SelfTest/UsageTests/Approx.tests.cpp index 5930075d..b95394a0 100644 --- a/projects/SelfTest/UsageTests/Approx.tests.cpp +++ b/projects/SelfTest/UsageTests/Approx.tests.cpp @@ -33,8 +33,21 @@ namespace { namespace ApproxTests { #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]" ) { 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.24 ) ); + REQUIRE( d == 1.23_a ); + REQUIRE( d != 1.22_a ); + REQUIRE( Approx( d ) == 1.23 ); REQUIRE( Approx( d ) != 1.22 ); REQUIRE( Approx( d ) != 1.24 );