| #include "catch.hpp" |
| /* |
| Demonstrate which version of toString/StringMaker is being used |
| for various types |
| */ |
| |
| |
| struct has_toString { }; |
| struct has_maker {}; |
| struct has_maker_and_toString {}; |
| |
| namespace Catch { |
| inline std::string toString( const has_toString& ) { |
| return "toString( has_toString )"; |
| } |
| inline std::string toString( const has_maker_and_toString& ) { |
| return "toString( has_maker_and_toString )"; |
| } |
| template<> |
| struct StringMaker<has_maker> { |
| static std::string convert( const has_maker& ) { |
| return "StringMaker<has_maker>"; |
| } |
| }; |
| template<> |
| struct StringMaker<has_maker_and_toString> { |
| static std::string convert( const has_maker_and_toString& ) { |
| return "StringMaker<has_maker_and_toString>"; |
| } |
| }; |
| } |
| |
| // Call the overload |
| TEST_CASE( "toString( has_toString )", "[toString]" ) { |
| has_toString item; |
| REQUIRE( Catch::toString( item ) == "toString( has_toString )" ); |
| } |
| |
| // Call the overload |
| TEST_CASE( "toString( has_maker )", "toString]" ) { |
| has_maker item; |
| REQUIRE( Catch::toString( item ) == "StringMaker<has_maker>" ); |
| } |
| |
| // Call the overload |
| TEST_CASE( "toString( has_maker_and_toString )", "[.][toString]" ) { |
| has_maker_and_toString item; |
| REQUIRE( Catch::toString( item ) == "toString( has_maker_and_toString )" ); |
| } |
| |
| // Vectors... |
| |
| // Don't run this in approval tests as it is sensitive to two phase lookup differences |
| TEST_CASE( "toString( vectors<has_toString )", "[.][toString][!nonportable]" ) { |
| std::vector<has_toString> v(1); |
| // This invokes template<T> toString which actually gives us '{ ? }' |
| REQUIRE( Catch::toString( v ) == "{ {?} }" ); |
| } |
| |
| TEST_CASE( "toString( vectors<has_maker )", "[toString]" ) { |
| std::vector<has_maker> v(1); |
| REQUIRE( Catch::toString( v ) == "{ StringMaker<has_maker> }" ); |
| } |
| |
| |
| // Don't run this in approval tests as it is sensitive to two phase lookup differences |
| TEST_CASE( "toString( vectors<has_maker_and_toString )", "[.][toString][!nonportable]" ) { |
| std::vector<has_maker_and_toString> v(1); |
| // Note: This invokes the template<T> toString -> StringMaker |
| REQUIRE( Catch::toString( v ) == "{ StringMaker<has_maker_and_toString> }" ); |
| } |