blob: 520867f2cdbf2cc0925cc67992d155eb867fa3a9 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
#include <catch2/catch.hpp>
#include <vcpkg/base/optional.h>
#include <vcpkg/base/util.h>
#include <vector>
namespace
{
struct identity_projection
{
template<class T>
const T& operator()(const T& val) noexcept
{
return val;
}
};
}
TEST_CASE ("equal", "[optional]")
{
using vcpkg::Optional;
CHECK(Optional<int>{} == Optional<int>{});
CHECK_FALSE(Optional<int>{} == Optional<int>{42});
CHECK_FALSE(Optional<int>{42} == Optional<int>{});
CHECK_FALSE(Optional<int>{1729} == Optional<int>{42});
CHECK(Optional<int>{42} == Optional<int>{42});
}
TEST_CASE ("ref conversion", "[optional]")
{
using vcpkg::Optional;
Optional<int> i_empty;
Optional<int> i_1 = 1;
const Optional<int> ci_1 = 1;
Optional<int&> ref_empty = i_empty;
Optional<const int&> cref_empty = i_empty;
Optional<int&> ref_1 = i_1;
Optional<const int&> cref_1 = ci_1;
REQUIRE(ref_empty.has_value() == false);
REQUIRE(cref_empty.has_value() == false);
REQUIRE(ref_1.get() == i_1.get());
REQUIRE(cref_1.get() == ci_1.get());
ref_empty = i_1;
cref_empty = ci_1;
REQUIRE(ref_empty.get() == i_1.get());
REQUIRE(cref_empty.get() == ci_1.get());
const int x = 5;
cref_1 = x;
REQUIRE(cref_1.get() == &x);
}
TEST_CASE ("value conversion", "[optional]")
{
using vcpkg::Optional;
Optional<long> j = 1;
Optional<int> i = j;
Optional<const char*> cstr = "hello, world!";
Optional<std::string> cppstr = cstr;
std::vector<int> v{1, 2, 3};
Optional<std::vector<int>&> o_v(v);
REQUIRE(o_v.has_value());
REQUIRE(o_v.get()->size() == 3);
Optional<std::vector<int>> o_w(std::move(o_v));
REQUIRE(o_w.has_value());
REQUIRE(o_w.get()->size() == 3);
// Moving from Optional<&> should not move the underlying object
REQUIRE(o_v.has_value());
REQUIRE(o_v.get()->size() == 3);
}
TEST_CASE ("common_projection", "[optional]")
{
using vcpkg::Util::common_projection;
std::vector<int> input;
CHECK(!common_projection(input, identity_projection{}).has_value());
input.push_back(42);
CHECK(common_projection(input, identity_projection{}).value_or_exit(VCPKG_LINE_INFO) == 42);
input.push_back(42);
CHECK(common_projection(input, identity_projection{}).value_or_exit(VCPKG_LINE_INFO) == 42);
input.push_back(1729);
CHECK(!common_projection(input, identity_projection{}).has_value());
}
|