blob: 7bdb46b76173d2fc99edaa3ba5fe70a8b1b3c459 [file] [log] [blame]
mlamourid1eac042016-04-20 02:27:01 +09001// Copyright 2016 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/optional.h"
6
jdoerrief5922352018-01-03 18:13:45 +09007#include <memory>
mlamourid1eac042016-04-20 02:27:01 +09008#include <set>
jdoerrief5922352018-01-03 18:13:45 +09009#include <string>
10#include <vector>
mlamourid1eac042016-04-20 02:27:01 +090011
jdoerrief5922352018-01-03 18:13:45 +090012#include "testing/gmock/include/gmock/gmock.h"
mlamourid1eac042016-04-20 02:27:01 +090013#include "testing/gtest/include/gtest/gtest.h"
14
jdoerrief5922352018-01-03 18:13:45 +090015using ::testing::ElementsAre;
16
mlamourid1eac042016-04-20 02:27:01 +090017namespace base {
18
19namespace {
20
21// Object used to test complex object with Optional<T> in addition of the move
22// semantics.
23class TestObject {
24 public:
25 enum class State {
26 DEFAULT_CONSTRUCTED,
27 VALUE_CONSTRUCTED,
28 COPY_CONSTRUCTED,
29 MOVE_CONSTRUCTED,
30 MOVED_FROM,
alshabalinc2ac5252016-05-27 17:01:31 +090031 COPY_ASSIGNED,
32 MOVE_ASSIGNED,
33 SWAPPED,
mlamourid1eac042016-04-20 02:27:01 +090034 };
35
36 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
37
38 TestObject(int foo, double bar)
39 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
40
41 TestObject(const TestObject& other)
Andrey Kraynovc7b46612017-09-14 02:15:44 +090042 : foo_(other.foo_),
43 bar_(other.bar_),
44 state_(State::COPY_CONSTRUCTED),
45 move_ctors_count_(other.move_ctors_count_) {}
mlamourid1eac042016-04-20 02:27:01 +090046
47 TestObject(TestObject&& other)
48 : foo_(std::move(other.foo_)),
49 bar_(std::move(other.bar_)),
Andrey Kraynovc7b46612017-09-14 02:15:44 +090050 state_(State::MOVE_CONSTRUCTED),
51 move_ctors_count_(other.move_ctors_count_ + 1) {
mlamourid1eac042016-04-20 02:27:01 +090052 other.state_ = State::MOVED_FROM;
53 }
54
55 TestObject& operator=(const TestObject& other) {
56 foo_ = other.foo_;
57 bar_ = other.bar_;
alshabalinc2ac5252016-05-27 17:01:31 +090058 state_ = State::COPY_ASSIGNED;
Andrey Kraynovc7b46612017-09-14 02:15:44 +090059 move_ctors_count_ = other.move_ctors_count_;
mlamourid1eac042016-04-20 02:27:01 +090060 return *this;
61 }
62
alshabalinc2ac5252016-05-27 17:01:31 +090063 TestObject& operator=(TestObject&& other) {
64 foo_ = other.foo_;
65 bar_ = other.bar_;
66 state_ = State::MOVE_ASSIGNED;
Andrey Kraynovc7b46612017-09-14 02:15:44 +090067 move_ctors_count_ = other.move_ctors_count_;
alshabalinc2ac5252016-05-27 17:01:31 +090068 other.state_ = State::MOVED_FROM;
69 return *this;
70 }
71
72 void Swap(TestObject* other) {
73 using std::swap;
74 swap(foo_, other->foo_);
75 swap(bar_, other->bar_);
Andrey Kraynovc7b46612017-09-14 02:15:44 +090076 swap(move_ctors_count_, other->move_ctors_count_);
alshabalinc2ac5252016-05-27 17:01:31 +090077 state_ = State::SWAPPED;
78 other->state_ = State::SWAPPED;
79 }
80
mlamourid1eac042016-04-20 02:27:01 +090081 bool operator==(const TestObject& other) const {
Hidehiko Abe04364262017-12-20 19:56:26 +090082 return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
mlamourid1eac042016-04-20 02:27:01 +090083 }
84
Hidehiko Abe04364262017-12-20 19:56:26 +090085 bool operator!=(const TestObject& other) const { return !(*this == other); }
86
mlamourid1eac042016-04-20 02:27:01 +090087 int foo() const { return foo_; }
88 State state() const { return state_; }
Andrey Kraynovc7b46612017-09-14 02:15:44 +090089 int move_ctors_count() const { return move_ctors_count_; }
mlamourid1eac042016-04-20 02:27:01 +090090
91 private:
92 int foo_;
93 double bar_;
94 State state_;
Andrey Kraynovc7b46612017-09-14 02:15:44 +090095 int move_ctors_count_ = 0;
mlamourid1eac042016-04-20 02:27:01 +090096};
97
alshabalinc2ac5252016-05-27 17:01:31 +090098// Implementing Swappable concept.
99void swap(TestObject& lhs, TestObject& rhs) {
100 lhs.Swap(&rhs);
101}
102
103class NonTriviallyDestructible {
104 ~NonTriviallyDestructible() {}
105};
106
Mounir Lamouria2067b22018-01-04 01:39:45 +0900107class DeletedDefaultConstructor {
108 public:
109 DeletedDefaultConstructor() = delete;
110 DeletedDefaultConstructor(int foo) : foo_(foo) {}
111
112 int foo() const { return foo_; }
113
114 private:
115 int foo_;
116};
117
Hidehiko Abe7cddfec2018-01-27 03:01:11 +0900118class DeletedCopy {
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900119 public:
Hidehiko Abe7cddfec2018-01-27 03:01:11 +0900120 explicit DeletedCopy(int foo) : foo_(foo) {}
121 DeletedCopy(const DeletedCopy&) = delete;
122 DeletedCopy(DeletedCopy&&) = default;
123
124 DeletedCopy& operator=(const DeletedCopy&) = delete;
125 DeletedCopy& operator=(DeletedCopy&&) = default;
126
127 int foo() const { return foo_; }
128
129 private:
130 int foo_;
131};
132
133class DeletedMove {
134 public:
135 explicit DeletedMove(int foo) : foo_(foo) {}
136 DeletedMove(const DeletedMove&) = default;
137 DeletedMove(DeletedMove&&) = delete;
138
139 DeletedMove& operator=(const DeletedMove&) = default;
140 DeletedMove& operator=(DeletedMove&&) = delete;
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900141
142 int foo() const { return foo_; }
143
144 private:
145 int foo_;
146};
147
148class NonTriviallyDestructibleDeletedCopyConstructor {
149 public:
150 explicit NonTriviallyDestructibleDeletedCopyConstructor(int foo)
151 : foo_(foo) {}
152 NonTriviallyDestructibleDeletedCopyConstructor(
153 const NonTriviallyDestructibleDeletedCopyConstructor&) = delete;
154 NonTriviallyDestructibleDeletedCopyConstructor(
155 NonTriviallyDestructibleDeletedCopyConstructor&&) = default;
156
157 ~NonTriviallyDestructibleDeletedCopyConstructor() {}
158
159 int foo() const { return foo_; }
160
161 private:
162 int foo_;
163};
164
Mounir Lamouria2067b22018-01-04 01:39:45 +0900165class DeleteNewOperators {
166 public:
167 void* operator new(size_t) = delete;
168 void* operator new(size_t, void*) = delete;
169 void* operator new[](size_t) = delete;
170 void* operator new[](size_t, void*) = delete;
171};
172
mlamourid1eac042016-04-20 02:27:01 +0900173} // anonymous namespace
174
danakjd61a1942017-04-06 02:59:27 +0900175static_assert(std::is_trivially_destructible<Optional<int>>::value,
alshabalinc2ac5252016-05-27 17:01:31 +0900176 "OptionalIsTriviallyDestructible");
177
178static_assert(
danakjd61a1942017-04-06 02:59:27 +0900179 !std::is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
alshabalinc2ac5252016-05-27 17:01:31 +0900180 "OptionalIsTriviallyDestructible");
181
Hidehiko Abe2fddef82018-03-07 12:45:37 +0900182static_assert(sizeof(Optional<int>) == sizeof(internal::OptionalBase<int>),
183 "internal::{Copy,Move}{Constructible,Assignable} structs "
184 "should be 0-sized");
185
mlamourid1eac042016-04-20 02:27:01 +0900186TEST(OptionalTest, DefaultConstructor) {
187 {
alshabalin2085f892016-10-25 18:56:41 +0900188 constexpr Optional<float> o;
mlamourid1eac042016-04-20 02:27:01 +0900189 EXPECT_FALSE(o);
190 }
191
192 {
193 Optional<std::string> o;
194 EXPECT_FALSE(o);
195 }
196
197 {
198 Optional<TestObject> o;
199 EXPECT_FALSE(o);
200 }
201}
202
203TEST(OptionalTest, CopyConstructor) {
204 {
Hidehiko Abec6977512018-01-08 18:38:16 +0900205 constexpr Optional<float> first(0.1f);
206 constexpr Optional<float> other(first);
mlamourid1eac042016-04-20 02:27:01 +0900207
208 EXPECT_TRUE(other);
209 EXPECT_EQ(other.value(), 0.1f);
210 EXPECT_EQ(first, other);
211 }
212
213 {
214 Optional<std::string> first("foo");
215 Optional<std::string> other(first);
216
217 EXPECT_TRUE(other);
218 EXPECT_EQ(other.value(), "foo");
219 EXPECT_EQ(first, other);
220 }
221
222 {
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900223 const Optional<std::string> first("foo");
224 Optional<std::string> other(first);
225
226 EXPECT_TRUE(other);
227 EXPECT_EQ(other.value(), "foo");
228 EXPECT_EQ(first, other);
229 }
230
231 {
mlamourid1eac042016-04-20 02:27:01 +0900232 Optional<TestObject> first(TestObject(3, 0.1));
233 Optional<TestObject> other(first);
234
235 EXPECT_TRUE(!!other);
236 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
237 EXPECT_TRUE(first == other);
238 }
239}
240
241TEST(OptionalTest, ValueConstructor) {
242 {
alshabalin2085f892016-10-25 18:56:41 +0900243 constexpr float value = 0.1f;
244 constexpr Optional<float> o(value);
245
mlamourid1eac042016-04-20 02:27:01 +0900246 EXPECT_TRUE(o);
alshabalin2085f892016-10-25 18:56:41 +0900247 EXPECT_EQ(value, o.value());
mlamourid1eac042016-04-20 02:27:01 +0900248 }
249
250 {
alshabalin2085f892016-10-25 18:56:41 +0900251 std::string value("foo");
252 Optional<std::string> o(value);
253
mlamourid1eac042016-04-20 02:27:01 +0900254 EXPECT_TRUE(o);
alshabalin2085f892016-10-25 18:56:41 +0900255 EXPECT_EQ(value, o.value());
mlamourid1eac042016-04-20 02:27:01 +0900256 }
257
258 {
alshabalin2085f892016-10-25 18:56:41 +0900259 TestObject value(3, 0.1);
260 Optional<TestObject> o(value);
261
262 EXPECT_TRUE(o);
263 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
264 EXPECT_EQ(value, o.value());
mlamourid1eac042016-04-20 02:27:01 +0900265 }
266}
267
268TEST(OptionalTest, MoveConstructor) {
269 {
Hidehiko Abec6977512018-01-08 18:38:16 +0900270 constexpr Optional<float> first(0.1f);
271 constexpr Optional<float> second(std::move(first));
mlamourid1eac042016-04-20 02:27:01 +0900272
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900273 EXPECT_TRUE(second.has_value());
mlamourid1eac042016-04-20 02:27:01 +0900274 EXPECT_EQ(second.value(), 0.1f);
275
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900276 EXPECT_TRUE(first.has_value());
mlamourid1eac042016-04-20 02:27:01 +0900277 }
278
279 {
280 Optional<std::string> first("foo");
281 Optional<std::string> second(std::move(first));
282
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900283 EXPECT_TRUE(second.has_value());
mlamourid1eac042016-04-20 02:27:01 +0900284 EXPECT_EQ("foo", second.value());
285
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900286 EXPECT_TRUE(first.has_value());
mlamourid1eac042016-04-20 02:27:01 +0900287 }
288
289 {
290 Optional<TestObject> first(TestObject(3, 0.1));
291 Optional<TestObject> second(std::move(first));
292
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900293 EXPECT_TRUE(second.has_value());
mlamourid1eac042016-04-20 02:27:01 +0900294 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
295 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
296
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900297 EXPECT_TRUE(first.has_value());
mlamourid1eac042016-04-20 02:27:01 +0900298 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
299 }
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900300
301 // Even if copy constructor is deleted, move constructor needs to work.
302 // Note that it couldn't be constexpr.
303 {
Hidehiko Abe7cddfec2018-01-27 03:01:11 +0900304 Optional<DeletedCopy> first(in_place, 42);
305 Optional<DeletedCopy> second(std::move(first));
306
307 EXPECT_TRUE(second.has_value());
308 EXPECT_EQ(42, second->foo());
309
310 EXPECT_TRUE(first.has_value());
311 }
312
313 {
314 Optional<DeletedMove> first(in_place, 42);
315 Optional<DeletedMove> second(std::move(first));
Hidehiko Abe3d6a7ef2018-01-20 08:50:24 +0900316
317 EXPECT_TRUE(second.has_value());
318 EXPECT_EQ(42, second->foo());
319
320 EXPECT_TRUE(first.has_value());
321 }
322
323 {
324 Optional<NonTriviallyDestructibleDeletedCopyConstructor> first(in_place,
325 42);
326 Optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
327 std::move(first));
328
329 EXPECT_TRUE(second.has_value());
330 EXPECT_EQ(42, second->foo());
331
332 EXPECT_TRUE(first.has_value());
333 }
mlamourid1eac042016-04-20 02:27:01 +0900334}
335
336TEST(OptionalTest, MoveValueConstructor) {
337 {
Daniel Cheng7a7fa9f2017-10-05 00:33:56 +0900338 constexpr float value = 0.1f;
339 constexpr Optional<float> o(std::move(value));
340
341 EXPECT_TRUE(o);
342 EXPECT_EQ(0.1f, o.value());
343 }
344
345 {
alshabalin2085f892016-10-25 18:56:41 +0900346 float value = 0.1f;
347 Optional<float> o(std::move(value));
mlamourid1eac042016-04-20 02:27:01 +0900348
alshabalin2085f892016-10-25 18:56:41 +0900349 EXPECT_TRUE(o);
350 EXPECT_EQ(0.1f, o.value());
mlamourid1eac042016-04-20 02:27:01 +0900351 }
352
353 {
alshabalin2085f892016-10-25 18:56:41 +0900354 std::string value("foo");
355 Optional<std::string> o(std::move(value));
mlamourid1eac042016-04-20 02:27:01 +0900356
alshabalin2085f892016-10-25 18:56:41 +0900357 EXPECT_TRUE(o);
358 EXPECT_EQ("foo", o.value());
mlamourid1eac042016-04-20 02:27:01 +0900359 }
360
361 {
alshabalin2085f892016-10-25 18:56:41 +0900362 TestObject value(3, 0.1);
363 Optional<TestObject> o(std::move(value));
mlamourid1eac042016-04-20 02:27:01 +0900364
alshabalin2085f892016-10-25 18:56:41 +0900365 EXPECT_TRUE(o);
366 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
367 EXPECT_EQ(TestObject(3, 0.1), o.value());
mlamourid1eac042016-04-20 02:27:01 +0900368 }
369}
370
Hidehiko Abe7b4511e2018-01-31 12:22:42 +0900371TEST(OptionalTest, ConvertingCopyConstructor) {
372 {
373 Optional<int> first(1);
374 Optional<double> second(first);
375 EXPECT_TRUE(second.has_value());
376 EXPECT_EQ(1.0, second.value());
377 }
378
379 // Make sure explicit is not marked for convertible case.
380 {
381 Optional<int> o(1);
382 ignore_result<Optional<double>>(o);
383 }
384}
385
386TEST(OptionalTest, ConvertingMoveConstructor) {
387 {
388 Optional<int> first(1);
389 Optional<double> second(std::move(first));
390 EXPECT_TRUE(second.has_value());
391 EXPECT_EQ(1.0, second.value());
392 }
393
394 // Make sure explicit is not marked for convertible case.
395 {
396 Optional<int> o(1);
397 ignore_result<Optional<double>>(std::move(o));
398 }
399
400 {
401 class Test1 {
402 public:
403 explicit Test1(int foo) : foo_(foo) {}
404
405 int foo() const { return foo_; }
406
407 private:
408 int foo_;
409 };
410
411 // Not copyable but convertible from Test1.
412 class Test2 {
413 public:
414 Test2(const Test2&) = delete;
415 explicit Test2(Test1&& other) : bar_(other.foo()) {}
416
417 double bar() const { return bar_; }
418
419 private:
420 double bar_;
421 };
422
423 Optional<Test1> first(in_place, 42);
424 Optional<Test2> second(std::move(first));
425 EXPECT_TRUE(second.has_value());
426 EXPECT_EQ(42.0, second->bar());
427 }
428}
429
mlamourid1eac042016-04-20 02:27:01 +0900430TEST(OptionalTest, ConstructorForwardArguments) {
431 {
Daniel Cheng7a7fa9f2017-10-05 00:33:56 +0900432 constexpr Optional<float> a(base::in_place, 0.1f);
433 EXPECT_TRUE(a);
434 EXPECT_EQ(0.1f, a.value());
435 }
436
437 {
mlamourid1eac042016-04-20 02:27:01 +0900438 Optional<float> a(base::in_place, 0.1f);
439 EXPECT_TRUE(a);
440 EXPECT_EQ(0.1f, a.value());
441 }
442
443 {
444 Optional<std::string> a(base::in_place, "foo");
445 EXPECT_TRUE(a);
446 EXPECT_EQ("foo", a.value());
447 }
448
449 {
450 Optional<TestObject> a(base::in_place, 0, 0.1);
451 EXPECT_TRUE(!!a);
452 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
453 }
454}
455
jdoerrief5922352018-01-03 18:13:45 +0900456TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
457 {
458 Optional<std::vector<int>> opt(in_place, {3, 1});
459 EXPECT_TRUE(opt);
460 EXPECT_THAT(*opt, ElementsAre(3, 1));
461 EXPECT_EQ(2u, opt->size());
462 }
463
464 {
465 Optional<std::vector<int>> opt(in_place, {3, 1}, std::allocator<int>());
466 EXPECT_TRUE(opt);
467 EXPECT_THAT(*opt, ElementsAre(3, 1));
468 EXPECT_EQ(2u, opt->size());
469 }
470}
471
Hidehiko Abe444a1ee2018-02-21 15:01:28 +0900472TEST(OptionalTest, ForwardConstructor) {
473 {
474 Optional<double> a(1);
475 EXPECT_TRUE(a.has_value());
476 EXPECT_EQ(1.0, a.value());
477 }
478
479 // Test that default type of 'U' is value_type.
480 {
481 struct TestData {
482 int a;
483 double b;
484 bool c;
485 };
486
487 Optional<TestData> a({1, 2.0, true});
488 EXPECT_TRUE(a.has_value());
489 EXPECT_EQ(1, a->a);
490 EXPECT_EQ(2.0, a->b);
491 EXPECT_TRUE(a->c);
492 }
493
494 // If T has a constructor with a param Optional<U>, and another ctor with a
495 // param U, then T(Optional<U>) should be used for Optional<T>(Optional<U>)
496 // constructor.
497 {
498 enum class ParamType {
499 DEFAULT_CONSTRUCTED,
500 COPY_CONSTRUCTED,
501 MOVE_CONSTRUCTED,
502 INT,
503 IN_PLACE,
504 OPTIONAL_INT,
505 };
506 struct Test {
507 Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
508 Test(const Test& param) : param_type(ParamType::COPY_CONSTRUCTED) {}
509 Test(Test&& param) : param_type(ParamType::MOVE_CONSTRUCTED) {}
510 explicit Test(int param) : param_type(ParamType::INT) {}
511 explicit Test(in_place_t param) : param_type(ParamType::IN_PLACE) {}
512 explicit Test(Optional<int> param)
513 : param_type(ParamType::OPTIONAL_INT) {}
514
515 ParamType param_type;
516 };
517
518 // Overload resolution with copy-conversion constructor.
519 {
520 const Optional<int> arg(in_place, 1);
521 Optional<Test> testee(arg);
522 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
523 }
524
525 // Overload resolution with move conversion constructor.
526 {
527 Optional<Test> testee(Optional<int>(in_place, 1));
528 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
529 }
530
531 // Default constructor should be used.
532 {
533 Optional<Test> testee(in_place);
534 EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
535 }
536 }
537
538 {
539 struct Test {
540 Test(int a) {} // NOLINT(runtime/explicit)
541 };
542 // If T is convertible from U, it is not marked as explicit.
543 static_assert(std::is_convertible<int, Test>::value,
544 "Int should be convertible to Test.");
545 ([](Optional<Test> param) {})(1);
546 }
547}
548
alshabalinc2ac5252016-05-27 17:01:31 +0900549TEST(OptionalTest, NulloptConstructor) {
alshabalin2085f892016-10-25 18:56:41 +0900550 constexpr Optional<int> a(base::nullopt);
alshabalinc2ac5252016-05-27 17:01:31 +0900551 EXPECT_FALSE(a);
552}
553
mlamourid1eac042016-04-20 02:27:01 +0900554TEST(OptionalTest, AssignValue) {
555 {
556 Optional<float> a;
557 EXPECT_FALSE(a);
558 a = 0.1f;
559 EXPECT_TRUE(a);
560
561 Optional<float> b(0.1f);
562 EXPECT_TRUE(a == b);
563 }
564
565 {
566 Optional<std::string> a;
567 EXPECT_FALSE(a);
568 a = std::string("foo");
569 EXPECT_TRUE(a);
570
571 Optional<std::string> b(std::string("foo"));
572 EXPECT_EQ(a, b);
573 }
574
575 {
576 Optional<TestObject> a;
577 EXPECT_FALSE(!!a);
578 a = TestObject(3, 0.1);
579 EXPECT_TRUE(!!a);
580
581 Optional<TestObject> b(TestObject(3, 0.1));
582 EXPECT_TRUE(a == b);
583 }
alshabalinc2ac5252016-05-27 17:01:31 +0900584
585 {
586 Optional<TestObject> a = TestObject(4, 1.0);
587 EXPECT_TRUE(!!a);
588 a = TestObject(3, 0.1);
589 EXPECT_TRUE(!!a);
590
591 Optional<TestObject> b(TestObject(3, 0.1));
592 EXPECT_TRUE(a == b);
593 }
mlamourid1eac042016-04-20 02:27:01 +0900594}
595
596TEST(OptionalTest, AssignObject) {
597 {
598 Optional<float> a;
599 Optional<float> b(0.1f);
600 a = b;
601
602 EXPECT_TRUE(a);
603 EXPECT_EQ(a.value(), 0.1f);
604 EXPECT_EQ(a, b);
605 }
606
607 {
608 Optional<std::string> a;
609 Optional<std::string> b("foo");
610 a = b;
611
612 EXPECT_TRUE(a);
613 EXPECT_EQ(a.value(), "foo");
614 EXPECT_EQ(a, b);
615 }
616
617 {
618 Optional<TestObject> a;
619 Optional<TestObject> b(TestObject(3, 0.1));
620 a = b;
621
622 EXPECT_TRUE(!!a);
623 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
624 EXPECT_TRUE(a == b);
625 }
alshabalinc2ac5252016-05-27 17:01:31 +0900626
627 {
628 Optional<TestObject> a(TestObject(4, 1.0));
629 Optional<TestObject> b(TestObject(3, 0.1));
630 a = b;
631
632 EXPECT_TRUE(!!a);
633 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
634 EXPECT_TRUE(a == b);
635 }
Hidehiko Abe7cddfec2018-01-27 03:01:11 +0900636
637 {
638 Optional<DeletedMove> a(in_place, 42);
639 Optional<DeletedMove> b;
640 b = a;
641
642 EXPECT_TRUE(!!a);
643 EXPECT_TRUE(!!b);
644 EXPECT_EQ(a->foo(), b->foo());
645 }
646
647 {
648 Optional<DeletedMove> a(in_place, 42);
649 Optional<DeletedMove> b(in_place, 1);
650 b = a;
651
652 EXPECT_TRUE(!!a);
653 EXPECT_TRUE(!!b);
654 EXPECT_EQ(a->foo(), b->foo());
655 }
Hidehiko Abe395057e2018-02-23 13:24:12 +0900656
657 // Converting assignment.
658 {
659 Optional<int> a(in_place, 1);
660 Optional<double> b;
661 b = a;
662
663 EXPECT_TRUE(!!a);
664 EXPECT_TRUE(!!b);
665 EXPECT_EQ(1, a.value());
666 EXPECT_EQ(1.0, b.value());
667 }
668
669 {
670 Optional<int> a(in_place, 42);
671 Optional<double> b(in_place, 1);
672 b = a;
673
674 EXPECT_TRUE(!!a);
675 EXPECT_TRUE(!!b);
676 EXPECT_EQ(42, a.value());
677 EXPECT_EQ(42.0, b.value());
678 }
679
680 {
681 Optional<int> a;
682 Optional<double> b(in_place, 1);
683 b = a;
684 EXPECT_FALSE(!!a);
685 EXPECT_FALSE(!!b);
686 }
mlamourid1eac042016-04-20 02:27:01 +0900687}
688
689TEST(OptionalTest, AssignObject_rvalue) {
690 {
691 Optional<float> a;
692 Optional<float> b(0.1f);
693 a = std::move(b);
694
695 EXPECT_TRUE(a);
696 EXPECT_TRUE(b);
697 EXPECT_EQ(0.1f, a.value());
698 }
699
700 {
701 Optional<std::string> a;
702 Optional<std::string> b("foo");
703 a = std::move(b);
704
705 EXPECT_TRUE(a);
706 EXPECT_TRUE(b);
707 EXPECT_EQ("foo", a.value());
708 }
709
710 {
711 Optional<TestObject> a;
712 Optional<TestObject> b(TestObject(3, 0.1));
713 a = std::move(b);
714
715 EXPECT_TRUE(!!a);
716 EXPECT_TRUE(!!b);
717 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
718
719 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
720 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
721 }
alshabalinc2ac5252016-05-27 17:01:31 +0900722
723 {
724 Optional<TestObject> a(TestObject(4, 1.0));
725 Optional<TestObject> b(TestObject(3, 0.1));
726 a = std::move(b);
727
728 EXPECT_TRUE(!!a);
729 EXPECT_TRUE(!!b);
730 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
731
732 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
733 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
734 }
Hidehiko Abe7cddfec2018-01-27 03:01:11 +0900735
736 {
737 Optional<DeletedMove> a(in_place, 42);
738 Optional<DeletedMove> b;
739 b = std::move(a);
740
741 EXPECT_TRUE(!!a);
742 EXPECT_TRUE(!!b);
743 EXPECT_EQ(42, b->foo());
744 }
745
746 {
747 Optional<DeletedMove> a(in_place, 42);
748 Optional<DeletedMove> b(in_place, 1);
749 b = std::move(a);
750
751 EXPECT_TRUE(!!a);
752 EXPECT_TRUE(!!b);
753 EXPECT_EQ(42, b->foo());
754 }
Hidehiko Abe395057e2018-02-23 13:24:12 +0900755
756 // Converting assignment.
757 {
758 Optional<int> a(in_place, 1);
759 Optional<double> b;
760 b = std::move(a);
761
762 EXPECT_TRUE(!!a);
763 EXPECT_TRUE(!!b);
764 EXPECT_EQ(1.0, b.value());
765 }
766
767 {
768 Optional<int> a(in_place, 42);
769 Optional<double> b(in_place, 1);
770 b = std::move(a);
771
772 EXPECT_TRUE(!!a);
773 EXPECT_TRUE(!!b);
774 EXPECT_EQ(42.0, b.value());
775 }
776
777 {
778 Optional<int> a;
779 Optional<double> b(in_place, 1);
780 b = std::move(a);
781
782 EXPECT_FALSE(!!a);
783 EXPECT_FALSE(!!b);
784 }
mlamourid1eac042016-04-20 02:27:01 +0900785}
786
787TEST(OptionalTest, AssignNull) {
788 {
789 Optional<float> a(0.1f);
790 Optional<float> b(0.2f);
791 a = base::nullopt;
792 b = base::nullopt;
793 EXPECT_EQ(a, b);
794 }
795
796 {
797 Optional<std::string> a("foo");
798 Optional<std::string> b("bar");
799 a = base::nullopt;
800 b = base::nullopt;
801 EXPECT_EQ(a, b);
802 }
803
804 {
805 Optional<TestObject> a(TestObject(3, 0.1));
806 Optional<TestObject> b(TestObject(4, 1.0));
807 a = base::nullopt;
808 b = base::nullopt;
809 EXPECT_TRUE(a == b);
810 }
811}
812
Hidehiko Abe395057e2018-02-23 13:24:12 +0900813TEST(OptionalTest, AssignOverload) {
814 struct Test1 {
815 enum class State {
816 CONSTRUCTED,
817 MOVED,
818 };
819 State state = State::CONSTRUCTED;
820 };
821
822 // Here, Optional<Test2> can be assigned from Optioanl<Test1>.
823 // In case of move, marks MOVED to Test1 instance.
824 struct Test2 {
825 enum class State {
826 DEFAULT_CONSTRUCTED,
827 COPY_CONSTRUCTED_FROM_TEST1,
828 MOVE_CONSTRUCTED_FROM_TEST1,
829 COPY_ASSIGNED_FROM_TEST1,
830 MOVE_ASSIGNED_FROM_TEST1,
831 };
832
833 Test2() = default;
834 explicit Test2(const Test1& test1)
835 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
836 explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
837 test1.state = Test1::State::MOVED;
838 }
839 Test2& operator=(const Test1& test1) {
840 state = State::COPY_ASSIGNED_FROM_TEST1;
841 return *this;
842 }
843 Test2& operator=(Test1&& test1) {
844 state = State::MOVE_ASSIGNED_FROM_TEST1;
845 test1.state = Test1::State::MOVED;
846 return *this;
847 }
848
849 State state = State::DEFAULT_CONSTRUCTED;
850 };
851
852 {
853 Optional<Test1> a(in_place);
854 Optional<Test2> b;
855
856 b = a;
857 EXPECT_TRUE(!!a);
858 EXPECT_TRUE(!!b);
859 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
860 EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
861 }
862
863 {
864 Optional<Test1> a(in_place);
865 Optional<Test2> b(in_place);
866
867 b = a;
868 EXPECT_TRUE(!!a);
869 EXPECT_TRUE(!!b);
870 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
871 EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
872 }
873
874 {
875 Optional<Test1> a(in_place);
876 Optional<Test2> b;
877
878 b = std::move(a);
879 EXPECT_TRUE(!!a);
880 EXPECT_TRUE(!!b);
881 EXPECT_EQ(Test1::State::MOVED, a->state);
882 EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
883 }
884
885 {
886 Optional<Test1> a(in_place);
887 Optional<Test2> b(in_place);
888
889 b = std::move(a);
890 EXPECT_TRUE(!!a);
891 EXPECT_TRUE(!!b);
892 EXPECT_EQ(Test1::State::MOVED, a->state);
893 EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
894 }
895
896 // Similar to Test2, but Test3 also has copy/move ctor and assign operators
897 // from Optional<Test1>, too. In this case, for a = b where a is
898 // Optional<Test3> and b is Optional<Test1>,
899 // Optional<T>::operator=(U&&) where U is Optional<Test1> should be used
900 // rather than Optional<T>::operator=(Optional<U>&&) where U is Test1.
901 struct Test3 {
902 enum class State {
903 DEFAULT_CONSTRUCTED,
904 COPY_CONSTRUCTED_FROM_TEST1,
905 MOVE_CONSTRUCTED_FROM_TEST1,
906 COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
907 MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
908 COPY_ASSIGNED_FROM_TEST1,
909 MOVE_ASSIGNED_FROM_TEST1,
910 COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
911 MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
912 };
913
914 Test3() = default;
915 explicit Test3(const Test1& test1)
916 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
917 explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
918 test1.state = Test1::State::MOVED;
919 }
920 explicit Test3(const Optional<Test1>& test1)
921 : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
922 explicit Test3(Optional<Test1>&& test1)
923 : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
924 // In the following senarios, given |test1| should always have value.
925 DCHECK(test1.has_value());
926 test1->state = Test1::State::MOVED;
927 }
928 Test3& operator=(const Test1& test1) {
929 state = State::COPY_ASSIGNED_FROM_TEST1;
930 return *this;
931 }
932 Test3& operator=(Test1&& test1) {
933 state = State::MOVE_ASSIGNED_FROM_TEST1;
934 test1.state = Test1::State::MOVED;
935 return *this;
936 }
937 Test3& operator=(const Optional<Test1>& test1) {
938 state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
939 return *this;
940 }
941 Test3& operator=(Optional<Test1>&& test1) {
942 state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
943 // In the following senarios, given |test1| should always have value.
944 DCHECK(test1.has_value());
945 test1->state = Test1::State::MOVED;
946 return *this;
947 }
948
949 State state = State::DEFAULT_CONSTRUCTED;
950 };
951
952 {
953 Optional<Test1> a(in_place);
954 Optional<Test3> b;
955
956 b = a;
957 EXPECT_TRUE(!!a);
958 EXPECT_TRUE(!!b);
959 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
960 EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
961 }
962
963 {
964 Optional<Test1> a(in_place);
965 Optional<Test3> b(in_place);
966
967 b = a;
968 EXPECT_TRUE(!!a);
969 EXPECT_TRUE(!!b);
970 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
971 EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
972 }
973
974 {
975 Optional<Test1> a(in_place);
976 Optional<Test3> b;
977
978 b = std::move(a);
979 EXPECT_TRUE(!!a);
980 EXPECT_TRUE(!!b);
981 EXPECT_EQ(Test1::State::MOVED, a->state);
982 EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
983 }
984
985 {
986 Optional<Test1> a(in_place);
987 Optional<Test3> b(in_place);
988
989 b = std::move(a);
990 EXPECT_TRUE(!!a);
991 EXPECT_TRUE(!!b);
992 EXPECT_EQ(Test1::State::MOVED, a->state);
993 EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
994 }
995}
996
mlamourid1eac042016-04-20 02:27:01 +0900997TEST(OptionalTest, OperatorStar) {
998 {
999 Optional<float> a(0.1f);
1000 EXPECT_EQ(a.value(), *a);
1001 }
1002
1003 {
1004 Optional<std::string> a("foo");
1005 EXPECT_EQ(a.value(), *a);
1006 }
1007
1008 {
1009 Optional<TestObject> a(TestObject(3, 0.1));
1010 EXPECT_EQ(a.value(), *a);
1011 }
1012}
1013
1014TEST(OptionalTest, OperatorStar_rvalue) {
1015 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
1016 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
1017 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
1018}
1019
1020TEST(OptionalTest, OperatorArrow) {
1021 Optional<TestObject> a(TestObject(3, 0.1));
1022 EXPECT_EQ(a->foo(), 3);
1023}
1024
1025TEST(OptionalTest, Value_rvalue) {
1026 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
1027 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
1028 EXPECT_TRUE(TestObject(3, 0.1) ==
1029 Optional<TestObject>(TestObject(3, 0.1)).value());
1030}
1031
1032TEST(OptionalTest, ValueOr) {
1033 {
1034 Optional<float> a;
1035 EXPECT_EQ(0.0f, a.value_or(0.0f));
1036
1037 a = 0.1f;
1038 EXPECT_EQ(0.1f, a.value_or(0.0f));
1039
1040 a = base::nullopt;
1041 EXPECT_EQ(0.0f, a.value_or(0.0f));
1042 }
1043
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001044 // value_or() can be constexpr.
1045 {
1046 constexpr Optional<int> a(in_place, 1);
1047 constexpr int value = a.value_or(10);
1048 EXPECT_EQ(1, value);
1049 }
1050 {
1051 constexpr Optional<int> a;
1052 constexpr int value = a.value_or(10);
1053 EXPECT_EQ(10, value);
1054 }
1055
mlamourid1eac042016-04-20 02:27:01 +09001056 {
1057 Optional<std::string> a;
1058 EXPECT_EQ("bar", a.value_or("bar"));
1059
1060 a = std::string("foo");
1061 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
1062
1063 a = base::nullopt;
1064 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
1065 }
1066
1067 {
1068 Optional<TestObject> a;
1069 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1070
1071 a = TestObject(3, 0.1);
1072 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
1073
1074 a = base::nullopt;
1075 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1076 }
1077}
1078
1079TEST(OptionalTest, Swap_bothNoValue) {
1080 Optional<TestObject> a, b;
1081 a.swap(b);
1082
1083 EXPECT_FALSE(a);
1084 EXPECT_FALSE(b);
1085 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1086 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1087}
1088
1089TEST(OptionalTest, Swap_inHasValue) {
1090 Optional<TestObject> a(TestObject(1, 0.3));
1091 Optional<TestObject> b;
1092 a.swap(b);
1093
1094 EXPECT_FALSE(a);
1095
1096 EXPECT_TRUE(!!b);
1097 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1098 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1099}
1100
1101TEST(OptionalTest, Swap_outHasValue) {
1102 Optional<TestObject> a;
1103 Optional<TestObject> b(TestObject(1, 0.3));
1104 a.swap(b);
1105
1106 EXPECT_TRUE(!!a);
1107 EXPECT_FALSE(!!b);
1108 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1109 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1110}
1111
1112TEST(OptionalTest, Swap_bothValue) {
1113 Optional<TestObject> a(TestObject(0, 0.1));
1114 Optional<TestObject> b(TestObject(1, 0.3));
1115 a.swap(b);
1116
1117 EXPECT_TRUE(!!a);
1118 EXPECT_TRUE(!!b);
1119 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1120 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
alshabalinc2ac5252016-05-27 17:01:31 +09001121 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1122 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
mlamourid1eac042016-04-20 02:27:01 +09001123}
1124
1125TEST(OptionalTest, Emplace) {
1126 {
1127 Optional<float> a(0.1f);
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001128 EXPECT_EQ(0.3f, a.emplace(0.3f));
mlamourid1eac042016-04-20 02:27:01 +09001129
1130 EXPECT_TRUE(a);
1131 EXPECT_EQ(0.3f, a.value());
1132 }
1133
1134 {
1135 Optional<std::string> a("foo");
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001136 EXPECT_EQ("bar", a.emplace("bar"));
mlamourid1eac042016-04-20 02:27:01 +09001137
1138 EXPECT_TRUE(a);
1139 EXPECT_EQ("bar", a.value());
1140 }
1141
1142 {
1143 Optional<TestObject> a(TestObject(0, 0.1));
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001144 EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
mlamourid1eac042016-04-20 02:27:01 +09001145
1146 EXPECT_TRUE(!!a);
1147 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
1148 }
jdoerrief5922352018-01-03 18:13:45 +09001149
1150 {
1151 Optional<std::vector<int>> a;
1152 auto& ref = a.emplace({2, 3});
1153 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1154 EXPECT_TRUE(a);
1155 EXPECT_THAT(*a, ElementsAre(2, 3));
1156 EXPECT_EQ(&ref, &*a);
1157 }
1158
1159 {
1160 Optional<std::vector<int>> a;
1161 auto& ref = a.emplace({4, 5}, std::allocator<int>());
1162 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1163 EXPECT_TRUE(a);
1164 EXPECT_THAT(*a, ElementsAre(4, 5));
1165 EXPECT_EQ(&ref, &*a);
1166 }
mlamourid1eac042016-04-20 02:27:01 +09001167}
1168
1169TEST(OptionalTest, Equals_TwoEmpty) {
1170 Optional<int> a;
1171 Optional<int> b;
1172
1173 EXPECT_TRUE(a == b);
1174}
1175
1176TEST(OptionalTest, Equals_TwoEquals) {
1177 Optional<int> a(1);
1178 Optional<int> b(1);
1179
1180 EXPECT_TRUE(a == b);
1181}
1182
1183TEST(OptionalTest, Equals_OneEmpty) {
1184 Optional<int> a;
1185 Optional<int> b(1);
1186
1187 EXPECT_FALSE(a == b);
1188}
1189
1190TEST(OptionalTest, Equals_TwoDifferent) {
1191 Optional<int> a(0);
1192 Optional<int> b(1);
1193
1194 EXPECT_FALSE(a == b);
1195}
1196
Hidehiko Abe04364262017-12-20 19:56:26 +09001197TEST(OptionalTest, Equals_DifferentType) {
1198 Optional<int> a(0);
1199 Optional<double> b(0);
1200
1201 EXPECT_TRUE(a == b);
1202}
1203
mlamourid1eac042016-04-20 02:27:01 +09001204TEST(OptionalTest, NotEquals_TwoEmpty) {
1205 Optional<int> a;
1206 Optional<int> b;
1207
1208 EXPECT_FALSE(a != b);
1209}
1210
1211TEST(OptionalTest, NotEquals_TwoEquals) {
1212 Optional<int> a(1);
1213 Optional<int> b(1);
1214
1215 EXPECT_FALSE(a != b);
1216}
1217
1218TEST(OptionalTest, NotEquals_OneEmpty) {
1219 Optional<int> a;
1220 Optional<int> b(1);
1221
1222 EXPECT_TRUE(a != b);
1223}
1224
1225TEST(OptionalTest, NotEquals_TwoDifferent) {
1226 Optional<int> a(0);
1227 Optional<int> b(1);
1228
1229 EXPECT_TRUE(a != b);
1230}
1231
Hidehiko Abe04364262017-12-20 19:56:26 +09001232TEST(OptionalTest, NotEquals_DifferentType) {
1233 Optional<int> a(0);
1234 Optional<double> b(0.0);
1235
1236 EXPECT_FALSE(a != b);
1237}
1238
mlamourid1eac042016-04-20 02:27:01 +09001239TEST(OptionalTest, Less_LeftEmpty) {
1240 Optional<int> l;
1241 Optional<int> r(1);
1242
1243 EXPECT_TRUE(l < r);
1244}
1245
1246TEST(OptionalTest, Less_RightEmpty) {
1247 Optional<int> l(1);
1248 Optional<int> r;
1249
1250 EXPECT_FALSE(l < r);
1251}
1252
1253TEST(OptionalTest, Less_BothEmpty) {
1254 Optional<int> l;
1255 Optional<int> r;
1256
1257 EXPECT_FALSE(l < r);
1258}
1259
1260TEST(OptionalTest, Less_BothValues) {
1261 {
1262 Optional<int> l(1);
1263 Optional<int> r(2);
1264
1265 EXPECT_TRUE(l < r);
1266 }
1267 {
1268 Optional<int> l(2);
1269 Optional<int> r(1);
1270
1271 EXPECT_FALSE(l < r);
1272 }
1273 {
1274 Optional<int> l(1);
1275 Optional<int> r(1);
1276
1277 EXPECT_FALSE(l < r);
1278 }
1279}
1280
Hidehiko Abe04364262017-12-20 19:56:26 +09001281TEST(OptionalTest, Less_DifferentType) {
1282 Optional<int> l(1);
1283 Optional<double> r(2.0);
1284
1285 EXPECT_TRUE(l < r);
1286}
1287
mlamourid1eac042016-04-20 02:27:01 +09001288TEST(OptionalTest, LessEq_LeftEmpty) {
1289 Optional<int> l;
1290 Optional<int> r(1);
1291
1292 EXPECT_TRUE(l <= r);
1293}
1294
1295TEST(OptionalTest, LessEq_RightEmpty) {
1296 Optional<int> l(1);
1297 Optional<int> r;
1298
1299 EXPECT_FALSE(l <= r);
1300}
1301
1302TEST(OptionalTest, LessEq_BothEmpty) {
1303 Optional<int> l;
1304 Optional<int> r;
1305
1306 EXPECT_TRUE(l <= r);
1307}
1308
1309TEST(OptionalTest, LessEq_BothValues) {
1310 {
1311 Optional<int> l(1);
1312 Optional<int> r(2);
1313
1314 EXPECT_TRUE(l <= r);
1315 }
1316 {
1317 Optional<int> l(2);
1318 Optional<int> r(1);
1319
1320 EXPECT_FALSE(l <= r);
1321 }
1322 {
1323 Optional<int> l(1);
1324 Optional<int> r(1);
1325
1326 EXPECT_TRUE(l <= r);
1327 }
1328}
1329
Hidehiko Abe04364262017-12-20 19:56:26 +09001330TEST(OptionalTest, LessEq_DifferentType) {
1331 Optional<int> l(1);
1332 Optional<double> r(2.0);
1333
1334 EXPECT_TRUE(l <= r);
1335}
1336
mlamourid1eac042016-04-20 02:27:01 +09001337TEST(OptionalTest, Greater_BothEmpty) {
1338 Optional<int> l;
1339 Optional<int> r;
1340
1341 EXPECT_FALSE(l > r);
1342}
1343
1344TEST(OptionalTest, Greater_LeftEmpty) {
1345 Optional<int> l;
1346 Optional<int> r(1);
1347
1348 EXPECT_FALSE(l > r);
1349}
1350
1351TEST(OptionalTest, Greater_RightEmpty) {
1352 Optional<int> l(1);
1353 Optional<int> r;
1354
1355 EXPECT_TRUE(l > r);
1356}
1357
1358TEST(OptionalTest, Greater_BothValue) {
1359 {
1360 Optional<int> l(1);
1361 Optional<int> r(2);
1362
1363 EXPECT_FALSE(l > r);
1364 }
1365 {
1366 Optional<int> l(2);
1367 Optional<int> r(1);
1368
1369 EXPECT_TRUE(l > r);
1370 }
1371 {
1372 Optional<int> l(1);
1373 Optional<int> r(1);
1374
1375 EXPECT_FALSE(l > r);
1376 }
1377}
1378
Hidehiko Abe04364262017-12-20 19:56:26 +09001379TEST(OptionalTest, Greater_DifferentType) {
1380 Optional<int> l(1);
1381 Optional<double> r(2.0);
1382
1383 EXPECT_FALSE(l > r);
1384}
1385
mlamourid1eac042016-04-20 02:27:01 +09001386TEST(OptionalTest, GreaterEq_BothEmpty) {
1387 Optional<int> l;
1388 Optional<int> r;
1389
1390 EXPECT_TRUE(l >= r);
1391}
1392
1393TEST(OptionalTest, GreaterEq_LeftEmpty) {
1394 Optional<int> l;
1395 Optional<int> r(1);
1396
1397 EXPECT_FALSE(l >= r);
1398}
1399
1400TEST(OptionalTest, GreaterEq_RightEmpty) {
1401 Optional<int> l(1);
1402 Optional<int> r;
1403
1404 EXPECT_TRUE(l >= r);
1405}
1406
1407TEST(OptionalTest, GreaterEq_BothValue) {
1408 {
1409 Optional<int> l(1);
1410 Optional<int> r(2);
1411
1412 EXPECT_FALSE(l >= r);
1413 }
1414 {
1415 Optional<int> l(2);
1416 Optional<int> r(1);
1417
1418 EXPECT_TRUE(l >= r);
1419 }
1420 {
1421 Optional<int> l(1);
1422 Optional<int> r(1);
1423
1424 EXPECT_TRUE(l >= r);
1425 }
1426}
1427
Hidehiko Abe04364262017-12-20 19:56:26 +09001428TEST(OptionalTest, GreaterEq_DifferentType) {
1429 Optional<int> l(1);
1430 Optional<double> r(2.0);
1431
1432 EXPECT_FALSE(l >= r);
1433}
1434
mlamourid1eac042016-04-20 02:27:01 +09001435TEST(OptionalTest, OptNullEq) {
1436 {
1437 Optional<int> opt;
1438 EXPECT_TRUE(opt == base::nullopt);
1439 }
1440 {
1441 Optional<int> opt(1);
1442 EXPECT_FALSE(opt == base::nullopt);
1443 }
1444}
1445
1446TEST(OptionalTest, NullOptEq) {
1447 {
1448 Optional<int> opt;
1449 EXPECT_TRUE(base::nullopt == opt);
1450 }
1451 {
1452 Optional<int> opt(1);
1453 EXPECT_FALSE(base::nullopt == opt);
1454 }
1455}
1456
1457TEST(OptionalTest, OptNullNotEq) {
1458 {
1459 Optional<int> opt;
1460 EXPECT_FALSE(opt != base::nullopt);
1461 }
1462 {
1463 Optional<int> opt(1);
1464 EXPECT_TRUE(opt != base::nullopt);
1465 }
1466}
1467
1468TEST(OptionalTest, NullOptNotEq) {
1469 {
1470 Optional<int> opt;
1471 EXPECT_FALSE(base::nullopt != opt);
1472 }
1473 {
1474 Optional<int> opt(1);
1475 EXPECT_TRUE(base::nullopt != opt);
1476 }
1477}
1478
1479TEST(OptionalTest, OptNullLower) {
1480 {
1481 Optional<int> opt;
1482 EXPECT_FALSE(opt < base::nullopt);
1483 }
1484 {
1485 Optional<int> opt(1);
1486 EXPECT_FALSE(opt < base::nullopt);
1487 }
1488}
1489
1490TEST(OptionalTest, NullOptLower) {
1491 {
1492 Optional<int> opt;
1493 EXPECT_FALSE(base::nullopt < opt);
1494 }
1495 {
1496 Optional<int> opt(1);
1497 EXPECT_TRUE(base::nullopt < opt);
1498 }
1499}
1500
1501TEST(OptionalTest, OptNullLowerEq) {
1502 {
1503 Optional<int> opt;
1504 EXPECT_TRUE(opt <= base::nullopt);
1505 }
1506 {
1507 Optional<int> opt(1);
1508 EXPECT_FALSE(opt <= base::nullopt);
1509 }
1510}
1511
1512TEST(OptionalTest, NullOptLowerEq) {
1513 {
1514 Optional<int> opt;
1515 EXPECT_TRUE(base::nullopt <= opt);
1516 }
1517 {
1518 Optional<int> opt(1);
1519 EXPECT_TRUE(base::nullopt <= opt);
1520 }
1521}
1522
1523TEST(OptionalTest, OptNullGreater) {
1524 {
1525 Optional<int> opt;
1526 EXPECT_FALSE(opt > base::nullopt);
1527 }
1528 {
1529 Optional<int> opt(1);
1530 EXPECT_TRUE(opt > base::nullopt);
1531 }
1532}
1533
1534TEST(OptionalTest, NullOptGreater) {
1535 {
1536 Optional<int> opt;
1537 EXPECT_FALSE(base::nullopt > opt);
1538 }
1539 {
1540 Optional<int> opt(1);
1541 EXPECT_FALSE(base::nullopt > opt);
1542 }
1543}
1544
1545TEST(OptionalTest, OptNullGreaterEq) {
1546 {
1547 Optional<int> opt;
1548 EXPECT_TRUE(opt >= base::nullopt);
1549 }
1550 {
1551 Optional<int> opt(1);
1552 EXPECT_TRUE(opt >= base::nullopt);
1553 }
1554}
1555
1556TEST(OptionalTest, NullOptGreaterEq) {
1557 {
1558 Optional<int> opt;
1559 EXPECT_TRUE(base::nullopt >= opt);
1560 }
1561 {
1562 Optional<int> opt(1);
1563 EXPECT_FALSE(base::nullopt >= opt);
1564 }
1565}
1566
1567TEST(OptionalTest, ValueEq_Empty) {
1568 Optional<int> opt;
1569 EXPECT_FALSE(opt == 1);
1570}
1571
1572TEST(OptionalTest, ValueEq_NotEmpty) {
1573 {
1574 Optional<int> opt(0);
1575 EXPECT_FALSE(opt == 1);
1576 }
1577 {
1578 Optional<int> opt(1);
1579 EXPECT_TRUE(opt == 1);
1580 }
1581}
1582
Hidehiko Abe04364262017-12-20 19:56:26 +09001583TEST(OptionalTest, ValueEq_DifferentType) {
1584 Optional<int> opt(0);
1585 EXPECT_TRUE(opt == 0.0);
1586}
1587
mlamourid1eac042016-04-20 02:27:01 +09001588TEST(OptionalTest, EqValue_Empty) {
1589 Optional<int> opt;
1590 EXPECT_FALSE(1 == opt);
1591}
1592
1593TEST(OptionalTest, EqValue_NotEmpty) {
1594 {
1595 Optional<int> opt(0);
1596 EXPECT_FALSE(1 == opt);
1597 }
1598 {
1599 Optional<int> opt(1);
1600 EXPECT_TRUE(1 == opt);
1601 }
1602}
1603
Hidehiko Abe04364262017-12-20 19:56:26 +09001604TEST(OptionalTest, EqValue_DifferentType) {
1605 Optional<int> opt(0);
1606 EXPECT_TRUE(0.0 == opt);
1607}
1608
mlamourid1eac042016-04-20 02:27:01 +09001609TEST(OptionalTest, ValueNotEq_Empty) {
1610 Optional<int> opt;
1611 EXPECT_TRUE(opt != 1);
1612}
1613
1614TEST(OptionalTest, ValueNotEq_NotEmpty) {
1615 {
1616 Optional<int> opt(0);
1617 EXPECT_TRUE(opt != 1);
1618 }
1619 {
1620 Optional<int> opt(1);
1621 EXPECT_FALSE(opt != 1);
1622 }
1623}
1624
Hidehiko Abe04364262017-12-20 19:56:26 +09001625TEST(OPtionalTest, ValueNotEq_DifferentType) {
1626 Optional<int> opt(0);
1627 EXPECT_FALSE(opt != 0.0);
1628}
1629
mlamourid1eac042016-04-20 02:27:01 +09001630TEST(OptionalTest, NotEqValue_Empty) {
1631 Optional<int> opt;
1632 EXPECT_TRUE(1 != opt);
1633}
1634
1635TEST(OptionalTest, NotEqValue_NotEmpty) {
1636 {
1637 Optional<int> opt(0);
1638 EXPECT_TRUE(1 != opt);
1639 }
1640 {
1641 Optional<int> opt(1);
1642 EXPECT_FALSE(1 != opt);
1643 }
1644}
1645
Hidehiko Abe04364262017-12-20 19:56:26 +09001646TEST(OptionalTest, NotEqValue_DifferentType) {
1647 Optional<int> opt(0);
1648 EXPECT_FALSE(0.0 != opt);
1649}
1650
mlamourid1eac042016-04-20 02:27:01 +09001651TEST(OptionalTest, ValueLess_Empty) {
1652 Optional<int> opt;
1653 EXPECT_TRUE(opt < 1);
1654}
1655
1656TEST(OptionalTest, ValueLess_NotEmpty) {
1657 {
1658 Optional<int> opt(0);
1659 EXPECT_TRUE(opt < 1);
1660 }
1661 {
1662 Optional<int> opt(1);
1663 EXPECT_FALSE(opt < 1);
1664 }
1665 {
1666 Optional<int> opt(2);
1667 EXPECT_FALSE(opt < 1);
1668 }
1669}
1670
Hidehiko Abe04364262017-12-20 19:56:26 +09001671TEST(OPtionalTest, ValueLess_DifferentType) {
1672 Optional<int> opt(0);
1673 EXPECT_TRUE(opt < 1.0);
1674}
1675
mlamourid1eac042016-04-20 02:27:01 +09001676TEST(OptionalTest, LessValue_Empty) {
1677 Optional<int> opt;
1678 EXPECT_FALSE(1 < opt);
1679}
1680
1681TEST(OptionalTest, LessValue_NotEmpty) {
1682 {
1683 Optional<int> opt(0);
1684 EXPECT_FALSE(1 < opt);
1685 }
1686 {
1687 Optional<int> opt(1);
1688 EXPECT_FALSE(1 < opt);
1689 }
1690 {
1691 Optional<int> opt(2);
1692 EXPECT_TRUE(1 < opt);
1693 }
1694}
1695
Hidehiko Abe04364262017-12-20 19:56:26 +09001696TEST(OptionalTest, LessValue_DifferentType) {
1697 Optional<int> opt(0);
1698 EXPECT_FALSE(0.0 < opt);
1699}
1700
mlamourid1eac042016-04-20 02:27:01 +09001701TEST(OptionalTest, ValueLessEq_Empty) {
1702 Optional<int> opt;
1703 EXPECT_TRUE(opt <= 1);
1704}
1705
1706TEST(OptionalTest, ValueLessEq_NotEmpty) {
1707 {
1708 Optional<int> opt(0);
1709 EXPECT_TRUE(opt <= 1);
1710 }
1711 {
1712 Optional<int> opt(1);
1713 EXPECT_TRUE(opt <= 1);
1714 }
1715 {
1716 Optional<int> opt(2);
1717 EXPECT_FALSE(opt <= 1);
1718 }
1719}
1720
Hidehiko Abe04364262017-12-20 19:56:26 +09001721TEST(OptionalTest, ValueLessEq_DifferentType) {
1722 Optional<int> opt(0);
1723 EXPECT_TRUE(opt <= 0.0);
1724}
1725
mlamourid1eac042016-04-20 02:27:01 +09001726TEST(OptionalTest, LessEqValue_Empty) {
1727 Optional<int> opt;
1728 EXPECT_FALSE(1 <= opt);
1729}
1730
1731TEST(OptionalTest, LessEqValue_NotEmpty) {
1732 {
1733 Optional<int> opt(0);
1734 EXPECT_FALSE(1 <= opt);
1735 }
1736 {
1737 Optional<int> opt(1);
1738 EXPECT_TRUE(1 <= opt);
1739 }
1740 {
1741 Optional<int> opt(2);
1742 EXPECT_TRUE(1 <= opt);
1743 }
1744}
1745
Hidehiko Abe04364262017-12-20 19:56:26 +09001746TEST(OptionalTest, LessEqValue_DifferentType) {
1747 Optional<int> opt(0);
1748 EXPECT_TRUE(0.0 <= opt);
1749}
1750
mlamourid1eac042016-04-20 02:27:01 +09001751TEST(OptionalTest, ValueGreater_Empty) {
1752 Optional<int> opt;
1753 EXPECT_FALSE(opt > 1);
1754}
1755
1756TEST(OptionalTest, ValueGreater_NotEmpty) {
1757 {
1758 Optional<int> opt(0);
1759 EXPECT_FALSE(opt > 1);
1760 }
1761 {
1762 Optional<int> opt(1);
1763 EXPECT_FALSE(opt > 1);
1764 }
1765 {
1766 Optional<int> opt(2);
1767 EXPECT_TRUE(opt > 1);
1768 }
1769}
1770
Hidehiko Abe04364262017-12-20 19:56:26 +09001771TEST(OptionalTest, ValueGreater_DifferentType) {
1772 Optional<int> opt(0);
1773 EXPECT_FALSE(opt > 0.0);
1774}
1775
mlamourid1eac042016-04-20 02:27:01 +09001776TEST(OptionalTest, GreaterValue_Empty) {
1777 Optional<int> opt;
1778 EXPECT_TRUE(1 > opt);
1779}
1780
1781TEST(OptionalTest, GreaterValue_NotEmpty) {
1782 {
1783 Optional<int> opt(0);
1784 EXPECT_TRUE(1 > opt);
1785 }
1786 {
1787 Optional<int> opt(1);
1788 EXPECT_FALSE(1 > opt);
1789 }
1790 {
1791 Optional<int> opt(2);
1792 EXPECT_FALSE(1 > opt);
1793 }
1794}
1795
Hidehiko Abe04364262017-12-20 19:56:26 +09001796TEST(OptionalTest, GreaterValue_DifferentType) {
1797 Optional<int> opt(0);
1798 EXPECT_FALSE(0.0 > opt);
1799}
1800
mlamourid1eac042016-04-20 02:27:01 +09001801TEST(OptionalTest, ValueGreaterEq_Empty) {
1802 Optional<int> opt;
1803 EXPECT_FALSE(opt >= 1);
1804}
1805
1806TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1807 {
1808 Optional<int> opt(0);
1809 EXPECT_FALSE(opt >= 1);
1810 }
1811 {
1812 Optional<int> opt(1);
1813 EXPECT_TRUE(opt >= 1);
1814 }
1815 {
1816 Optional<int> opt(2);
1817 EXPECT_TRUE(opt >= 1);
1818 }
1819}
1820
Hidehiko Abe04364262017-12-20 19:56:26 +09001821TEST(OptionalTest, ValueGreaterEq_DifferentType) {
1822 Optional<int> opt(0);
1823 EXPECT_TRUE(opt <= 0.0);
1824}
1825
mlamourid1eac042016-04-20 02:27:01 +09001826TEST(OptionalTest, GreaterEqValue_Empty) {
1827 Optional<int> opt;
1828 EXPECT_TRUE(1 >= opt);
1829}
1830
1831TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1832 {
1833 Optional<int> opt(0);
1834 EXPECT_TRUE(1 >= opt);
1835 }
1836 {
1837 Optional<int> opt(1);
1838 EXPECT_TRUE(1 >= opt);
1839 }
1840 {
1841 Optional<int> opt(2);
1842 EXPECT_FALSE(1 >= opt);
1843 }
1844}
1845
Hidehiko Abe04364262017-12-20 19:56:26 +09001846TEST(OptionalTest, GreaterEqValue_DifferentType) {
1847 Optional<int> opt(0);
1848 EXPECT_TRUE(0.0 >= opt);
1849}
1850
mlamourid1eac042016-04-20 02:27:01 +09001851TEST(OptionalTest, NotEquals) {
1852 {
1853 Optional<float> a(0.1f);
1854 Optional<float> b(0.2f);
1855 EXPECT_NE(a, b);
1856 }
1857
1858 {
1859 Optional<std::string> a("foo");
1860 Optional<std::string> b("bar");
1861 EXPECT_NE(a, b);
1862 }
1863
1864 {
Hidehiko Abe04364262017-12-20 19:56:26 +09001865 Optional<int> a(1);
1866 Optional<double> b(2);
1867 EXPECT_NE(a, b);
1868 }
1869
1870 {
mlamourid1eac042016-04-20 02:27:01 +09001871 Optional<TestObject> a(TestObject(3, 0.1));
1872 Optional<TestObject> b(TestObject(4, 1.0));
1873 EXPECT_TRUE(a != b);
1874 }
1875}
1876
1877TEST(OptionalTest, NotEqualsNull) {
1878 {
1879 Optional<float> a(0.1f);
1880 Optional<float> b(0.1f);
1881 b = base::nullopt;
1882 EXPECT_NE(a, b);
1883 }
1884
1885 {
1886 Optional<std::string> a("foo");
1887 Optional<std::string> b("foo");
1888 b = base::nullopt;
1889 EXPECT_NE(a, b);
1890 }
1891
1892 {
1893 Optional<TestObject> a(TestObject(3, 0.1));
1894 Optional<TestObject> b(TestObject(3, 0.1));
1895 b = base::nullopt;
1896 EXPECT_TRUE(a != b);
1897 }
1898}
1899
1900TEST(OptionalTest, MakeOptional) {
1901 {
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001902 Optional<float> o = make_optional(32.f);
mlamourid1eac042016-04-20 02:27:01 +09001903 EXPECT_TRUE(o);
1904 EXPECT_EQ(32.f, *o);
1905
1906 float value = 3.f;
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001907 o = make_optional(std::move(value));
mlamourid1eac042016-04-20 02:27:01 +09001908 EXPECT_TRUE(o);
1909 EXPECT_EQ(3.f, *o);
1910 }
1911
1912 {
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001913 Optional<std::string> o = make_optional(std::string("foo"));
mlamourid1eac042016-04-20 02:27:01 +09001914 EXPECT_TRUE(o);
1915 EXPECT_EQ("foo", *o);
1916
1917 std::string value = "bar";
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001918 o = make_optional(std::move(value));
mlamourid1eac042016-04-20 02:27:01 +09001919 EXPECT_TRUE(o);
1920 EXPECT_EQ(std::string("bar"), *o);
1921 }
1922
1923 {
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001924 Optional<TestObject> o = make_optional(TestObject(3, 0.1));
mlamourid1eac042016-04-20 02:27:01 +09001925 EXPECT_TRUE(!!o);
1926 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1927
1928 TestObject value = TestObject(0, 0.42);
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001929 o = make_optional(std::move(value));
mlamourid1eac042016-04-20 02:27:01 +09001930 EXPECT_TRUE(!!o);
1931 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1932 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
alshabalinc2ac5252016-05-27 17:01:31 +09001933 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
mlamourid1eac042016-04-20 02:27:01 +09001934
1935 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1936 base::make_optional(std::move(value))->state());
1937 }
jdoerrief5922352018-01-03 18:13:45 +09001938
1939 {
Hidehiko Abeb4b2efc2018-02-23 16:01:30 +09001940 struct Test {
1941 Test(int a, double b, bool c) : a(a), b(b), c(c) {}
1942
1943 int a;
1944 double b;
1945 bool c;
1946 };
1947
1948 Optional<Test> o = make_optional<Test>(1, 2.0, true);
1949 EXPECT_TRUE(!!o);
1950 EXPECT_EQ(1, o->a);
1951 EXPECT_EQ(2.0, o->b);
1952 EXPECT_TRUE(o->c);
1953 }
1954
1955 {
jdoerrief5922352018-01-03 18:13:45 +09001956 auto str1 = make_optional<std::string>({'1', '2', '3'});
1957 EXPECT_EQ("123", *str1);
1958
1959 auto str2 =
1960 make_optional<std::string>({'a', 'b', 'c'}, std::allocator<char>());
1961 EXPECT_EQ("abc", *str2);
1962 }
mlamourid1eac042016-04-20 02:27:01 +09001963}
1964
1965TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1966 Optional<TestObject> a, b;
1967 base::swap(a, b);
1968
1969 EXPECT_FALSE(!!a);
1970 EXPECT_FALSE(!!b);
1971 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1972 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1973}
1974
1975TEST(OptionalTest, NonMemberSwap_inHasValue) {
1976 Optional<TestObject> a(TestObject(1, 0.3));
1977 Optional<TestObject> b;
1978 base::swap(a, b);
1979
1980 EXPECT_FALSE(!!a);
1981 EXPECT_TRUE(!!b);
1982 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1983 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1984}
1985
1986TEST(OptionalTest, NonMemberSwap_outHasValue) {
1987 Optional<TestObject> a;
1988 Optional<TestObject> b(TestObject(1, 0.3));
1989 base::swap(a, b);
1990
1991 EXPECT_TRUE(!!a);
1992 EXPECT_FALSE(!!b);
1993 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1994 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1995}
1996
1997TEST(OptionalTest, NonMemberSwap_bothValue) {
1998 Optional<TestObject> a(TestObject(0, 0.1));
1999 Optional<TestObject> b(TestObject(1, 0.3));
2000 base::swap(a, b);
2001
2002 EXPECT_TRUE(!!a);
2003 EXPECT_TRUE(!!b);
2004 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2005 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
alshabalinc2ac5252016-05-27 17:01:31 +09002006 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
2007 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
mlamourid1eac042016-04-20 02:27:01 +09002008}
2009
2010TEST(OptionalTest, Hash_OptionalReflectsInternal) {
2011 {
2012 std::hash<int> int_hash;
2013 std::hash<Optional<int>> opt_int_hash;
2014
2015 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
2016 }
2017
2018 {
2019 std::hash<std::string> str_hash;
2020 std::hash<Optional<std::string>> opt_str_hash;
2021
2022 EXPECT_EQ(str_hash(std::string("foobar")),
2023 opt_str_hash(Optional<std::string>(std::string("foobar"))));
2024 }
2025}
2026
2027TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
2028 std::hash<Optional<int>> opt_int_hash;
2029 std::hash<Optional<std::string>> opt_str_hash;
2030
2031 EXPECT_EQ(opt_str_hash(Optional<std::string>()),
2032 opt_int_hash(Optional<int>()));
2033}
2034
2035TEST(OptionalTest, Hash_UseInSet) {
2036 std::set<Optional<int>> setOptInt;
2037
2038 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2039
2040 setOptInt.insert(Optional<int>(3));
2041 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2042 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
2043}
2044
mlamouri1b26dd12016-08-10 21:24:15 +09002045TEST(OptionalTest, HasValue) {
2046 Optional<int> a;
2047 EXPECT_FALSE(a.has_value());
2048
2049 a = 42;
2050 EXPECT_TRUE(a.has_value());
2051
2052 a = nullopt;
2053 EXPECT_FALSE(a.has_value());
2054
2055 a = 0;
2056 EXPECT_TRUE(a.has_value());
2057
2058 a = Optional<int>();
2059 EXPECT_FALSE(a.has_value());
2060}
2061
2062TEST(OptionalTest, Reset_int) {
2063 Optional<int> a(0);
2064 EXPECT_TRUE(a.has_value());
2065 EXPECT_EQ(0, a.value());
2066
2067 a.reset();
2068 EXPECT_FALSE(a.has_value());
2069 EXPECT_EQ(-1, a.value_or(-1));
2070}
2071
2072TEST(OptionalTest, Reset_Object) {
2073 Optional<TestObject> a(TestObject(0, 0.1));
2074 EXPECT_TRUE(a.has_value());
2075 EXPECT_EQ(TestObject(0, 0.1), a.value());
2076
2077 a.reset();
2078 EXPECT_FALSE(a.has_value());
2079 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
2080}
2081
2082TEST(OptionalTest, Reset_NoOp) {
2083 Optional<int> a;
2084 EXPECT_FALSE(a.has_value());
2085
2086 a.reset();
2087 EXPECT_FALSE(a.has_value());
2088}
2089
Andrey Kraynovc7b46612017-09-14 02:15:44 +09002090TEST(OptionalTest, AssignFromRValue) {
2091 Optional<TestObject> a;
2092 EXPECT_FALSE(a.has_value());
2093
2094 TestObject obj;
2095 a = std::move(obj);
2096 EXPECT_TRUE(a.has_value());
2097 EXPECT_EQ(1, a->move_ctors_count());
2098}
2099
Mounir Lamouria2067b22018-01-04 01:39:45 +09002100TEST(OptionalTest, DontCallDefaultCtor) {
2101 Optional<DeletedDefaultConstructor> a;
2102 EXPECT_FALSE(a.has_value());
2103
2104 a = base::make_optional<DeletedDefaultConstructor>(42);
2105 EXPECT_TRUE(a.has_value());
2106 EXPECT_EQ(42, a->foo());
2107}
2108
2109TEST(OptionalTest, DontCallNewMemberFunction) {
2110 Optional<DeleteNewOperators> a;
2111 EXPECT_FALSE(a.has_value());
2112
2113 a = DeleteNewOperators();
2114 EXPECT_TRUE(a.has_value());
2115}
2116
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002117TEST(OptionalTest, Noexcept) {
Fyodor Gayokhoe3be3742018-03-23 03:09:21 +09002118 // Trivial copy ctor, non-trivial move ctor, nothrow move assign.
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002119 struct Test1 {
Fyodor Gayokhoe3be3742018-03-23 03:09:21 +09002120 Test1(const Test1&) = default;
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002121 Test1(Test1&&) {}
2122 Test1& operator=(Test1&&) = default;
2123 };
Fyodor Gayokhoe3be3742018-03-23 03:09:21 +09002124 // Non-trivial copy ctor, trivial move ctor, throw move assign.
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002125 struct Test2 {
Fyodor Gayokhoe3be3742018-03-23 03:09:21 +09002126 Test2(const Test2&) {}
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002127 Test2(Test2&&) = default;
2128 Test2& operator=(Test2&&) { return *this; }
2129 };
Fyodor Gayokhoe3be3742018-03-23 03:09:21 +09002130 // Trivial copy ctor, non-trivial nothrow move ctor.
2131 struct Test3 {
2132 Test3(const Test3&) = default;
2133 Test3(Test3&&) noexcept {}
2134 };
2135 // Non-trivial copy ctor, non-trivial nothrow move ctor.
2136 struct Test4 {
2137 Test4(const Test4&) {}
2138 Test4(Test4&&) noexcept {}
2139 };
2140 // Non-trivial copy ctor, non-trivial move ctor.
2141 struct Test5 {
2142 Test5(const Test5&) {}
2143 Test5(Test5&&) {}
2144 };
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002145
2146 static_assert(
2147 noexcept(Optional<int>(std::declval<Optional<int>>())),
Fyodor Gayokhoe3be3742018-03-23 03:09:21 +09002148 "move constructor for noexcept move-constructible T must be noexcept "
2149 "(trivial copy, trivial move)");
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002150 static_assert(
2151 !noexcept(Optional<Test1>(std::declval<Optional<Test1>>())),
2152 "move constructor for non-noexcept move-constructible T must not be "
Fyodor Gayokhoe3be3742018-03-23 03:09:21 +09002153 "noexcept (trivial copy)");
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002154 static_assert(
2155 noexcept(Optional<Test2>(std::declval<Optional<Test2>>())),
Fyodor Gayokhoe3be3742018-03-23 03:09:21 +09002156 "move constructor for noexcept move-constructible T must be noexcept "
2157 "(non-trivial copy, trivial move)");
2158 static_assert(
2159 noexcept(Optional<Test3>(std::declval<Optional<Test3>>())),
2160 "move constructor for noexcept move-constructible T must be noexcept "
2161 "(trivial copy, non-trivial move)");
2162 static_assert(
2163 noexcept(Optional<Test4>(std::declval<Optional<Test4>>())),
2164 "move constructor for noexcept move-constructible T must be noexcept "
2165 "(non-trivial copy, non-trivial move)");
2166 static_assert(
2167 !noexcept(Optional<Test5>(std::declval<Optional<Test5>>())),
2168 "move constructor for non-noexcept move-constructible T must not be "
2169 "noexcept (non-trivial copy)");
Hidehiko Abe3dc1a922018-02-24 21:47:07 +09002170
2171 static_assert(
2172 noexcept(std::declval<Optional<int>>() = std::declval<Optional<int>>()),
2173 "move assign for noexcept move-constructible/move-assignable T "
2174 "must be noexcept");
2175 static_assert(
2176 !noexcept(std::declval<Optional<Test1>>() =
2177 std::declval<Optional<Test1>>()),
2178 "move assign for non-noexcept move-constructible T must not be noexcept");
2179 static_assert(
2180 !noexcept(std::declval<Optional<Test2>>() =
2181 std::declval<Optional<Test2>>()),
2182 "move assign for non-noexcept move-assignable T must not be noexcept");
2183}
2184
mlamourid1eac042016-04-20 02:27:01 +09002185} // namespace base