test/unittest.hpp in rice-4.0.4 vs test/unittest.hpp in rice-4.1.0

- old
+ new

@@ -212,10 +212,16 @@ return !is_equal(t, u); } extern size_t assertions; +template<typename S, typename T, typename = void> +struct is_streamable: std::false_type {}; + +template<typename S, typename T> +struct is_streamable<S, T, std::void_t<decltype(std::declval<S&>()<<std::declval<T>())>>: std::true_type {}; + template<typename T, typename U> void assert_equal( T const & t, U const & u, std::string const & s_t, @@ -224,13 +230,16 @@ size_t line) { if(!is_equal(t, u)) { std::stringstream strm; - strm << "Assertion failed: " - << s_t << " != " << s_u - << " (" << t << " != " << u << ")" - << " at " << file << ":" << line; + strm << "Assertion failed: "; + + if constexpr (is_streamable<std::stringstream, T>::value && is_streamable<std::stringstream, U>::value) + { + strm << s_t << " != " << s_u; + } + strm << " at " << file << ":" << line; throw Assertion_Failed(strm.str()); } } template<typename T, typename U>