diff --git a/projects/SelfTest/UsageTests/ToStringVariant.tests.cpp b/projects/SelfTest/UsageTests/ToStringVariant.tests.cpp index 62f923f0..86475bd8 100644 --- a/projects/SelfTest/UsageTests/ToStringVariant.tests.cpp +++ b/projects/SelfTest/UsageTests/ToStringVariant.tests.cpp @@ -6,6 +6,18 @@ #include #include +// We need 2 types with non-trivial copies/moves +struct MyType1 { + MyType1() = default; + MyType1(MyType1 const&) { throw 1; } + MyType1& operator=(MyType1 const&) { throw 3; } +}; +struct MyType2 { + MyType2() = default; + MyType2(MyType2 const&) { throw 2; } + MyType2& operator=(MyType2 const&) { throw 4; } +}; + TEST_CASE( "variant", "[toString][variant][approvals]") { using type = std::variant; @@ -26,19 +38,18 @@ TEST_CASE( "variant", "[toString][variant][approvals]") using type = std::variant; CHECK( "0.5f" == ::Catch::Detail::stringify(type{0.5f}) ); CHECK( "0" == ::Catch::Detail::stringify(type{0}) ); - - SECTION("valueless by exception") { - struct sample { - operator int() const { throw 42; } - }; - - type value{1.5f}; - REQUIRE_THROWS_AS( value.emplace(sample{}), int ); - REQUIRE( value.valueless_by_exception() ); - CHECK( "{valueless variant}" == ::Catch::Detail::stringify(value) ); - } } +TEST_CASE( "variant -- valueless-by-exception", "[toString][variant][approvals]" ) { + using type = std::variant; + + type value; + REQUIRE_THROWS_AS(value.emplace(MyType2{}), int); + REQUIRE(value.valueless_by_exception()); + CHECK("{valueless variant}" == ::Catch::Detail::stringify(value)); +} + + TEST_CASE( "variant", "[toString][variant][approvals]") { using type = std::variant; @@ -48,7 +59,7 @@ TEST_CASE( "variant", "[toString][variant][approvals]") TEST_CASE( "variant, string>", "[toString][variant][approvals]") { - using inner = std::variant; + using inner = std::variant; using type = std::variant; CHECK( "0.5f" == ::Catch::Detail::stringify(type{0.5f}) ); CHECK( "0" == ::Catch::Detail::stringify(type{0}) ); @@ -63,7 +74,7 @@ TEST_CASE( "variant, string>", "[toString][variant][approval REQUIRE( std::holds_alternative(value) ); REQUIRE( std::holds_alternative(std::get(value)) ); - REQUIRE_THROWS_AS( std::get<0>(value).emplace(sample{}), int ); + REQUIRE_THROWS_AS( std::get<0>(value).emplace(MyType1{}), int ); // outer variant is still valid and contains inner REQUIRE( std::holds_alternative(value) );