#include "catch.hpp" /* Demonstrate which version of toString/StringMaker is being used for various types */ struct has_operator { }; struct has_maker {}; struct has_maker_and_operator {}; std::ostream& operator<<(std::ostream& os, const has_operator&) { os << "operator<<( has_operator )"; return os; } std::ostream& operator<<(std::ostream& os, const has_maker_and_operator&) { os << "operator<<( has_maker_and_operator )"; return os; } namespace Catch { template<> struct StringMaker { std::string operator()( const has_maker& ) { return "StringMaker"; } }; template<> struct StringMaker { std::string operator()( const has_maker_and_operator& ) { return "StringMaker"; } }; } // Call the operator TEST_CASE( "stringify( has_operator )", "[toString]" ) { has_operator item; REQUIRE( ::Catch::Detail::stringify( item ) == "operator<<( has_operator )" ); } // Call the stringmaker TEST_CASE( "stringify( has_maker )", "[toString]" ) { has_maker item; REQUIRE( ::Catch::Detail::stringify( item ) == "StringMaker" ); } // Call the stringmaker TEST_CASE( "stringify( has_maker_and_toString )", "[.][toString]" ) { has_maker_and_operator item; REQUIRE( ::Catch::Detail::stringify( item ) == "StringMaker" ); } // Vectors... // Don't run this in approval tests as it is sensitive to two phase lookup differences TEST_CASE( "toString( vectors v(1); REQUIRE( ::Catch::Detail::stringify( v ) == "{ operator<<( has_operator ) }" ); } TEST_CASE( "toString( vectors v(1); REQUIRE( ::Catch::Detail::stringify( v ) == "{ StringMaker }" ); } // Don't run this in approval tests as it is sensitive to two phase lookup differences TEST_CASE( "toString( vectors v(1); REQUIRE( ::Catch::Detail::stringify( v ) == "{ StringMaker }" ); }