blob: 2f388e7c44500bad2e5cb254dec7e50ba25ec44d [file] [log] [blame]
Brian Silvermanda861352019-02-02 16:42:28 -08001#include "catch.hpp"
2#include "optional.hpp"
3
4TEST_CASE("Relational ops", "[relops]") {
5 tl::optional<int> o1{4};
6 tl::optional<int> o2{42};
7 tl::optional<int> o3{};
8
9 SECTION("self simple") {
10 REQUIRE(!(o1 == o2));
11 REQUIRE(o1 == o1);
12 REQUIRE(o1 != o2);
13 REQUIRE(!(o1 != o1));
14 REQUIRE(o1 < o2);
15 REQUIRE(!(o1 < o1));
16 REQUIRE(!(o1 > o2));
17 REQUIRE(!(o1 > o1));
18 REQUIRE(o1 <= o2);
19 REQUIRE(o1 <= o1);
20 REQUIRE(!(o1 >= o2));
21 REQUIRE(o1 >= o1);
22 }
23
24 SECTION("nullopt simple") {
25 REQUIRE(!(o1 == tl::nullopt));
26 REQUIRE(!(tl::nullopt == o1));
27 REQUIRE(o1 != tl::nullopt);
28 REQUIRE(tl::nullopt != o1);
29 REQUIRE(!(o1 < tl::nullopt));
30 REQUIRE(tl::nullopt < o1);
31 REQUIRE(o1 > tl::nullopt);
32 REQUIRE(!(tl::nullopt > o1));
33 REQUIRE(!(o1 <= tl::nullopt));
34 REQUIRE(tl::nullopt <= o1);
35 REQUIRE(o1 >= tl::nullopt);
36 REQUIRE(!(tl::nullopt >= o1));
37
38 REQUIRE(o3 == tl::nullopt);
39 REQUIRE(tl::nullopt == o3);
40 REQUIRE(!(o3 != tl::nullopt));
41 REQUIRE(!(tl::nullopt != o3));
42 REQUIRE(!(o3 < tl::nullopt));
43 REQUIRE(!(tl::nullopt < o3));
44 REQUIRE(!(o3 > tl::nullopt));
45 REQUIRE(!(tl::nullopt > o3));
46 REQUIRE(o3 <= tl::nullopt);
47 REQUIRE(tl::nullopt <= o3);
48 REQUIRE(o3 >= tl::nullopt);
49 REQUIRE(tl::nullopt >= o3);
50 }
51
52 SECTION("with T simple") {
53 REQUIRE(!(o1 == 1));
54 REQUIRE(!(1 == o1));
55 REQUIRE(o1 != 1);
56 REQUIRE(1 != o1);
57 REQUIRE(!(o1 < 1));
58 REQUIRE(1 < o1);
59 REQUIRE(o1 > 1);
60 REQUIRE(!(1 > o1));
61 REQUIRE(!(o1 <= 1));
62 REQUIRE(1 <= o1);
63 REQUIRE(o1 >= 1);
64 REQUIRE(!(1 >= o1));
65
66 REQUIRE(o1 == 4);
67 REQUIRE(4 == o1);
68 REQUIRE(!(o1 != 4));
69 REQUIRE(!(4 != o1));
70 REQUIRE(!(o1 < 4));
71 REQUIRE(!(4 < o1));
72 REQUIRE(!(o1 > 4));
73 REQUIRE(!(4 > o1));
74 REQUIRE(o1 <= 4);
75 REQUIRE(4 <= o1);
76 REQUIRE(o1 >= 4);
77 REQUIRE(4 >= o1);
78 }
79
80 tl::optional<std::string> o4{"hello"};
81 tl::optional<std::string> o5{"xyz"};
82
83 SECTION("self complex") {
84 REQUIRE(!(o4 == o5));
85 REQUIRE(o4 == o4);
86 REQUIRE(o4 != o5);
87 REQUIRE(!(o4 != o4));
88 REQUIRE(o4 < o5);
89 REQUIRE(!(o4 < o4));
90 REQUIRE(!(o4 > o5));
91 REQUIRE(!(o4 > o4));
92 REQUIRE(o4 <= o5);
93 REQUIRE(o4 <= o4);
94 REQUIRE(!(o4 >= o5));
95 REQUIRE(o4 >= o4);
96 }
97
98 SECTION("nullopt complex") {
99 REQUIRE(!(o4 == tl::nullopt));
100 REQUIRE(!(tl::nullopt == o4));
101 REQUIRE(o4 != tl::nullopt);
102 REQUIRE(tl::nullopt != o4);
103 REQUIRE(!(o4 < tl::nullopt));
104 REQUIRE(tl::nullopt < o4);
105 REQUIRE(o4 > tl::nullopt);
106 REQUIRE(!(tl::nullopt > o4));
107 REQUIRE(!(o4 <= tl::nullopt));
108 REQUIRE(tl::nullopt <= o4);
109 REQUIRE(o4 >= tl::nullopt);
110 REQUIRE(!(tl::nullopt >= o4));
111
112 REQUIRE(o3 == tl::nullopt);
113 REQUIRE(tl::nullopt == o3);
114 REQUIRE(!(o3 != tl::nullopt));
115 REQUIRE(!(tl::nullopt != o3));
116 REQUIRE(!(o3 < tl::nullopt));
117 REQUIRE(!(tl::nullopt < o3));
118 REQUIRE(!(o3 > tl::nullopt));
119 REQUIRE(!(tl::nullopt > o3));
120 REQUIRE(o3 <= tl::nullopt);
121 REQUIRE(tl::nullopt <= o3);
122 REQUIRE(o3 >= tl::nullopt);
123 REQUIRE(tl::nullopt >= o3);
124 }
125
126 SECTION("with T complex") {
127 REQUIRE(!(o4 == "a"));
128 REQUIRE(!("a" == o4));
129 REQUIRE(o4 != "a");
130 REQUIRE("a" != o4);
131 REQUIRE(!(o4 < "a"));
132 REQUIRE("a" < o4);
133 REQUIRE(o4 > "a");
134 REQUIRE(!("a" > o4));
135 REQUIRE(!(o4 <= "a"));
136 REQUIRE("a" <= o4);
137 REQUIRE(o4 >= "a");
138 REQUIRE(!("a" >= o4));
139
140 REQUIRE(o4 == "hello");
141 REQUIRE("hello" == o4);
142 REQUIRE(!(o4 != "hello"));
143 REQUIRE(!("hello" != o4));
144 REQUIRE(!(o4 < "hello"));
145 REQUIRE(!("hello" < o4));
146 REQUIRE(!(o4 > "hello"));
147 REQUIRE(!("hello" > o4));
148 REQUIRE(o4 <= "hello");
149 REQUIRE("hello" <= o4);
150 REQUIRE(o4 >= "hello");
151 REQUIRE("hello" >= o4);
152 }
153}