| } | } | ||||
| TEST_CASE("deleter called on destruction", "[ScopeGuard]") | |||||
| TEST_CASE("deleter called on destruction", "[ScopeExit]") | |||||
| { | { | ||||
| REQUIRE_CALL(m, deleter()); | REQUIRE_CALL(m, deleter()); | ||||
| auto guard = sr::make_scope_exit(deleter); | auto guard = sr::make_scope_exit(deleter); | ||||
| static_cast<void>(guard); | static_cast<void>(guard); | ||||
| } | } | ||||
| TEST_CASE("deleter lambda called on destruction", "[ScopeGuard]") | |||||
| TEST_CASE("deleter lambda called on destruction", "[ScopeExit]") | |||||
| { | { | ||||
| CallMock cm; | CallMock cm; | ||||
| REQUIRE_CALL(cm, deleter()); | REQUIRE_CALL(cm, deleter()); | ||||
| static_cast<void>(guard); | static_cast<void>(guard); | ||||
| } | } | ||||
| TEST_CASE("deleter called and rethrow on copy exception", "[ScopeGuard]") | |||||
| TEST_CASE("deleter called and rethrow on copy exception", "[ScopeExit]") | |||||
| { | { | ||||
| REQUIRE_THROWS([] { | REQUIRE_THROWS([] { | ||||
| const ThrowOnCopyMock noMove; | const ThrowOnCopyMock noMove; | ||||
| }()); | }()); | ||||
| } | } | ||||
| TEST_CASE("deleter is not called if released", "[ScopeGuard]") | |||||
| TEST_CASE("deleter is not called if released", "[ScopeExit]") | |||||
| { | { | ||||
| REQUIRE_CALL(m, deleter()).TIMES(0); | REQUIRE_CALL(m, deleter()).TIMES(0); | ||||
| auto guard = sr::make_scope_exit(deleter); | auto guard = sr::make_scope_exit(deleter); | ||||
| guard.release(); | guard.release(); | ||||
| } | } | ||||
| TEST_CASE("move releases moved-from object", "[ScopeGuard]") | |||||
| TEST_CASE("move releases moved-from object", "[ScopeExit]") | |||||
| { | { | ||||
| REQUIRE_CALL(m, deleter()); | REQUIRE_CALL(m, deleter()); | ||||
| auto movedFrom = sr::make_scope_exit(deleter); | auto movedFrom = sr::make_scope_exit(deleter); | ||||
| static_cast<void>(guard); | static_cast<void>(guard); | ||||
| } | } | ||||
| TEST_CASE("move transfers state", "[ScopeGuard]") | |||||
| TEST_CASE("move transfers state", "[ScopeExit]") | |||||
| { | { | ||||
| REQUIRE_CALL(m, deleter()); | REQUIRE_CALL(m, deleter()); | ||||
| auto movedFrom = sr::make_scope_exit(deleter); | auto movedFrom = sr::make_scope_exit(deleter); | ||||
| static_cast<void>(guard); | static_cast<void>(guard); | ||||
| } | } | ||||
| TEST_CASE("move transfers state if released", "[ScopeGuard]") | |||||
| TEST_CASE("move transfers state if released", "[ScopeExit]") | |||||
| { | { | ||||
| REQUIRE_CALL(m, deleter()).TIMES(0); | REQUIRE_CALL(m, deleter()).TIMES(0); | ||||
| auto movedFrom = sr::make_scope_exit(deleter); | auto movedFrom = sr::make_scope_exit(deleter); | ||||
| static_cast<void>(guard); | static_cast<void>(guard); | ||||
| } | } | ||||
| TEST_CASE("no exception propagation from deleter", "[ScopeGuard]") | |||||
| TEST_CASE("no exception propagation from deleter", "[ScopeExit]") | |||||
| { | { | ||||
| REQUIRE_NOTHROW([] { | REQUIRE_NOTHROW([] { | ||||
| auto guard = sr::make_scope_exit([] { throw std::exception{}; }); | auto guard = sr::make_scope_exit([] { throw std::exception{}; }); |