159 lines
3.1 KiB
C++
159 lines
3.1 KiB
C++
|
|
#include "catch.hpp"
|
|
|
|
#include "recursive_wrapper.hpp"
|
|
|
|
#include <type_traits>
|
|
#include <utility>
|
|
|
|
using rwi = mapbox::util::recursive_wrapper<int>;
|
|
using rwp = mapbox::util::recursive_wrapper<std::pair<int, int>>;
|
|
|
|
static_assert(std::is_same<rwi::type, int>::value, "type check failed");
|
|
|
|
TEST_CASE("recursive wrapper of int")
|
|
{
|
|
|
|
SECTION("construct with value")
|
|
{
|
|
rwi a{7};
|
|
|
|
REQUIRE(a.get() == 7);
|
|
REQUIRE(*a.get_pointer() == 7);
|
|
|
|
a = 8;
|
|
REQUIRE(a.get() == 8);
|
|
|
|
rwi b{a};
|
|
REQUIRE(b.get() == 8);
|
|
|
|
rwi c;
|
|
c = b;
|
|
REQUIRE(b.get() == 8);
|
|
REQUIRE(c.get() == 8);
|
|
|
|
c = 9;
|
|
REQUIRE(c.get() == 9);
|
|
|
|
int x = 10;
|
|
c = x;
|
|
REQUIRE(c.get() == 10);
|
|
|
|
b = std::move(c);
|
|
REQUIRE(b.get() == 10);
|
|
}
|
|
|
|
SECTION("construct with const reference")
|
|
{
|
|
int i = 7;
|
|
rwi a{i};
|
|
|
|
REQUIRE(a.get() == 7);
|
|
}
|
|
|
|
SECTION("implicit conversion to reference of underlying type")
|
|
{
|
|
|
|
SECTION("const")
|
|
{
|
|
rwi const a{7};
|
|
REQUIRE(a.get() == 7);
|
|
REQUIRE(*a.get_pointer() == 7);
|
|
|
|
rwi::type const& underlying = a;
|
|
REQUIRE(underlying == 7);
|
|
}
|
|
|
|
SECTION("non const")
|
|
{
|
|
rwi a{7};
|
|
REQUIRE(a.get() == 7);
|
|
REQUIRE(*a.get_pointer() == 7);
|
|
|
|
rwi::type& underlying = a;
|
|
REQUIRE(underlying == 7);
|
|
a = 8;
|
|
REQUIRE(underlying == 8);
|
|
}
|
|
}
|
|
}
|
|
|
|
TEST_CASE("move of recursive wrapper")
|
|
{
|
|
rwi a{1};
|
|
|
|
SECTION("move constructor")
|
|
{
|
|
rwi b{std::move(a)};
|
|
REQUIRE(b.get() == 1);
|
|
}
|
|
|
|
SECTION("operator= on rvalue")
|
|
{
|
|
rwi b{2};
|
|
b = std::move(a);
|
|
REQUIRE(b.get() == 1);
|
|
}
|
|
}
|
|
|
|
TEST_CASE("swap")
|
|
{
|
|
rwi a{1};
|
|
rwi b{2};
|
|
|
|
REQUIRE(a.get() == 1);
|
|
REQUIRE(b.get() == 2);
|
|
|
|
using std::swap;
|
|
swap(a, b);
|
|
|
|
REQUIRE(a.get() == 2);
|
|
REQUIRE(b.get() == 1);
|
|
}
|
|
|
|
TEST_CASE("recursive wrapper of pair<int, int>")
|
|
{
|
|
|
|
SECTION("default constructed")
|
|
{
|
|
rwp a;
|
|
REQUIRE(a.get().first == 0);
|
|
REQUIRE(a.get().second == 0);
|
|
}
|
|
|
|
SECTION("construct with value")
|
|
{
|
|
rwp a{std::make_pair(1, 2)};
|
|
|
|
REQUIRE(a.get().first == 1);
|
|
REQUIRE(a.get().second == 2);
|
|
|
|
REQUIRE(a.get_pointer()->first == 1);
|
|
REQUIRE(a.get_pointer()->second == 2);
|
|
|
|
a = {3, 4};
|
|
REQUIRE(a.get().first == 3);
|
|
REQUIRE(a.get().second == 4);
|
|
|
|
rwp b{a};
|
|
REQUIRE(b.get().first == 3);
|
|
REQUIRE(b.get().second == 4);
|
|
|
|
rwp c;
|
|
c = b;
|
|
REQUIRE(b.get().first == 3);
|
|
REQUIRE(b.get().second == 4);
|
|
REQUIRE(c.get().first == 3);
|
|
REQUIRE(c.get().second == 4);
|
|
|
|
c = {5, 6};
|
|
REQUIRE(c.get().first == 5);
|
|
REQUIRE(c.get().second == 6);
|
|
|
|
b = std::move(c);
|
|
REQUIRE(b.get().first == 5);
|
|
REQUIRE(b.get().second == 6);
|
|
// REQUIRE(c.get_pointer() == nullptr);
|
|
}
|
|
}
|