Skip to content

Commit

Permalink
Added comprehensive tests for non-trivial destructor calls
Browse files Browse the repository at this point in the history
  • Loading branch information
K-ballo committed Jan 6, 2016
1 parent e6581d0 commit f9bcaf3
Show file tree
Hide file tree
Showing 9 changed files with 235 additions and 53 deletions.
36 changes: 32 additions & 4 deletions test/assign.conversion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,20 @@ TEST_CASE("variant<Ts...>::operator=(T&&)", "[variant.assign]")
CHECK(v.target_type() == typeid(int));
#endif

// dtor
{
eggs::variant<int, Dtor> v(eggs::variants::in_place<Dtor>);

REQUIRE(v.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v = Dtor();

CHECK(v.which() == 1u);
CHECK(Dtor::calls == 1u);
}
Dtor::calls = 0u;

#if EGGS_CXX14_HAS_CONSTEXPR
// constexpr
{
Expand All @@ -88,7 +102,7 @@ TEST_CASE("variant<Ts...>::operator=(T&&)", "[variant.assign]")

// different target
{
eggs::variant<int, std::string> v(std::string{""});
eggs::variant<int, std::string> v(std::string(""));

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 1u);
Expand All @@ -105,6 +119,20 @@ TEST_CASE("variant<Ts...>::operator=(T&&)", "[variant.assign]")
CHECK(v.target_type() == typeid(int));
#endif

// dtor
{
eggs::variant<int, Dtor> v(eggs::variants::in_place<Dtor>);

REQUIRE(v.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v = 42;

CHECK(v.which() == 0u);
CHECK(Dtor::calls == 1u);
}
Dtor::calls = 0u;

#if EGGS_CXX98_HAS_EXCEPTIONS
// exception-safety
{
Expand All @@ -113,15 +141,15 @@ TEST_CASE("variant<Ts...>::operator=(T&&)", "[variant.assign]")

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 0u);
REQUIRE(Dtor::called == false);
REQUIRE(Dtor::calls == 0u);

CHECK_THROWS(v = Throw{});

CHECK(bool(v) == false);
CHECK(v.which() == npos);
CHECK(Dtor::called == true);
CHECK(Dtor::calls == 1u);
}
Dtor::called = false;
Dtor::calls = 0u;
#endif

#if EGGS_CXX14_HAS_CONSTEXPR
Expand Down
56 changes: 52 additions & 4 deletions test/assign.copy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,22 @@ TEST_CASE("variant<Ts...>::operator=(variant<Ts...> const&)", "[variant.assign]"
CHECK(bool(v2) == false);
CHECK(v2.which() == v1.which());

// dtor
{
eggs::variant<int, Dtor> const v1;
eggs::variant<int, Dtor> v2(eggs::variants::in_place<Dtor>);

REQUIRE(v1.which() == npos);
REQUIRE(v2.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v2 = v1;

CHECK(v2.which() == npos);
CHECK(Dtor::calls == 1u);
}
Dtor::calls = 0u;

#if EGGS_CXX14_HAS_CONSTEXPR
// constexpr
{
Expand Down Expand Up @@ -116,6 +132,22 @@ TEST_CASE("variant<Ts...>::operator=(variant<Ts...> const&)", "[variant.assign]"
REQUIRE(v2.target<int>() != nullptr);
CHECK(*v2.target<int>() == 42);

// dtor
{
eggs::variant<int, Dtor> const v1(eggs::variants::in_place<Dtor>);
eggs::variant<int, Dtor> v2(eggs::variants::in_place<Dtor>);

REQUIRE(v1.which() == 1u);
REQUIRE(v2.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v2 = v1;

CHECK(v2.which() == 1u);
CHECK(Dtor::calls == 0u);
}
Dtor::calls = 0u;

#if EGGS_CXX14_HAS_CONSTEXPR
// constexpr
{
Expand All @@ -139,7 +171,7 @@ TEST_CASE("variant<Ts...>::operator=(variant<Ts...> const&)", "[variant.assign]"
REQUIRE(v1.which() == 0u);
REQUIRE(*v1.target<int>() == 42);

eggs::variant<int, std::string> v2(std::string{""});
eggs::variant<int, std::string> v2(std::string(""));

REQUIRE(bool(v2) == true);
REQUIRE(v2.which() == 1u);
Expand All @@ -154,6 +186,22 @@ TEST_CASE("variant<Ts...>::operator=(variant<Ts...> const&)", "[variant.assign]"
REQUIRE(v2.target<int>() != nullptr);
CHECK(*v2.target<int>() == 42);

// dtor
{
eggs::variant<int, Dtor> const v1(42);
eggs::variant<int, Dtor> v2(eggs::variants::in_place<Dtor>);

REQUIRE(v1.which() == 0u);
REQUIRE(v2.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v2 = v1;

CHECK(v2.which() == 0u);
CHECK(Dtor::calls == 1u);
}
Dtor::calls = 0u;

#if EGGS_CXX98_HAS_EXCEPTIONS
// exception-safety
{
Expand All @@ -167,17 +215,17 @@ TEST_CASE("variant<Ts...>::operator=(variant<Ts...> const&)", "[variant.assign]"

REQUIRE(bool(v2) == true);
REQUIRE(v2.which() == 0u);
REQUIRE(Dtor::called == false);
REQUIRE(Dtor::calls == 0u);

CHECK_THROWS(v2 = v1);

CHECK(bool(v1) == true);
CHECK(bool(v2) == false);
CHECK(v1.which() == 1u);
CHECK(v2.which() == npos);
CHECK(Dtor::called == true);
CHECK(Dtor::calls == 1u);
}
Dtor::called = false;
Dtor::calls = 0u;
#endif

#if EGGS_CXX14_HAS_CONSTEXPR
Expand Down
88 changes: 72 additions & 16 deletions test/assign.emplace.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,20 @@ TEST_CASE("variant<Ts...>::emplace<I>(Args&&...)", "[variant.assign]")
CHECK(v.target_type() == typeid(int));
#endif

// dtor
{
eggs::variant<int, Dtor> v(eggs::variants::in_place<Dtor>);

REQUIRE(v.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v.emplace<1>();

CHECK(v.which() == 1u);
CHECK(Dtor::calls == 1u);
}
Dtor::calls = 0u;

#if EGGS_CXX14_HAS_CONSTEXPR
// constexpr
{
Expand All @@ -88,7 +102,7 @@ TEST_CASE("variant<Ts...>::emplace<I>(Args&&...)", "[variant.assign]")

// different target
{
eggs::variant<int, std::string> v(std::string{""});
eggs::variant<int, std::string> v(std::string(""));

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 1u);
Expand All @@ -105,6 +119,20 @@ TEST_CASE("variant<Ts...>::emplace<I>(Args&&...)", "[variant.assign]")
CHECK(v.target_type() == typeid(int));
#endif

// dtor
{
eggs::variant<int, Dtor> v(eggs::variants::in_place<Dtor>);

REQUIRE(v.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v.emplace<0>(42);

CHECK(v.which() == 0u);
CHECK(Dtor::calls == 1u);
}
Dtor::calls = 0u;

#if EGGS_CXX98_HAS_EXCEPTIONS
// exception-safety
{
Expand All @@ -113,15 +141,15 @@ TEST_CASE("variant<Ts...>::emplace<I>(Args&&...)", "[variant.assign]")

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 0u);
REQUIRE(Dtor::called == false);
REQUIRE(Dtor::calls == 0u);

CHECK_THROWS(v.emplace<1>(0));

CHECK(bool(v) == false);
CHECK(v.which() == npos);
CHECK(Dtor::called == true);
CHECK(Dtor::calls == 1u);
}
Dtor::called = false;
Dtor::calls = 0u;
#endif

#if EGGS_CXX14_HAS_CONSTEXPR
Expand Down Expand Up @@ -194,7 +222,7 @@ TEST_CASE("variant<Ts...>::emplace<I>(std::initializer_list<U>, Args&&...)", "[v

// same target
{
eggs::variant<int, std::string> v(std::string{""});
eggs::variant<int, std::string> v(std::string(""));

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 1u);
Expand Down Expand Up @@ -252,15 +280,15 @@ TEST_CASE("variant<Ts...>::emplace<I>(std::initializer_list<U>, Args&&...)", "[v

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 0u);
REQUIRE(Dtor::called == false);
REQUIRE(Dtor::calls == 0u);

CHECK_THROWS(v.emplace<1>({0}));

CHECK(bool(v) == false);
CHECK(v.which() == npos);
CHECK(Dtor::called == true);
CHECK(Dtor::calls == 1u);
}
Dtor::called = false;
Dtor::calls = 0u;
#endif

#if EGGS_CXX14_HAS_CONSTEXPR
Expand Down Expand Up @@ -351,6 +379,20 @@ TEST_CASE("variant<Ts...>::emplace<T>(Args&&...)", "[variant.assign]")
CHECK(v.target_type() == typeid(int));
#endif

// dtor
{
eggs::variant<int, Dtor> v(eggs::variants::in_place<Dtor>);

REQUIRE(v.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v.emplace<Dtor>();

CHECK(v.which() == 1u);
CHECK(Dtor::calls == 1u);
}
Dtor::calls = 0u;

#if EGGS_CXX14_HAS_CONSTEXPR
// constexpr
{
Expand All @@ -367,7 +409,7 @@ TEST_CASE("variant<Ts...>::emplace<T>(Args&&...)", "[variant.assign]")

// different target
{
eggs::variant<int, std::string> v(std::string{""});
eggs::variant<int, std::string> v(std::string(""));

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 1u);
Expand All @@ -384,6 +426,20 @@ TEST_CASE("variant<Ts...>::emplace<T>(Args&&...)", "[variant.assign]")
CHECK(v.target_type() == typeid(int));
#endif

// dtor
{
eggs::variant<int, Dtor> v(eggs::variants::in_place<Dtor>);

REQUIRE(v.which() == 1u);
REQUIRE(Dtor::calls == 0u);

v.emplace<int>(42);

CHECK(v.which() == 0u);
CHECK(Dtor::calls == 1u);
}
Dtor::calls = 0u;

#if EGGS_CXX98_HAS_EXCEPTIONS
// exception-safety
{
Expand All @@ -392,15 +448,15 @@ TEST_CASE("variant<Ts...>::emplace<T>(Args&&...)", "[variant.assign]")

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 0u);
REQUIRE(Dtor::called == false);
REQUIRE(Dtor::calls == 0u);

CHECK_THROWS(v.emplace<Throw>(0));

CHECK(bool(v) == false);
CHECK(v.which() == npos);
CHECK(Dtor::called == true);
CHECK(Dtor::calls == 1u);
}
Dtor::called = false;
Dtor::calls = 0u;
#endif

#if EGGS_CXX14_HAS_CONSTEXPR
Expand Down Expand Up @@ -455,7 +511,7 @@ TEST_CASE("variant<Ts...>::emplace<T>(std::initializer_list<U>, Args&&...)", "[v

// same target
{
eggs::variant<int, std::string> v(std::string{""});
eggs::variant<int, std::string> v(std::string(""));

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 1u);
Expand Down Expand Up @@ -513,15 +569,15 @@ TEST_CASE("variant<Ts...>::emplace<T>(std::initializer_list<U>, Args&&...)", "[v

REQUIRE(bool(v) == true);
REQUIRE(v.which() == 0u);
REQUIRE(Dtor::called == false);
REQUIRE(Dtor::calls == 0u);

CHECK_THROWS(v.emplace<Throw>({0}));

CHECK(bool(v) == false);
CHECK(v.which() == npos);
CHECK(Dtor::called == true);
CHECK(Dtor::calls == 1u);
}
Dtor::called = false;
Dtor::calls = 0u;
#endif

#if EGGS_CXX14_HAS_CONSTEXPR
Expand Down
Loading

0 comments on commit f9bcaf3

Please sign in to comment.