Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(229)

Side by Side Diff: webrtc/base/optional_unittest.cc

Issue 2071003003: Imported Optional from Chromium with some modifications. Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Added an empty member to the OptionalStorage union, to make the union always initializable. Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/base/optional.h ('k') | webrtc/base/template_util.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 * Copyright 2015 The WebRTC Project Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be
3 * 3 // found in the LICENSE file.
4 * Use of this source code is governed by a BSD-style license 4
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11 #include <memory>
12 #include <sstream>
13 #include <string>
14 #include <utility>
15 #include <vector>
16
17 #include "webrtc/base/gunit.h"
18 #include "webrtc/base/optional.h" 5 #include "webrtc/base/optional.h"
19 6
7 #include <set>
8
9 #include "testing/gtest/include/gtest/gtest.h"
10
20 namespace rtc { 11 namespace rtc {
21 12
22 namespace { 13 namespace {
23 14
24 // Class whose instances logs various method calls (constructor, destructor, 15 // Object used to test complex object with Optional<T> in addition of the move
25 // etc.). Each instance has a unique ID (a simple global sequence number) and 16 // semantics.
26 // an origin ID. When a copy is made, the new object gets a fresh ID but copies 17 class TestObject {
27 // the origin ID from the original. When a new Logger is created from scratch,
28 // it gets a fresh ID, and the origin ID is the same as the ID (default
29 // constructor) or given as an argument (explicit constructor).
30 class Logger {
31 public: 18 public:
32 Logger() : id_(g_next_id++), origin_(id_) { Log("default constructor"); } 19 enum class State {
33 explicit Logger(int origin) : id_(g_next_id++), origin_(origin) { 20 DEFAULT_CONSTRUCTED,
34 Log("explicit constructor"); 21 VALUE_CONSTRUCTED,
35 } 22 COPY_CONSTRUCTED,
36 Logger(const Logger& other) : id_(g_next_id++), origin_(other.origin_) { 23 MOVE_CONSTRUCTED,
37 LogFrom("copy constructor", other); 24 MOVED_FROM,
38 } 25 COPY_ASSIGNED,
39 Logger(Logger&& other) : id_(g_next_id++), origin_(other.origin_) { 26 MOVE_ASSIGNED,
40 LogFrom("move constructor", other); 27 SWAPPED,
41 } 28 };
42 ~Logger() { Log("destructor"); } 29
43 Logger& operator=(const Logger& other) { 30 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
44 origin_ = other.origin_; 31
45 LogFrom("operator= copy", other); 32 TestObject(int foo, double bar)
33 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
34
35 TestObject(const TestObject& other)
36 : foo_(other.foo_), bar_(other.bar_), state_(State::COPY_CONSTRUCTED) {}
37
38 TestObject(TestObject&& other)
39 : foo_(std::move(other.foo_)),
40 bar_(std::move(other.bar_)),
41 state_(State::MOVE_CONSTRUCTED) {
42 other.state_ = State::MOVED_FROM;
43 }
44
45 TestObject& operator=(const TestObject& other) {
46 foo_ = other.foo_;
47 bar_ = other.bar_;
48 state_ = State::COPY_ASSIGNED;
46 return *this; 49 return *this;
47 } 50 }
48 Logger& operator=(Logger&& other) { 51
49 origin_ = other.origin_; 52 TestObject& operator=(TestObject&& other) {
50 LogFrom("operator= move", other); 53 foo_ = other.foo_;
54 bar_ = other.bar_;
55 state_ = State::MOVE_ASSIGNED;
56 other.state_ = State::MOVED_FROM;
51 return *this; 57 return *this;
52 } 58 }
53 friend void swap(Logger& a, Logger& b) { 59
60 void Swap(TestObject* other) {
54 using std::swap; 61 using std::swap;
55 swap(a.origin_, b.origin_); 62 swap(foo_, other->foo_);
56 Log2("swap", a, b); 63 swap(bar_, other->bar_);
57 } 64 state_ = State::SWAPPED;
58 friend bool operator==(const Logger& a, const Logger& b) { 65 other->state_ = State::SWAPPED;
59 Log2("operator==", a, b); 66 }
60 return a.origin_ == b.origin_; 67
61 } 68 bool operator==(const TestObject& other) const {
62 friend bool operator!=(const Logger& a, const Logger& b) { 69 return foo_ == other.foo_ && bar_ == other.bar_;
63 Log2("operator!=", a, b); 70 }
64 return a.origin_ != b.origin_; 71
65 } 72 int foo() const { return foo_; }
66 void Foo() { Log("Foo()"); } 73 State state() const { return state_; }
67 void Foo() const { Log("Foo() const"); }
68 static std::unique_ptr<std::vector<std::string>> Setup() {
69 std::unique_ptr<std::vector<std::string>> s(new std::vector<std::string>);
70 g_log = s.get();
71 g_next_id = 0;
72 return s;
73 }
74 74
75 private: 75 private:
76 int id_; 76 int foo_;
77 int origin_; 77 double bar_;
78 static std::vector<std::string>* g_log; 78 State state_;
79 static int g_next_id;
80 void Log(const char* msg) const {
81 std::ostringstream oss;
82 oss << id_ << ':' << origin_ << ". " << msg;
83 g_log->push_back(oss.str());
84 }
85 void LogFrom(const char* msg, const Logger& other) const {
86 std::ostringstream oss;
87 oss << id_ << ':' << origin_ << ". " << msg << " (from " << other.id_ << ':'
88 << other.origin_ << ")";
89 g_log->push_back(oss.str());
90 }
91 static void Log2(const char* msg, const Logger& a, const Logger& b) {
92 std::ostringstream oss;
93 oss << msg << ' ' << a.id_ << ':' << a.origin_ << ", " << b.id_ << ':'
94 << b.origin_;
95 g_log->push_back(oss.str());
96 }
97 }; 79 };
98 80
99 std::vector<std::string>* Logger::g_log = nullptr; 81 // Implementing Swappable concept.
100 int Logger::g_next_id = 0; 82 void swap(TestObject& lhs, TestObject& rhs) {
101 83 lhs.Swap(&rhs);
102 // Append all the other args to the vector pointed to by the first arg. 84 }
103 template <typename T> 85
104 void VectorAppend(std::vector<T>* v) {} 86 class NonTriviallyDestructible {
105 template <typename T, typename... Ts> 87 ~NonTriviallyDestructible() {}
106 void VectorAppend(std::vector<T>* v, const T& e, Ts... es) { 88 };
107 v->push_back(e); 89
108 VectorAppend(v, es...); 90 } // anonymous namespace
109 } 91
110 92 static_assert(is_trivially_destructible<Optional<int>>::value,
111 // Create a vector of strings. Because we're not allowed to use 93 "OptionalIsTriviallyDestructible");
112 // std::initializer_list. 94
113 template <typename... Ts> 95 static_assert(
114 std::vector<std::string> V(Ts... es) { 96 !is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
115 std::vector<std::string> strings; 97 "OptionalIsTriviallyDestructible");
116 VectorAppend(&strings, static_cast<std::string>(es)...); 98
117 return strings; 99 TEST(OptionalTest, DefaultConstructor) {
118 } 100 {
119 101 Optional<float> o;
120 } // namespace 102 EXPECT_FALSE(o);
121 103 }
122 TEST(OptionalTest, TestConstructDefault) { 104
123 auto log = Logger::Setup(); 105 {
124 { 106 Optional<std::string> o;
125 Optional<Logger> x; 107 EXPECT_FALSE(o);
126 EXPECT_FALSE(x); 108 }
127 } 109
128 EXPECT_EQ(V(), *log); 110 {
129 } 111 Optional<TestObject> o;
130 112 EXPECT_FALSE(o);
131 TEST(OptionalTest, TestConstructCopyEmpty) { 113 }
132 auto log = Logger::Setup(); 114 }
133 { 115
134 Optional<Logger> x; 116 TEST(OptionalTest, CopyConstructor) {
135 EXPECT_FALSE(x); 117 {
136 auto y = x; 118 Optional<float> first(0.1f);
137 EXPECT_FALSE(y); 119 Optional<float> other(first);
138 } 120
139 EXPECT_EQ(V(), *log); 121 EXPECT_TRUE(other);
140 } 122 EXPECT_EQ(other.value(), 0.1f);
141 123 EXPECT_EQ(first, other);
142 TEST(OptionalTest, TestConstructCopyFull) { 124 }
143 auto log = Logger::Setup(); 125
144 { 126 {
145 Logger a; 127 Optional<std::string> first("foo");
146 Optional<Logger> x(a); 128 Optional<std::string> other(first);
147 EXPECT_TRUE(x); 129
148 log->push_back("---"); 130 EXPECT_TRUE(other);
149 auto y = x; 131 EXPECT_EQ(other.value(), "foo");
150 EXPECT_TRUE(y); 132 EXPECT_EQ(first, other);
151 log->push_back("---"); 133 }
152 } 134
153 EXPECT_EQ(V("0:0. default constructor", "1:0. copy constructor (from 0:0)", 135 {
154 "---", "2:0. copy constructor (from 1:0)", "---", 136 Optional<TestObject> first(TestObject(3, 0.1));
155 "2:0. destructor", "1:0. destructor", "0:0. destructor"), 137 Optional<TestObject> other(first);
156 *log); 138
157 } 139 EXPECT_TRUE(!!other);
158 140 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
159 TEST(OptionalTest, TestConstructMoveEmpty) { 141 EXPECT_TRUE(first == other);
160 auto log = Logger::Setup(); 142 }
161 { 143 }
162 Optional<Logger> x; 144
163 EXPECT_FALSE(x); 145 TEST(OptionalTest, ValueConstructor) {
164 auto y = std::move(x); 146 {
165 EXPECT_FALSE(y); 147 Optional<float> o(0.1f);
166 } 148 EXPECT_TRUE(o);
167 EXPECT_EQ(V(), *log); 149 EXPECT_EQ(o.value(), 0.1f);
168 } 150 }
169 151
170 TEST(OptionalTest, TestConstructMoveFull) { 152 {
171 auto log = Logger::Setup(); 153 Optional<std::string> o("foo");
172 { 154 EXPECT_TRUE(o);
173 Optional<Logger> x(Logger(17)); 155 EXPECT_EQ(o.value(), "foo");
174 EXPECT_TRUE(x); 156 }
175 log->push_back("---"); 157
176 auto y = std::move(x); 158 {
177 EXPECT_TRUE(x); 159 Optional<TestObject> o(TestObject(3, 0.1));
178 EXPECT_TRUE(y); 160 EXPECT_TRUE(!!o);
179 log->push_back("---"); 161 EXPECT_TRUE(o.value() == TestObject(3, 0.1));
180 } 162 }
181 EXPECT_EQ( 163 }
182 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 164
183 "0:17. destructor", "---", "2:17. move constructor (from 1:17)", "---", 165 TEST(OptionalTest, MoveConstructor) {
184 "2:17. destructor", "1:17. destructor"), 166 {
185 *log); 167 Optional<float> first(0.1f);
186 } 168 Optional<float> second(std::move(first));
187 169
188 TEST(OptionalTest, TestCopyAssignToEmptyFromEmpty) { 170 EXPECT_TRUE(second);
189 auto log = Logger::Setup(); 171 EXPECT_EQ(second.value(), 0.1f);
190 { 172
191 Optional<Logger> x, y; 173 EXPECT_TRUE(first);
192 x = y; 174 }
193 } 175
194 EXPECT_EQ(V(), *log); 176 {
195 } 177 Optional<std::string> first("foo");
196 178 Optional<std::string> second(std::move(first));
197 TEST(OptionalTest, TestCopyAssignToFullFromEmpty) { 179
198 auto log = Logger::Setup(); 180 EXPECT_TRUE(second);
199 { 181 EXPECT_EQ("foo", second.value());
200 Optional<Logger> x(Logger(17)); 182
201 Optional<Logger> y; 183 EXPECT_TRUE(first);
202 log->push_back("---"); 184 }
203 x = y; 185
204 log->push_back("---"); 186 {
205 } 187 Optional<TestObject> first(TestObject(3, 0.1));
206 EXPECT_EQ( 188 Optional<TestObject> second(std::move(first));
207 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 189
208 "0:17. destructor", "---", "1:17. destructor", "---"), 190 EXPECT_TRUE(!!second);
209 *log); 191 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
210 } 192 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
211 193
212 TEST(OptionalTest, TestCopyAssignToEmptyFromFull) { 194 EXPECT_TRUE(!!first);
213 auto log = Logger::Setup(); 195 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
214 { 196 }
215 Optional<Logger> x; 197 }
216 Optional<Logger> y(Logger(17)); 198
217 log->push_back("---"); 199 TEST(OptionalTest, MoveValueConstructor) {
218 x = y; 200 {
219 log->push_back("---"); 201 Optional<float> first(0.1f);
220 } 202 Optional<float> second(std::move(first.value()));
221 EXPECT_EQ( 203
222 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 204 EXPECT_TRUE(second);
223 "0:17. destructor", "---", "2:17. copy constructor (from 1:17)", "---", 205 EXPECT_EQ(second.value(), 0.1f);
224 "1:17. destructor", "2:17. destructor"), 206
225 *log); 207 EXPECT_TRUE(first);
226 } 208 }
227 209
228 TEST(OptionalTest, TestCopyAssignToFullFromFull) { 210 {
229 auto log = Logger::Setup(); 211 Optional<std::string> first("foo");
230 { 212 Optional<std::string> second(std::move(first.value()));
231 Optional<Logger> x(Logger(17)); 213
232 Optional<Logger> y(Logger(42)); 214 EXPECT_TRUE(second);
233 log->push_back("---"); 215 EXPECT_EQ("foo", second.value());
234 x = y; 216
235 log->push_back("---"); 217 EXPECT_TRUE(first);
236 } 218 }
237 EXPECT_EQ( 219
238 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 220 {
239 "0:17. destructor", "2:42. explicit constructor", 221 Optional<TestObject> first(TestObject(3, 0.1));
240 "3:42. move constructor (from 2:42)", "2:42. destructor", "---", 222 Optional<TestObject> second(std::move(first.value()));
241 "1:42. operator= copy (from 3:42)", "---", "3:42. destructor", 223
242 "1:42. destructor"), 224 EXPECT_TRUE(!!second);
243 *log); 225 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
244 } 226 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
245 227
246 TEST(OptionalTest, TestCopyAssignToEmptyFromT) { 228 EXPECT_TRUE(!!first);
247 auto log = Logger::Setup(); 229 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
248 { 230 }
249 Optional<Logger> x; 231 }
250 Logger y(17); 232
251 log->push_back("---"); 233 TEST(OptionalTest, ConstructorForwardArguments) {
252 x = Optional<Logger>(y); 234 {
253 log->push_back("---"); 235 Optional<float> a(rtc::in_place, 0.1f);
254 } 236 EXPECT_TRUE(a);
255 EXPECT_EQ(V("0:17. explicit constructor", "---", 237 EXPECT_EQ(0.1f, a.value());
256 "1:17. copy constructor (from 0:17)", 238 }
257 "2:17. move constructor (from 1:17)", "1:17. destructor", "---", 239
258 "0:17. destructor", "2:17. destructor"), 240 {
259 *log); 241 Optional<std::string> a(rtc::in_place, "foo");
260 } 242 EXPECT_TRUE(a);
261 243 EXPECT_EQ("foo", a.value());
262 TEST(OptionalTest, TestCopyAssignToFullFromT) { 244 }
263 auto log = Logger::Setup(); 245
264 { 246 {
265 Optional<Logger> x(Logger(17)); 247 Optional<TestObject> a(rtc::in_place, 0, 0.1);
266 Logger y(42); 248 EXPECT_TRUE(!!a);
267 log->push_back("---"); 249 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
268 x = Optional<Logger>(y); 250 }
269 log->push_back("---"); 251 }
270 } 252
271 EXPECT_EQ( 253 TEST(OptionalTest, NulloptConstructor) {
272 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 254 Optional<int> a = rtc::nullopt;
273 "0:17. destructor", "2:42. explicit constructor", "---", 255 EXPECT_FALSE(a);
274 "3:42. copy constructor (from 2:42)", 256 }
275 "1:42. operator= move (from 3:42)", "3:42. destructor", "---", 257
276 "2:42. destructor", "1:42. destructor"), 258 TEST(OptionalTest, AssignValue) {
277 *log); 259 {
278 } 260 Optional<float> a;
279 261 EXPECT_FALSE(a);
280 TEST(OptionalTest, TestMoveAssignToEmptyFromEmpty) { 262 a = 0.1f;
281 auto log = Logger::Setup(); 263 EXPECT_TRUE(a);
282 { 264
283 Optional<Logger> x, y; 265 Optional<float> b(0.1f);
284 x = std::move(y); 266 EXPECT_TRUE(a == b);
285 } 267 }
286 EXPECT_EQ(V(), *log); 268
287 } 269 {
288 270 Optional<std::string> a;
289 TEST(OptionalTest, TestMoveAssignToFullFromEmpty) { 271 EXPECT_FALSE(a);
290 auto log = Logger::Setup(); 272 a = std::string("foo");
291 { 273 EXPECT_TRUE(a);
292 Optional<Logger> x(Logger(17)); 274
293 Optional<Logger> y; 275 Optional<std::string> b(std::string("foo"));
294 log->push_back("---"); 276 EXPECT_EQ(a, b);
295 x = std::move(y); 277 }
296 log->push_back("---"); 278
297 } 279 {
298 EXPECT_EQ( 280 Optional<TestObject> a;
299 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 281 EXPECT_FALSE(!!a);
300 "0:17. destructor", "---", "1:17. destructor", "---"), 282 a = TestObject(3, 0.1);
301 *log); 283 EXPECT_TRUE(!!a);
302 } 284
303 285 Optional<TestObject> b(TestObject(3, 0.1));
304 TEST(OptionalTest, TestMoveAssignToEmptyFromFull) { 286 EXPECT_TRUE(a == b);
305 auto log = Logger::Setup(); 287 }
306 { 288
307 Optional<Logger> x; 289 {
308 Optional<Logger> y(Logger(17)); 290 Optional<TestObject> a = TestObject(4, 1.0);
309 log->push_back("---"); 291 EXPECT_TRUE(!!a);
310 x = std::move(y); 292 a = TestObject(3, 0.1);
311 log->push_back("---"); 293 EXPECT_TRUE(!!a);
312 } 294
313 EXPECT_EQ( 295 Optional<TestObject> b(TestObject(3, 0.1));
314 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 296 EXPECT_TRUE(a == b);
315 "0:17. destructor", "---", "2:17. move constructor (from 1:17)", "---", 297 }
316 "1:17. destructor", "2:17. destructor"), 298 }
317 *log); 299
318 } 300 TEST(OptionalTest, AssignObject) {
319 301 {
320 TEST(OptionalTest, TestMoveAssignToFullFromFull) { 302 Optional<float> a;
321 auto log = Logger::Setup(); 303 Optional<float> b(0.1f);
322 { 304 a = b;
323 Optional<Logger> x(Logger(17)); 305
324 Optional<Logger> y(Logger(42)); 306 EXPECT_TRUE(a);
325 log->push_back("---"); 307 EXPECT_EQ(a.value(), 0.1f);
326 x = std::move(y); 308 EXPECT_EQ(a, b);
327 log->push_back("---"); 309 }
328 } 310
329 EXPECT_EQ( 311 {
330 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 312 Optional<std::string> a;
331 "0:17. destructor", "2:42. explicit constructor", 313 Optional<std::string> b("foo");
332 "3:42. move constructor (from 2:42)", "2:42. destructor", "---", 314 a = b;
333 "1:42. operator= move (from 3:42)", "---", "3:42. destructor", 315
334 "1:42. destructor"), 316 EXPECT_TRUE(a);
335 *log); 317 EXPECT_EQ(a.value(), "foo");
336 } 318 EXPECT_EQ(a, b);
337 319 }
338 TEST(OptionalTest, TestMoveAssignToEmptyFromT) { 320
339 auto log = Logger::Setup(); 321 {
340 { 322 Optional<TestObject> a;
341 Optional<Logger> x; 323 Optional<TestObject> b(TestObject(3, 0.1));
342 Logger y(17); 324 a = b;
343 log->push_back("---"); 325
344 x = Optional<Logger>(std::move(y)); 326 EXPECT_TRUE(!!a);
345 log->push_back("---"); 327 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
346 } 328 EXPECT_TRUE(a == b);
347 EXPECT_EQ(V("0:17. explicit constructor", "---", 329 }
348 "1:17. move constructor (from 0:17)", 330
349 "2:17. move constructor (from 1:17)", "1:17. destructor", "---", 331 {
350 "0:17. destructor", "2:17. destructor"), 332 Optional<TestObject> a(TestObject(4, 1.0));
351 *log); 333 Optional<TestObject> b(TestObject(3, 0.1));
352 } 334 a = b;
353 335
354 TEST(OptionalTest, TestMoveAssignToFullFromT) { 336 EXPECT_TRUE(!!a);
355 auto log = Logger::Setup(); 337 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
356 { 338 EXPECT_TRUE(a == b);
357 Optional<Logger> x(Logger(17)); 339 }
358 Logger y(42); 340 }
359 log->push_back("---"); 341
360 x = Optional<Logger>(std::move(y)); 342 TEST(OptionalTest, AssignObject_rvalue) {
361 log->push_back("---"); 343 {
362 } 344 Optional<float> a;
363 EXPECT_EQ( 345 Optional<float> b(0.1f);
364 V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", 346 a = std::move(b);
365 "0:17. destructor", "2:42. explicit constructor", "---", 347
366 "3:42. move constructor (from 2:42)", 348 EXPECT_TRUE(a);
367 "1:42. operator= move (from 3:42)", "3:42. destructor", "---", 349 EXPECT_TRUE(b);
368 "2:42. destructor", "1:42. destructor"), 350 EXPECT_EQ(0.1f, a.value());
369 *log); 351 }
370 } 352
371 353 {
372 TEST(OptionalTest, TestDereference) { 354 Optional<std::string> a;
373 auto log = Logger::Setup(); 355 Optional<std::string> b("foo");
374 { 356 a = std::move(b);
375 Optional<Logger> x(Logger(42)); 357
376 const auto& y = x; 358 EXPECT_TRUE(a);
377 log->push_back("---"); 359 EXPECT_TRUE(b);
378 x->Foo(); 360 EXPECT_EQ("foo", a.value());
379 y->Foo(); 361 }
380 std::move(x)->Foo(); 362
381 std::move(y)->Foo(); 363 {
382 log->push_back("---"); 364 Optional<TestObject> a;
383 (*x).Foo(); 365 Optional<TestObject> b(TestObject(3, 0.1));
384 (*y).Foo(); 366 a = std::move(b);
385 (*std::move(x)).Foo(); 367
386 (*std::move(y)).Foo(); 368 EXPECT_TRUE(!!a);
387 log->push_back("---"); 369 EXPECT_TRUE(!!b);
388 } 370 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
389 EXPECT_EQ(V("0:42. explicit constructor", 371
390 "1:42. move constructor (from 0:42)", "0:42. destructor", "---", 372 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
391 "1:42. Foo()", "1:42. Foo() const", "1:42. Foo()", 373 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
392 "1:42. Foo() const", "---", "1:42. Foo()", "1:42. Foo() const", 374 }
393 "1:42. Foo()", "1:42. Foo() const", "---", "1:42. destructor"), 375
394 *log); 376 {
395 } 377 Optional<TestObject> a(TestObject(4, 1.0));
396 378 Optional<TestObject> b(TestObject(3, 0.1));
397 TEST(OptionalTest, TestDereferenceWithDefault) { 379 a = std::move(b);
398 auto log = Logger::Setup(); 380
399 { 381 EXPECT_TRUE(!!a);
400 const Logger a(17), b(42); 382 EXPECT_TRUE(!!b);
401 Optional<Logger> x(a); 383 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
402 Optional<Logger> y; 384
403 log->push_back("-1-"); 385 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
404 EXPECT_EQ(a, x.value_or(Logger(42))); 386 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
405 log->push_back("-2-"); 387 }
406 EXPECT_EQ(b, y.value_or(Logger(42))); 388 }
407 log->push_back("-3-"); 389
408 EXPECT_EQ(a, Optional<Logger>(Logger(17)).value_or(b)); 390 TEST(OptionalTest, AssignNull) {
409 log->push_back("-4-"); 391 {
410 EXPECT_EQ(b, Optional<Logger>().value_or(b)); 392 Optional<float> a(0.1f);
411 log->push_back("-5-"); 393 Optional<float> b(0.2f);
412 } 394 a = rtc::nullopt;
413 EXPECT_EQ( 395 b = rtc::nullopt;
414 V("0:17. explicit constructor", "1:42. explicit constructor", 396 EXPECT_EQ(a, b);
415 "2:17. copy constructor (from 0:17)", "-1-", 397 }
416 "3:42. explicit constructor", "operator== 0:17, 2:17", 398
417 "3:42. destructor", "-2-", "4:42. explicit constructor", 399 {
418 "operator== 1:42, 4:42", "4:42. destructor", "-3-", 400 Optional<std::string> a("foo");
419 "5:17. explicit constructor", "6:17. move constructor (from 5:17)", 401 Optional<std::string> b("bar");
420 "operator== 0:17, 6:17", "6:17. destructor", "5:17. destructor", "-4-", 402 a = rtc::nullopt;
421 "operator== 1:42, 1:42", "-5-", "2:17. destructor", "1:42. destructor", 403 b = rtc::nullopt;
422 "0:17. destructor"), 404 EXPECT_EQ(a, b);
423 *log); 405 }
424 } 406
425 407 {
426 TEST(OptionalTest, TestEquality) { 408 Optional<TestObject> a(TestObject(3, 0.1));
427 auto log = Logger::Setup(); 409 Optional<TestObject> b(TestObject(4, 1.0));
428 { 410 a = rtc::nullopt;
429 Logger a(17), b(42); 411 b = rtc::nullopt;
430 Optional<Logger> ma1(a), ma2(a), mb(b), me1, me2; 412 EXPECT_TRUE(a == b);
431 log->push_back("---"); 413 }
432 EXPECT_EQ(ma1, ma1); 414 }
433 EXPECT_EQ(ma1, ma2); 415
434 EXPECT_NE(ma1, mb); 416 TEST(OptionalTest, OperatorStar) {
435 EXPECT_NE(ma1, me1); 417 {
436 EXPECT_EQ(me1, me1); 418 Optional<float> a(0.1f);
437 EXPECT_EQ(me1, me2); 419 EXPECT_EQ(a.value(), *a);
438 log->push_back("---"); 420 }
439 } 421
440 EXPECT_EQ( 422 {
441 V("0:17. explicit constructor", "1:42. explicit constructor", 423 Optional<std::string> a("foo");
442 "2:17. copy constructor (from 0:17)", 424 EXPECT_EQ(a.value(), *a);
443 "3:17. copy constructor (from 0:17)", 425 }
444 "4:42. copy constructor (from 1:42)", "---", "operator== 2:17, 2:17", 426
445 "operator== 2:17, 3:17", "operator!= 2:17, 4:42", "---", 427 {
446 "4:42. destructor", "3:17. destructor", "2:17. destructor", 428 Optional<TestObject> a(TestObject(3, 0.1));
447 "1:42. destructor", "0:17. destructor"), 429 EXPECT_EQ(a.value(), *a);
448 *log); 430 }
449 } 431 }
450 432
451 TEST(OptionalTest, TestSwap) { 433 TEST(OptionalTest, OperatorStar_rvalue) {
452 auto log = Logger::Setup(); 434 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
453 { 435 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
454 Logger a(17), b(42); 436 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
455 Optional<Logger> x1(a), x2(b), y1(a), y2, z1, z2; 437 }
456 log->push_back("---"); 438
457 swap(x1, x2); // Swap full <-> full. 439 TEST(OptionalTest, OperatorArrow) {
458 swap(y1, y2); // Swap full <-> empty. 440 Optional<TestObject> a(TestObject(3, 0.1));
459 swap(z1, z2); // Swap empty <-> empty. 441 EXPECT_EQ(a->foo(), 3);
460 log->push_back("---"); 442 }
461 } 443
462 EXPECT_EQ(V("0:17. explicit constructor", "1:42. explicit constructor", 444 TEST(OptionalTest, Value_rvalue) {
463 "2:17. copy constructor (from 0:17)", 445 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
464 "3:42. copy constructor (from 1:42)", 446 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
465 "4:17. copy constructor (from 0:17)", "---", "swap 2:42, 3:17", 447 EXPECT_TRUE(TestObject(3, 0.1) ==
466 "5:17. move constructor (from 4:17)", "4:17. destructor", "---", 448 Optional<TestObject>(TestObject(3, 0.1)).value());
467 "5:17. destructor", "3:17. destructor", "2:42. destructor", 449 }
468 "1:42. destructor", "0:17. destructor"), 450
469 *log); 451 TEST(OptionalTest, ValueOr) {
452 {
453 Optional<float> a;
454 EXPECT_EQ(0.0f, a.value_or(0.0f));
455
456 a = 0.1f;
457 EXPECT_EQ(0.1f, a.value_or(0.0f));
458
459 a = rtc::nullopt;
460 EXPECT_EQ(0.0f, a.value_or(0.0f));
461 }
462
463 {
464 Optional<std::string> a;
465 EXPECT_EQ("bar", a.value_or("bar"));
466
467 a = std::string("foo");
468 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
469
470 a = rtc::nullopt;
471 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
472 }
473
474 {
475 Optional<TestObject> a;
476 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
477
478 a = TestObject(3, 0.1);
479 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
480
481 a = rtc::nullopt;
482 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
483 }
484 }
485
486 TEST(OptionalTest, Swap_bothNoValue) {
487 Optional<TestObject> a, b;
488 a.swap(b);
489
490 EXPECT_FALSE(a);
491 EXPECT_FALSE(b);
492 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
493 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
494 }
495
496 TEST(OptionalTest, Swap_inHasValue) {
497 Optional<TestObject> a(TestObject(1, 0.3));
498 Optional<TestObject> b;
499 a.swap(b);
500
501 EXPECT_FALSE(a);
502
503 EXPECT_TRUE(!!b);
504 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
505 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
506 }
507
508 TEST(OptionalTest, Swap_outHasValue) {
509 Optional<TestObject> a;
510 Optional<TestObject> b(TestObject(1, 0.3));
511 a.swap(b);
512
513 EXPECT_TRUE(!!a);
514 EXPECT_FALSE(!!b);
515 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
516 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
517 }
518
519 TEST(OptionalTest, Swap_bothValue) {
520 Optional<TestObject> a(TestObject(0, 0.1));
521 Optional<TestObject> b(TestObject(1, 0.3));
522 a.swap(b);
523
524 EXPECT_TRUE(!!a);
525 EXPECT_TRUE(!!b);
526 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
527 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
528 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
529 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
530 }
531
532 TEST(OptionalTest, Emplace) {
533 {
534 Optional<float> a(0.1f);
535 a.emplace(0.3f);
536
537 EXPECT_TRUE(a);
538 EXPECT_EQ(0.3f, a.value());
539 }
540
541 {
542 Optional<std::string> a("foo");
543 a.emplace("bar");
544
545 EXPECT_TRUE(a);
546 EXPECT_EQ("bar", a.value());
547 }
548
549 {
550 Optional<TestObject> a(TestObject(0, 0.1));
551 a.emplace(TestObject(1, 0.2));
552
553 EXPECT_TRUE(!!a);
554 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
555 }
556 }
557
558 TEST(OptionalTest, Equals_TwoEmpty) {
559 Optional<int> a;
560 Optional<int> b;
561
562 EXPECT_TRUE(a == b);
563 }
564
565 TEST(OptionalTest, Equals_TwoEquals) {
566 Optional<int> a(1);
567 Optional<int> b(1);
568
569 EXPECT_TRUE(a == b);
570 }
571
572 TEST(OptionalTest, Equals_OneEmpty) {
573 Optional<int> a;
574 Optional<int> b(1);
575
576 EXPECT_FALSE(a == b);
577 }
578
579 TEST(OptionalTest, Equals_TwoDifferent) {
580 Optional<int> a(0);
581 Optional<int> b(1);
582
583 EXPECT_FALSE(a == b);
584 }
585
586 TEST(OptionalTest, NotEquals_TwoEmpty) {
587 Optional<int> a;
588 Optional<int> b;
589
590 EXPECT_FALSE(a != b);
591 }
592
593 TEST(OptionalTest, NotEquals_TwoEquals) {
594 Optional<int> a(1);
595 Optional<int> b(1);
596
597 EXPECT_FALSE(a != b);
598 }
599
600 TEST(OptionalTest, NotEquals_OneEmpty) {
601 Optional<int> a;
602 Optional<int> b(1);
603
604 EXPECT_TRUE(a != b);
605 }
606
607 TEST(OptionalTest, NotEquals_TwoDifferent) {
608 Optional<int> a(0);
609 Optional<int> b(1);
610
611 EXPECT_TRUE(a != b);
612 }
613
614 TEST(OptionalTest, Less_LeftEmpty) {
615 Optional<int> l;
616 Optional<int> r(1);
617
618 EXPECT_TRUE(l < r);
619 }
620
621 TEST(OptionalTest, Less_RightEmpty) {
622 Optional<int> l(1);
623 Optional<int> r;
624
625 EXPECT_FALSE(l < r);
626 }
627
628 TEST(OptionalTest, Less_BothEmpty) {
629 Optional<int> l;
630 Optional<int> r;
631
632 EXPECT_FALSE(l < r);
633 }
634
635 TEST(OptionalTest, Less_BothValues) {
636 {
637 Optional<int> l(1);
638 Optional<int> r(2);
639
640 EXPECT_TRUE(l < r);
641 }
642 {
643 Optional<int> l(2);
644 Optional<int> r(1);
645
646 EXPECT_FALSE(l < r);
647 }
648 {
649 Optional<int> l(1);
650 Optional<int> r(1);
651
652 EXPECT_FALSE(l < r);
653 }
654 }
655
656 TEST(OptionalTest, LessEq_LeftEmpty) {
657 Optional<int> l;
658 Optional<int> r(1);
659
660 EXPECT_TRUE(l <= r);
661 }
662
663 TEST(OptionalTest, LessEq_RightEmpty) {
664 Optional<int> l(1);
665 Optional<int> r;
666
667 EXPECT_FALSE(l <= r);
668 }
669
670 TEST(OptionalTest, LessEq_BothEmpty) {
671 Optional<int> l;
672 Optional<int> r;
673
674 EXPECT_TRUE(l <= r);
675 }
676
677 TEST(OptionalTest, LessEq_BothValues) {
678 {
679 Optional<int> l(1);
680 Optional<int> r(2);
681
682 EXPECT_TRUE(l <= r);
683 }
684 {
685 Optional<int> l(2);
686 Optional<int> r(1);
687
688 EXPECT_FALSE(l <= r);
689 }
690 {
691 Optional<int> l(1);
692 Optional<int> r(1);
693
694 EXPECT_TRUE(l <= r);
695 }
696 }
697
698 TEST(OptionalTest, Greater_BothEmpty) {
699 Optional<int> l;
700 Optional<int> r;
701
702 EXPECT_FALSE(l > r);
703 }
704
705 TEST(OptionalTest, Greater_LeftEmpty) {
706 Optional<int> l;
707 Optional<int> r(1);
708
709 EXPECT_FALSE(l > r);
710 }
711
712 TEST(OptionalTest, Greater_RightEmpty) {
713 Optional<int> l(1);
714 Optional<int> r;
715
716 EXPECT_TRUE(l > r);
717 }
718
719 TEST(OptionalTest, Greater_BothValue) {
720 {
721 Optional<int> l(1);
722 Optional<int> r(2);
723
724 EXPECT_FALSE(l > r);
725 }
726 {
727 Optional<int> l(2);
728 Optional<int> r(1);
729
730 EXPECT_TRUE(l > r);
731 }
732 {
733 Optional<int> l(1);
734 Optional<int> r(1);
735
736 EXPECT_FALSE(l > r);
737 }
738 }
739
740 TEST(OptionalTest, GreaterEq_BothEmpty) {
741 Optional<int> l;
742 Optional<int> r;
743
744 EXPECT_TRUE(l >= r);
745 }
746
747 TEST(OptionalTest, GreaterEq_LeftEmpty) {
748 Optional<int> l;
749 Optional<int> r(1);
750
751 EXPECT_FALSE(l >= r);
752 }
753
754 TEST(OptionalTest, GreaterEq_RightEmpty) {
755 Optional<int> l(1);
756 Optional<int> r;
757
758 EXPECT_TRUE(l >= r);
759 }
760
761 TEST(OptionalTest, GreaterEq_BothValue) {
762 {
763 Optional<int> l(1);
764 Optional<int> r(2);
765
766 EXPECT_FALSE(l >= r);
767 }
768 {
769 Optional<int> l(2);
770 Optional<int> r(1);
771
772 EXPECT_TRUE(l >= r);
773 }
774 {
775 Optional<int> l(1);
776 Optional<int> r(1);
777
778 EXPECT_TRUE(l >= r);
779 }
780 }
781
782 TEST(OptionalTest, OptNullEq) {
783 {
784 Optional<int> opt;
785 EXPECT_TRUE(opt == rtc::nullopt);
786 }
787 {
788 Optional<int> opt(1);
789 EXPECT_FALSE(opt == rtc::nullopt);
790 }
791 }
792
793 TEST(OptionalTest, NullOptEq) {
794 {
795 Optional<int> opt;
796 EXPECT_TRUE(rtc::nullopt == opt);
797 }
798 {
799 Optional<int> opt(1);
800 EXPECT_FALSE(rtc::nullopt == opt);
801 }
802 }
803
804 TEST(OptionalTest, OptNullNotEq) {
805 {
806 Optional<int> opt;
807 EXPECT_FALSE(opt != rtc::nullopt);
808 }
809 {
810 Optional<int> opt(1);
811 EXPECT_TRUE(opt != rtc::nullopt);
812 }
813 }
814
815 TEST(OptionalTest, NullOptNotEq) {
816 {
817 Optional<int> opt;
818 EXPECT_FALSE(rtc::nullopt != opt);
819 }
820 {
821 Optional<int> opt(1);
822 EXPECT_TRUE(rtc::nullopt != opt);
823 }
824 }
825
826 TEST(OptionalTest, OptNullLower) {
827 {
828 Optional<int> opt;
829 EXPECT_FALSE(opt < rtc::nullopt);
830 }
831 {
832 Optional<int> opt(1);
833 EXPECT_FALSE(opt < rtc::nullopt);
834 }
835 }
836
837 TEST(OptionalTest, NullOptLower) {
838 {
839 Optional<int> opt;
840 EXPECT_FALSE(rtc::nullopt < opt);
841 }
842 {
843 Optional<int> opt(1);
844 EXPECT_TRUE(rtc::nullopt < opt);
845 }
846 }
847
848 TEST(OptionalTest, OptNullLowerEq) {
849 {
850 Optional<int> opt;
851 EXPECT_TRUE(opt <= rtc::nullopt);
852 }
853 {
854 Optional<int> opt(1);
855 EXPECT_FALSE(opt <= rtc::nullopt);
856 }
857 }
858
859 TEST(OptionalTest, NullOptLowerEq) {
860 {
861 Optional<int> opt;
862 EXPECT_TRUE(rtc::nullopt <= opt);
863 }
864 {
865 Optional<int> opt(1);
866 EXPECT_TRUE(rtc::nullopt <= opt);
867 }
868 }
869
870 TEST(OptionalTest, OptNullGreater) {
871 {
872 Optional<int> opt;
873 EXPECT_FALSE(opt > rtc::nullopt);
874 }
875 {
876 Optional<int> opt(1);
877 EXPECT_TRUE(opt > rtc::nullopt);
878 }
879 }
880
881 TEST(OptionalTest, NullOptGreater) {
882 {
883 Optional<int> opt;
884 EXPECT_FALSE(rtc::nullopt > opt);
885 }
886 {
887 Optional<int> opt(1);
888 EXPECT_FALSE(rtc::nullopt > opt);
889 }
890 }
891
892 TEST(OptionalTest, OptNullGreaterEq) {
893 {
894 Optional<int> opt;
895 EXPECT_TRUE(opt >= rtc::nullopt);
896 }
897 {
898 Optional<int> opt(1);
899 EXPECT_TRUE(opt >= rtc::nullopt);
900 }
901 }
902
903 TEST(OptionalTest, NullOptGreaterEq) {
904 {
905 Optional<int> opt;
906 EXPECT_TRUE(rtc::nullopt >= opt);
907 }
908 {
909 Optional<int> opt(1);
910 EXPECT_FALSE(rtc::nullopt >= opt);
911 }
912 }
913
914 TEST(OptionalTest, ValueEq_Empty) {
915 Optional<int> opt;
916 EXPECT_FALSE(opt == 1);
917 }
918
919 TEST(OptionalTest, ValueEq_NotEmpty) {
920 {
921 Optional<int> opt(0);
922 EXPECT_FALSE(opt == 1);
923 }
924 {
925 Optional<int> opt(1);
926 EXPECT_TRUE(opt == 1);
927 }
928 }
929
930 TEST(OptionalTest, EqValue_Empty) {
931 Optional<int> opt;
932 EXPECT_FALSE(1 == opt);
933 }
934
935 TEST(OptionalTest, EqValue_NotEmpty) {
936 {
937 Optional<int> opt(0);
938 EXPECT_FALSE(1 == opt);
939 }
940 {
941 Optional<int> opt(1);
942 EXPECT_TRUE(1 == opt);
943 }
944 }
945
946 TEST(OptionalTest, ValueNotEq_Empty) {
947 Optional<int> opt;
948 EXPECT_TRUE(opt != 1);
949 }
950
951 TEST(OptionalTest, ValueNotEq_NotEmpty) {
952 {
953 Optional<int> opt(0);
954 EXPECT_TRUE(opt != 1);
955 }
956 {
957 Optional<int> opt(1);
958 EXPECT_FALSE(opt != 1);
959 }
960 }
961
962 TEST(OptionalTest, NotEqValue_Empty) {
963 Optional<int> opt;
964 EXPECT_TRUE(1 != opt);
965 }
966
967 TEST(OptionalTest, NotEqValue_NotEmpty) {
968 {
969 Optional<int> opt(0);
970 EXPECT_TRUE(1 != opt);
971 }
972 {
973 Optional<int> opt(1);
974 EXPECT_FALSE(1 != opt);
975 }
976 }
977
978 TEST(OptionalTest, ValueLess_Empty) {
979 Optional<int> opt;
980 EXPECT_TRUE(opt < 1);
981 }
982
983 TEST(OptionalTest, ValueLess_NotEmpty) {
984 {
985 Optional<int> opt(0);
986 EXPECT_TRUE(opt < 1);
987 }
988 {
989 Optional<int> opt(1);
990 EXPECT_FALSE(opt < 1);
991 }
992 {
993 Optional<int> opt(2);
994 EXPECT_FALSE(opt < 1);
995 }
996 }
997
998 TEST(OptionalTest, LessValue_Empty) {
999 Optional<int> opt;
1000 EXPECT_FALSE(1 < opt);
1001 }
1002
1003 TEST(OptionalTest, LessValue_NotEmpty) {
1004 {
1005 Optional<int> opt(0);
1006 EXPECT_FALSE(1 < opt);
1007 }
1008 {
1009 Optional<int> opt(1);
1010 EXPECT_FALSE(1 < opt);
1011 }
1012 {
1013 Optional<int> opt(2);
1014 EXPECT_TRUE(1 < opt);
1015 }
1016 }
1017
1018 TEST(OptionalTest, ValueLessEq_Empty) {
1019 Optional<int> opt;
1020 EXPECT_TRUE(opt <= 1);
1021 }
1022
1023 TEST(OptionalTest, ValueLessEq_NotEmpty) {
1024 {
1025 Optional<int> opt(0);
1026 EXPECT_TRUE(opt <= 1);
1027 }
1028 {
1029 Optional<int> opt(1);
1030 EXPECT_TRUE(opt <= 1);
1031 }
1032 {
1033 Optional<int> opt(2);
1034 EXPECT_FALSE(opt <= 1);
1035 }
1036 }
1037
1038 TEST(OptionalTest, LessEqValue_Empty) {
1039 Optional<int> opt;
1040 EXPECT_FALSE(1 <= opt);
1041 }
1042
1043 TEST(OptionalTest, LessEqValue_NotEmpty) {
1044 {
1045 Optional<int> opt(0);
1046 EXPECT_FALSE(1 <= opt);
1047 }
1048 {
1049 Optional<int> opt(1);
1050 EXPECT_TRUE(1 <= opt);
1051 }
1052 {
1053 Optional<int> opt(2);
1054 EXPECT_TRUE(1 <= opt);
1055 }
1056 }
1057
1058 TEST(OptionalTest, ValueGreater_Empty) {
1059 Optional<int> opt;
1060 EXPECT_FALSE(opt > 1);
1061 }
1062
1063 TEST(OptionalTest, ValueGreater_NotEmpty) {
1064 {
1065 Optional<int> opt(0);
1066 EXPECT_FALSE(opt > 1);
1067 }
1068 {
1069 Optional<int> opt(1);
1070 EXPECT_FALSE(opt > 1);
1071 }
1072 {
1073 Optional<int> opt(2);
1074 EXPECT_TRUE(opt > 1);
1075 }
1076 }
1077
1078 TEST(OptionalTest, GreaterValue_Empty) {
1079 Optional<int> opt;
1080 EXPECT_TRUE(1 > opt);
1081 }
1082
1083 TEST(OptionalTest, GreaterValue_NotEmpty) {
1084 {
1085 Optional<int> opt(0);
1086 EXPECT_TRUE(1 > opt);
1087 }
1088 {
1089 Optional<int> opt(1);
1090 EXPECT_FALSE(1 > opt);
1091 }
1092 {
1093 Optional<int> opt(2);
1094 EXPECT_FALSE(1 > opt);
1095 }
1096 }
1097
1098 TEST(OptionalTest, ValueGreaterEq_Empty) {
1099 Optional<int> opt;
1100 EXPECT_FALSE(opt >= 1);
1101 }
1102
1103 TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1104 {
1105 Optional<int> opt(0);
1106 EXPECT_FALSE(opt >= 1);
1107 }
1108 {
1109 Optional<int> opt(1);
1110 EXPECT_TRUE(opt >= 1);
1111 }
1112 {
1113 Optional<int> opt(2);
1114 EXPECT_TRUE(opt >= 1);
1115 }
1116 }
1117
1118 TEST(OptionalTest, GreaterEqValue_Empty) {
1119 Optional<int> opt;
1120 EXPECT_TRUE(1 >= opt);
1121 }
1122
1123 TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1124 {
1125 Optional<int> opt(0);
1126 EXPECT_TRUE(1 >= opt);
1127 }
1128 {
1129 Optional<int> opt(1);
1130 EXPECT_TRUE(1 >= opt);
1131 }
1132 {
1133 Optional<int> opt(2);
1134 EXPECT_FALSE(1 >= opt);
1135 }
1136 }
1137
1138 TEST(OptionalTest, NotEquals) {
1139 {
1140 Optional<float> a(0.1f);
1141 Optional<float> b(0.2f);
1142 EXPECT_NE(a, b);
1143 }
1144
1145 {
1146 Optional<std::string> a("foo");
1147 Optional<std::string> b("bar");
1148 EXPECT_NE(a, b);
1149 }
1150
1151 {
1152 Optional<TestObject> a(TestObject(3, 0.1));
1153 Optional<TestObject> b(TestObject(4, 1.0));
1154 EXPECT_TRUE(a != b);
1155 }
1156 }
1157
1158 TEST(OptionalTest, NotEqualsNull) {
1159 {
1160 Optional<float> a(0.1f);
1161 Optional<float> b(0.1f);
1162 b = rtc::nullopt;
1163 EXPECT_NE(a, b);
1164 }
1165
1166 {
1167 Optional<std::string> a("foo");
1168 Optional<std::string> b("foo");
1169 b = rtc::nullopt;
1170 EXPECT_NE(a, b);
1171 }
1172
1173 {
1174 Optional<TestObject> a(TestObject(3, 0.1));
1175 Optional<TestObject> b(TestObject(3, 0.1));
1176 b = rtc::nullopt;
1177 EXPECT_TRUE(a != b);
1178 }
1179 }
1180
1181 TEST(OptionalTest, MakeOptional) {
1182 {
1183 Optional<float> o = rtc::make_optional(32.f);
1184 EXPECT_TRUE(o);
1185 EXPECT_EQ(32.f, *o);
1186
1187 float value = 3.f;
1188 o = rtc::make_optional(std::move(value));
1189 EXPECT_TRUE(o);
1190 EXPECT_EQ(3.f, *o);
1191 }
1192
1193 {
1194 Optional<std::string> o = rtc::make_optional(std::string("foo"));
1195 EXPECT_TRUE(o);
1196 EXPECT_EQ("foo", *o);
1197
1198 std::string value = "bar";
1199 o = rtc::make_optional(std::move(value));
1200 EXPECT_TRUE(o);
1201 EXPECT_EQ(std::string("bar"), *o);
1202 }
1203
1204 {
1205 Optional<TestObject> o = rtc::make_optional(TestObject(3, 0.1));
1206 EXPECT_TRUE(!!o);
1207 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1208
1209 TestObject value = TestObject(0, 0.42);
1210 o = rtc::make_optional(std::move(value));
1211 EXPECT_TRUE(!!o);
1212 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1213 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
1214 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
1215
1216 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1217 rtc::make_optional(std::move(value))->state());
1218 }
1219 }
1220
1221 TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1222 Optional<TestObject> a, b;
1223 rtc::swap(a, b);
1224
1225 EXPECT_FALSE(!!a);
1226 EXPECT_FALSE(!!b);
1227 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1228 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1229 }
1230
1231 TEST(OptionalTest, NonMemberSwap_inHasValue) {
1232 Optional<TestObject> a(TestObject(1, 0.3));
1233 Optional<TestObject> b;
1234 rtc::swap(a, b);
1235
1236 EXPECT_FALSE(!!a);
1237 EXPECT_TRUE(!!b);
1238 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1239 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1240 }
1241
1242 TEST(OptionalTest, NonMemberSwap_outHasValue) {
1243 Optional<TestObject> a;
1244 Optional<TestObject> b(TestObject(1, 0.3));
1245 rtc::swap(a, b);
1246
1247 EXPECT_TRUE(!!a);
1248 EXPECT_FALSE(!!b);
1249 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1250 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1251 }
1252
1253 TEST(OptionalTest, NonMemberSwap_bothValue) {
1254 Optional<TestObject> a(TestObject(0, 0.1));
1255 Optional<TestObject> b(TestObject(1, 0.3));
1256 rtc::swap(a, b);
1257
1258 EXPECT_TRUE(!!a);
1259 EXPECT_TRUE(!!b);
1260 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1261 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
1262 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1263 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
1264 }
1265
1266 TEST(OptionalTest, Hash_OptionalReflectsInternal) {
1267 {
1268 std::hash<int> int_hash;
1269 std::hash<Optional<int>> opt_int_hash;
1270
1271 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
1272 }
1273
1274 {
1275 std::hash<std::string> str_hash;
1276 std::hash<Optional<std::string>> opt_str_hash;
1277
1278 EXPECT_EQ(str_hash(std::string("foobar")),
1279 opt_str_hash(Optional<std::string>(std::string("foobar"))));
1280 }
1281 }
1282
1283 TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
1284 std::hash<Optional<int>> opt_int_hash;
1285 std::hash<Optional<std::string>> opt_str_hash;
1286
1287 EXPECT_EQ(opt_str_hash(Optional<std::string>()),
1288 opt_int_hash(Optional<int>()));
1289 }
1290
1291 TEST(OptionalTest, Hash_UseInSet) {
1292 std::set<Optional<int>> setOptInt;
1293
1294 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
1295
1296 setOptInt.insert(Optional<int>(3));
1297 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
1298 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
470 } 1299 }
471 1300
472 } // namespace rtc 1301 } // namespace rtc
OLDNEW
« no previous file with comments | « webrtc/base/optional.h ('k') | webrtc/base/template_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698