mirror of https://github.com/procxx/kepka.git
186 lines
3.9 KiB
C++
186 lines
3.9 KiB
C++
#include "catch.hpp"
|
|
|
|
#include <mapbox/variant.hpp>
|
|
#include <mapbox/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);
|
|
}
|
|
|
|
SECTION("Multiple recurssive wrappers of polymorphic types")
|
|
{
|
|
// https://github.com/mapbox/variant/issues/146
|
|
// (Visual Studio 2015 update 3)
|
|
using namespace mapbox::util;
|
|
struct Base;
|
|
struct Derived;
|
|
using Variant = variant<recursive_wrapper<Base>, recursive_wrapper<Derived>>;
|
|
struct Base { };
|
|
struct Derived : public Base { };
|
|
{
|
|
Base base;
|
|
Derived derived;
|
|
Variant v;
|
|
v = base;
|
|
v = derived; // compile error prior https://github.com/mapbox/variant/pull/147
|
|
CHECK(v.is<Derived>());
|
|
}
|
|
{
|
|
Derived derived;
|
|
Variant v(derived); // compile error prior https://github.com/mapbox/variant/pull/147
|
|
CHECK(v.is<Derived>());
|
|
}
|
|
|
|
|
|
}
|
|
}
|