mirror of
https://github.com/catchorg/Catch2.git
synced 2024-12-29 14:13:31 +01:00
33ed1773f4
Now the order of stringification checks is 1) StringMaker specialization 2) operator<< toString overloads and specializations have been removed.
74 lines
2.2 KiB
C++
74 lines
2.2 KiB
C++
#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<has_maker> {
|
|
std::string operator()( const has_maker& ) {
|
|
return "StringMaker<has_maker>";
|
|
}
|
|
};
|
|
template<>
|
|
struct StringMaker<has_maker_and_operator> {
|
|
std::string operator()( const has_maker_and_operator& ) {
|
|
return "StringMaker<has_maker_and_operator>";
|
|
}
|
|
};
|
|
}
|
|
|
|
// 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<has_maker>" );
|
|
}
|
|
|
|
// Call the stringmaker
|
|
TEST_CASE( "stringify( has_maker_and_toString )", "[.][toString]" ) {
|
|
has_maker_and_operator item;
|
|
REQUIRE( ::Catch::Detail::stringify( item ) == "StringMaker<has_maker_and_operator>" );
|
|
}
|
|
|
|
// 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_operator> v(1);
|
|
REQUIRE( ::Catch::Detail::stringify( v ) == "{ operator<<( has_operator ) }" );
|
|
}
|
|
|
|
TEST_CASE( "toString( vectors<has_maker )", "[toString]" ) {
|
|
std::vector<has_maker> v(1);
|
|
REQUIRE( ::Catch::Detail::stringify( 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_operator> v(1);
|
|
REQUIRE( ::Catch::Detail::stringify( v ) == "{ StringMaker<has_maker_and_toString> }" );
|
|
}
|