blob: 387b0835a8f25e56a7f3406d2e4917236d2ddcb5 [file] [log] [blame]
Brian Silvermanda861352019-02-02 16:42:28 -08001#include "catch.hpp"
2#include "optional.hpp"
3#include <type_traits>
4
5struct foo{
6 int& v() { return i; }
7 int i = 0;
8};
9
10int& x(int& i) { i = 42; return i;}
11
12TEST_CASE("issue 14") {
13 tl::optional<foo> f = foo{};
14 auto v = f.map(&foo::v).map(x);
15 static_assert(std::is_same<decltype(v), tl::optional<int&>>::value, "Must return a reference");
16 REQUIRE(f->i == 42);
17 REQUIRE(*v == 42);
18 REQUIRE((&f->i) == (&*v));
19}
20
21struct fail_on_copy_self {
22 int value;
23 fail_on_copy_self(int v) : value(v) {}
24 fail_on_copy_self(const fail_on_copy_self& other) : value(other.value) {
25 REQUIRE(&other != this);
26 }
27};
28
29TEST_CASE("issue 15") {
30 tl::optional<fail_on_copy_self> o = fail_on_copy_self(42);
31
32 o = o;
33 REQUIRE(o->value == 42);
34}