|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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{}; }); |