aboutsummaryrefslogtreecommitdiff
path: root/projects/SelfTest/ToStringWhich.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'projects/SelfTest/ToStringWhich.cpp')
-rw-r--r--projects/SelfTest/ToStringWhich.cpp68
1 files changed, 68 insertions, 0 deletions
diff --git a/projects/SelfTest/ToStringWhich.cpp b/projects/SelfTest/ToStringWhich.cpp
new file mode 100644
index 0000000..1d4aa89
--- /dev/null
+++ b/projects/SelfTest/ToStringWhich.cpp
@@ -0,0 +1,68 @@
+#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...
+TEST_CASE( "toString( vectors<has_toString )", "[toString]" ) {
+ 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> }" );
+}
+
+
+TEST_CASE( "toString( vectors<has_maker_and_toString )", "[toString]" ) {
+ 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> }" );
+}