blob: fc87a9770b1d24aa919c75bf1907bda263c1a1da [file] [log] [blame]
Brian Silvermanda861352019-02-02 16:42:28 -08001#include "catch.hpp"
2#include "optional.hpp"
3#include <vector>
4
5struct foo {
6 foo() = default;
7 foo(foo&) = delete;
8 foo(foo&&) {};
9};
10
11TEST_CASE("Constructors", "[constructors]") {
12 tl::optional<int> o1;
13 REQUIRE(!o1);
14
15 tl::optional<int> o2 = tl::nullopt;
16 REQUIRE(!o2);
17
18 tl::optional<int> o3 = 42;
19 REQUIRE(*o3 == 42);
20
21 tl::optional<int> o4 = o3;
22 REQUIRE(*o4 == 42);
23
24 tl::optional<int> o5 = o1;
25 REQUIRE(!o5);
26
27 tl::optional<int> o6 = std::move(o3);
28 REQUIRE(*o6 == 42);
29
30 tl::optional<short> o7 = 42;
31 REQUIRE(*o7 == 42);
32
33 tl::optional<int> o8 = o7;
34 REQUIRE(*o8 == 42);
35
36 tl::optional<int> o9 = std::move(o7);
37 REQUIRE(*o9 == 42);
38
39 {
40 tl::optional<int &> o;
41 REQUIRE(!o);
42
43 tl::optional<int &> oo = o;
44 REQUIRE(!oo);
45 }
46
47 {
48 auto i = 42;
49 tl::optional<int &> o = i;
50 REQUIRE(o);
51 REQUIRE(*o == 42);
52
53 tl::optional<int &> oo = o;
54 REQUIRE(oo);
55 REQUIRE(*oo == 42);
56 }
57
58 std::vector<foo> v;
59 v.emplace_back();
60 tl::optional<std::vector<foo>> ov = std::move(v);
61 REQUIRE(ov->size() == 1);
62}