1 // Copyright 2016 The Chromium Authors
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 <memory>
6 #include <optional>
7 #include <set>
8 #include <string>
9 #include <type_traits>
10 #include <vector>
11
12 #include "base/template_util.h"
13 #include "base/test/gtest_util.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 using ::testing::ElementsAre;
18
19 namespace base {
20
21 namespace {
22
23 // Object used to test complex object with std::optional<T> in addition of the
24 // move semantics.
25 class TestObject {
26 public:
27 enum class State {
28 DEFAULT_CONSTRUCTED,
29 VALUE_CONSTRUCTED,
30 COPY_CONSTRUCTED,
31 MOVE_CONSTRUCTED,
32 MOVED_FROM,
33 COPY_ASSIGNED,
34 MOVE_ASSIGNED,
35 SWAPPED,
36 };
37
TestObject()38 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
39
TestObject(int foo,double bar)40 TestObject(int foo, double bar)
41 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
42
TestObject(const TestObject & other)43 TestObject(const TestObject& other)
44 : foo_(other.foo_),
45 bar_(other.bar_),
46 state_(State::COPY_CONSTRUCTED),
47 move_ctors_count_(other.move_ctors_count_) {}
48
TestObject(TestObject && other)49 TestObject(TestObject&& other)
50 : foo_(std::move(other.foo_)),
51 bar_(std::move(other.bar_)),
52 state_(State::MOVE_CONSTRUCTED),
53 move_ctors_count_(other.move_ctors_count_ + 1) {
54 other.state_ = State::MOVED_FROM;
55 }
56
operator =(const TestObject & other)57 TestObject& operator=(const TestObject& other) {
58 foo_ = other.foo_;
59 bar_ = other.bar_;
60 state_ = State::COPY_ASSIGNED;
61 move_ctors_count_ = other.move_ctors_count_;
62 return *this;
63 }
64
operator =(TestObject && other)65 TestObject& operator=(TestObject&& other) {
66 foo_ = other.foo_;
67 bar_ = other.bar_;
68 state_ = State::MOVE_ASSIGNED;
69 move_ctors_count_ = other.move_ctors_count_;
70 other.state_ = State::MOVED_FROM;
71 return *this;
72 }
73
Swap(TestObject * other)74 void Swap(TestObject* other) {
75 using std::swap;
76 swap(foo_, other->foo_);
77 swap(bar_, other->bar_);
78 swap(move_ctors_count_, other->move_ctors_count_);
79 state_ = State::SWAPPED;
80 other->state_ = State::SWAPPED;
81 }
82
operator ==(const TestObject & other) const83 bool operator==(const TestObject& other) const {
84 return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
85 }
86
operator !=(const TestObject & other) const87 bool operator!=(const TestObject& other) const { return !(*this == other); }
88
foo() const89 int foo() const { return foo_; }
state() const90 State state() const { return state_; }
move_ctors_count() const91 int move_ctors_count() const { return move_ctors_count_; }
92
93 private:
94 int foo_;
95 double bar_;
96 State state_;
97 int move_ctors_count_ = 0;
98 };
99
100 // Implementing Swappable concept.
swap(TestObject & lhs,TestObject & rhs)101 void swap(TestObject& lhs, TestObject& rhs) {
102 lhs.Swap(&rhs);
103 }
104
105 class NonTriviallyDestructible {
106 public:
~NonTriviallyDestructible()107 ~NonTriviallyDestructible() {}
108 };
109
110 class DeletedDefaultConstructor {
111 public:
112 DeletedDefaultConstructor() = delete;
DeletedDefaultConstructor(int foo)113 DeletedDefaultConstructor(int foo) : foo_(foo) {}
114
foo() const115 int foo() const { return foo_; }
116
117 private:
118 int foo_;
119 };
120
121 class DeletedCopy {
122 public:
DeletedCopy(int foo)123 explicit DeletedCopy(int foo) : foo_(foo) {}
124 DeletedCopy(const DeletedCopy&) = delete;
125 DeletedCopy(DeletedCopy&&) = default;
126
127 DeletedCopy& operator=(const DeletedCopy&) = delete;
128 DeletedCopy& operator=(DeletedCopy&&) = default;
129
foo() const130 int foo() const { return foo_; }
131
132 private:
133 int foo_;
134 };
135
136 class DeletedMove {
137 public:
DeletedMove(int foo)138 explicit DeletedMove(int foo) : foo_(foo) {}
139 DeletedMove(const DeletedMove&) = default;
140 DeletedMove(DeletedMove&&) = delete;
141
142 DeletedMove& operator=(const DeletedMove&) = default;
143 DeletedMove& operator=(DeletedMove&&) = delete;
144
foo() const145 int foo() const { return foo_; }
146
147 private:
148 int foo_;
149 };
150
151 class NonTriviallyDestructibleDeletedCopyConstructor {
152 public:
NonTriviallyDestructibleDeletedCopyConstructor(int foo)153 explicit NonTriviallyDestructibleDeletedCopyConstructor(int foo)
154 : foo_(foo) {}
155 NonTriviallyDestructibleDeletedCopyConstructor(
156 const NonTriviallyDestructibleDeletedCopyConstructor&) = delete;
157 NonTriviallyDestructibleDeletedCopyConstructor(
158 NonTriviallyDestructibleDeletedCopyConstructor&&) = default;
159
~NonTriviallyDestructibleDeletedCopyConstructor()160 ~NonTriviallyDestructibleDeletedCopyConstructor() {}
161
foo() const162 int foo() const { return foo_; }
163
164 private:
165 int foo_;
166 };
167
168 class DeleteNewOperators {
169 public:
170 void* operator new(size_t) = delete;
171 void* operator new(size_t, void*) = delete;
172 void* operator new[](size_t) = delete;
173 void* operator new[](size_t, void*) = delete;
174 };
175
176 class TriviallyDestructibleOverloadAddressOf {
177 public:
178 // Unfortunately, since this can be called as part of placement-new (if it
179 // forgets to call std::addressof), we're uninitialized. So, about the best
180 // we can do is signal a test failure here if either operator& is called.
operator &()181 TriviallyDestructibleOverloadAddressOf* operator&() {
182 EXPECT_TRUE(false);
183 return this;
184 }
185
186 // So we can test the const version of operator->.
operator &() const187 const TriviallyDestructibleOverloadAddressOf* operator&() const {
188 EXPECT_TRUE(false);
189 return this;
190 }
191
const_method() const192 void const_method() const {}
nonconst_method()193 void nonconst_method() {}
194 };
195
196 class NonTriviallyDestructibleOverloadAddressOf {
197 public:
~NonTriviallyDestructibleOverloadAddressOf()198 ~NonTriviallyDestructibleOverloadAddressOf() {}
operator &()199 NonTriviallyDestructibleOverloadAddressOf* operator&() {
200 EXPECT_TRUE(false);
201 return this;
202 }
203 };
204
205 } // anonymous namespace
206
207 static_assert(std::is_trivially_destructible_v<std::optional<int>>,
208 "OptionalIsTriviallyDestructible");
209
210 static_assert(
211 !std::is_trivially_destructible_v<std::optional<NonTriviallyDestructible>>,
212 "OptionalIsTriviallyDestructible");
213
TEST(OptionalTest,DefaultConstructor)214 TEST(OptionalTest, DefaultConstructor) {
215 {
216 constexpr std::optional<float> o;
217 EXPECT_FALSE(o);
218 }
219
220 {
221 std::optional<std::string> o;
222 EXPECT_FALSE(o);
223 }
224
225 {
226 std::optional<TestObject> o;
227 EXPECT_FALSE(o);
228 }
229 }
230
TEST(OptionalTest,CopyConstructor)231 TEST(OptionalTest, CopyConstructor) {
232 {
233 constexpr std::optional<float> first(0.1f);
234 constexpr std::optional<float> other(first);
235
236 EXPECT_TRUE(other);
237 EXPECT_EQ(other.value(), 0.1f);
238 EXPECT_EQ(first, other);
239 }
240
241 {
242 std::optional<std::string> first("foo");
243 std::optional<std::string> other(first);
244
245 EXPECT_TRUE(other);
246 EXPECT_EQ(other.value(), "foo");
247 EXPECT_EQ(first, other);
248 }
249
250 {
251 const std::optional<std::string> first("foo");
252 std::optional<std::string> other(first);
253
254 EXPECT_TRUE(other);
255 EXPECT_EQ(other.value(), "foo");
256 EXPECT_EQ(first, other);
257 }
258
259 {
260 std::optional<TestObject> first(TestObject(3, 0.1));
261 std::optional<TestObject> other(first);
262
263 EXPECT_TRUE(!!other);
264 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
265 EXPECT_TRUE(first == other);
266 }
267 }
268
TEST(OptionalTest,ValueConstructor)269 TEST(OptionalTest, ValueConstructor) {
270 {
271 constexpr float value = 0.1f;
272 constexpr std::optional<float> o(value);
273
274 EXPECT_TRUE(o);
275 EXPECT_EQ(value, o.value());
276 }
277
278 {
279 std::string value("foo");
280 std::optional<std::string> o(value);
281
282 EXPECT_TRUE(o);
283 EXPECT_EQ(value, o.value());
284 }
285
286 {
287 TestObject value(3, 0.1);
288 std::optional<TestObject> o(value);
289
290 EXPECT_TRUE(o);
291 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
292 EXPECT_EQ(value, o.value());
293 }
294 }
295
TEST(OptionalTest,MoveConstructor)296 TEST(OptionalTest, MoveConstructor) {
297 // NOLINTBEGIN(bugprone-use-after-move)
298 {
299 constexpr std::optional<float> first(0.1f);
300 constexpr std::optional<float> second(std::move(first));
301
302 EXPECT_TRUE(second.has_value());
303 EXPECT_EQ(second.value(), 0.1f);
304
305 EXPECT_TRUE(first.has_value());
306 }
307
308 {
309 std::optional<std::string> first("foo");
310 std::optional<std::string> second(std::move(first));
311
312 EXPECT_TRUE(second.has_value());
313 EXPECT_EQ("foo", second.value());
314
315 EXPECT_TRUE(first.has_value());
316 }
317
318 {
319 std::optional<TestObject> first(TestObject(3, 0.1));
320 std::optional<TestObject> second(std::move(first));
321
322 EXPECT_TRUE(second.has_value());
323 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
324 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
325
326 EXPECT_TRUE(first.has_value());
327 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
328 }
329
330 // Even if copy constructor is deleted, move constructor needs to work.
331 // Note that it couldn't be constexpr.
332 {
333 std::optional<DeletedCopy> first(std::in_place, 42);
334 std::optional<DeletedCopy> second(std::move(first));
335
336 EXPECT_TRUE(second.has_value());
337 EXPECT_EQ(42, second->foo());
338
339 EXPECT_TRUE(first.has_value());
340 }
341
342 {
343 std::optional<DeletedMove> first(std::in_place, 42);
344 std::optional<DeletedMove> second(std::move(first));
345
346 EXPECT_TRUE(second.has_value());
347 EXPECT_EQ(42, second->foo());
348
349 EXPECT_TRUE(first.has_value());
350 }
351
352 {
353 std::optional<NonTriviallyDestructibleDeletedCopyConstructor> first(
354 std::in_place, 42);
355 std::optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
356 std::move(first));
357
358 EXPECT_TRUE(second.has_value());
359 EXPECT_EQ(42, second->foo());
360
361 EXPECT_TRUE(first.has_value());
362 }
363 // NOLINTEND(bugprone-use-after-move)
364 }
365
TEST(OptionalTest,MoveValueConstructor)366 TEST(OptionalTest, MoveValueConstructor) {
367 {
368 constexpr float value = 0.1f;
369 constexpr std::optional<float> o(std::move(value));
370
371 EXPECT_TRUE(o);
372 EXPECT_EQ(0.1f, o.value());
373 }
374
375 {
376 float value = 0.1f;
377 std::optional<float> o(std::move(value));
378
379 EXPECT_TRUE(o);
380 EXPECT_EQ(0.1f, o.value());
381 }
382
383 {
384 std::string value("foo");
385 std::optional<std::string> o(std::move(value));
386
387 EXPECT_TRUE(o);
388 EXPECT_EQ("foo", o.value());
389 }
390
391 {
392 TestObject value(3, 0.1);
393 std::optional<TestObject> o(std::move(value));
394
395 EXPECT_TRUE(o);
396 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
397 EXPECT_EQ(TestObject(3, 0.1), o.value());
398 }
399 }
400
TEST(OptionalTest,ConvertingCopyConstructor)401 TEST(OptionalTest, ConvertingCopyConstructor) {
402 {
403 std::optional<int> first(1);
404 std::optional<double> second(first);
405 EXPECT_TRUE(second.has_value());
406 EXPECT_EQ(1.0, second.value());
407 }
408
409 // Make sure explicit is not marked for convertible case.
410 { [[maybe_unused]] std::optional<int> o(1); }
411 }
412
TEST(OptionalTest,ConvertingMoveConstructor)413 TEST(OptionalTest, ConvertingMoveConstructor) {
414 {
415 std::optional<int> first(1);
416 std::optional<double> second(std::move(first));
417 EXPECT_TRUE(second.has_value());
418 EXPECT_EQ(1.0, second.value());
419 }
420
421 // Make sure explicit is not marked for convertible case.
422 { [[maybe_unused]] std::optional<int> o(1); }
423
424 {
425 class Test1 {
426 public:
427 explicit Test1(int foo) : foo_(foo) {}
428
429 int foo() const { return foo_; }
430
431 private:
432 int foo_;
433 };
434
435 // Not copyable but convertible from Test1.
436 class Test2 {
437 public:
438 Test2(const Test2&) = delete;
439 explicit Test2(Test1&& other) : bar_(other.foo()) {}
440
441 double bar() const { return bar_; }
442
443 private:
444 double bar_;
445 };
446
447 std::optional<Test1> first(std::in_place, 42);
448 std::optional<Test2> second(std::move(first));
449 EXPECT_TRUE(second.has_value());
450 EXPECT_EQ(42.0, second->bar());
451 }
452 }
453
TEST(OptionalTest,ConstructorForwardArguments)454 TEST(OptionalTest, ConstructorForwardArguments) {
455 {
456 constexpr std::optional<float> a(std::in_place, 0.1f);
457 EXPECT_TRUE(a);
458 EXPECT_EQ(0.1f, a.value());
459 }
460
461 {
462 std::optional<float> a(std::in_place, 0.1f);
463 EXPECT_TRUE(a);
464 EXPECT_EQ(0.1f, a.value());
465 }
466
467 {
468 std::optional<std::string> a(std::in_place, "foo");
469 EXPECT_TRUE(a);
470 EXPECT_EQ("foo", a.value());
471 }
472
473 {
474 std::optional<TestObject> a(std::in_place, 0, 0.1);
475 EXPECT_TRUE(!!a);
476 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
477 }
478 }
479
TEST(OptionalTest,ConstructorForwardInitListAndArguments)480 TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
481 {
482 std::optional<std::vector<int>> opt(std::in_place, {3, 1});
483 EXPECT_TRUE(opt);
484 EXPECT_THAT(*opt, ElementsAre(3, 1));
485 EXPECT_EQ(2u, opt->size());
486 }
487
488 {
489 std::optional<std::vector<int>> opt(std::in_place, {3, 1},
490 std::allocator<int>());
491 EXPECT_TRUE(opt);
492 EXPECT_THAT(*opt, ElementsAre(3, 1));
493 EXPECT_EQ(2u, opt->size());
494 }
495 }
496
TEST(OptionalTest,ForwardConstructor)497 TEST(OptionalTest, ForwardConstructor) {
498 {
499 std::optional<double> a(1);
500 EXPECT_TRUE(a.has_value());
501 EXPECT_EQ(1.0, a.value());
502 }
503
504 // Test that default type of 'U' is value_type.
505 {
506 struct TestData {
507 int a;
508 double b;
509 bool c;
510 };
511
512 std::optional<TestData> a({1, 2.0, true});
513 EXPECT_TRUE(a.has_value());
514 EXPECT_EQ(1, a->a);
515 EXPECT_EQ(2.0, a->b);
516 EXPECT_TRUE(a->c);
517 }
518
519 // If T has a constructor with a param std::optional<U>, and another ctor
520 // with a param U, then T(std::optional<U>) should be used for
521 // std::optional<T>(std::optional<U>) constructor.
522 {
523 enum class ParamType {
524 DEFAULT_CONSTRUCTED,
525 COPY_CONSTRUCTED,
526 MOVE_CONSTRUCTED,
527 INT,
528 IN_PLACE,
529 OPTIONAL_INT,
530 };
531 struct Test {
532 Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
533 Test(const Test& param) : param_type(ParamType::COPY_CONSTRUCTED) {}
534 Test(Test&& param) : param_type(ParamType::MOVE_CONSTRUCTED) {}
535 explicit Test(int param) : param_type(ParamType::INT) {}
536 explicit Test(std::in_place_t param) : param_type(ParamType::IN_PLACE) {}
537 explicit Test(std::optional<int> param)
538 : param_type(ParamType::OPTIONAL_INT) {}
539
540 ParamType param_type;
541 };
542
543 // Overload resolution with copy-conversion constructor.
544 {
545 const std::optional<int> arg(std::in_place, 1);
546 std::optional<Test> testee(arg);
547 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
548 }
549
550 // Overload resolution with move conversion constructor.
551 {
552 std::optional<Test> testee(std::optional<int>(std::in_place, 1));
553 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
554 }
555
556 // Default constructor should be used.
557 {
558 std::optional<Test> testee(std::in_place);
559 EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
560 }
561 }
562
563 {
564 struct Test {
565 Test(int a) {} // NOLINT(runtime/explicit)
566 };
567 // If T is convertible from U, it is not marked as explicit.
568 static_assert(std::is_convertible_v<int, Test>,
569 "Int should be convertible to Test.");
570 ([](std::optional<Test> param) {})(1);
571 }
572 }
573
TEST(OptionalTest,NulloptConstructor)574 TEST(OptionalTest, NulloptConstructor) {
575 constexpr std::optional<int> a(std::nullopt);
576 EXPECT_FALSE(a);
577 }
578
TEST(OptionalTest,AssignValue)579 TEST(OptionalTest, AssignValue) {
580 {
581 std::optional<float> a;
582 EXPECT_FALSE(a);
583 a = 0.1f;
584 EXPECT_TRUE(a);
585
586 std::optional<float> b(0.1f);
587 EXPECT_TRUE(a == b);
588 }
589
590 {
591 std::optional<std::string> a;
592 EXPECT_FALSE(a);
593 a = std::string("foo");
594 EXPECT_TRUE(a);
595
596 std::optional<std::string> b(std::string("foo"));
597 EXPECT_EQ(a, b);
598 }
599
600 {
601 std::optional<TestObject> a;
602 EXPECT_FALSE(!!a);
603 a = TestObject(3, 0.1);
604 EXPECT_TRUE(!!a);
605
606 std::optional<TestObject> b(TestObject(3, 0.1));
607 EXPECT_TRUE(a == b);
608 }
609
610 {
611 std::optional<TestObject> a = TestObject(4, 1.0);
612 EXPECT_TRUE(!!a);
613 a = TestObject(3, 0.1);
614 EXPECT_TRUE(!!a);
615
616 std::optional<TestObject> b(TestObject(3, 0.1));
617 EXPECT_TRUE(a == b);
618 }
619 }
620
TEST(OptionalTest,AssignObject)621 TEST(OptionalTest, AssignObject) {
622 {
623 std::optional<float> a;
624 std::optional<float> b(0.1f);
625 a = b;
626
627 EXPECT_TRUE(a);
628 EXPECT_EQ(a.value(), 0.1f);
629 EXPECT_EQ(a, b);
630 }
631
632 {
633 std::optional<std::string> a;
634 std::optional<std::string> b("foo");
635 a = b;
636
637 EXPECT_TRUE(a);
638 EXPECT_EQ(a.value(), "foo");
639 EXPECT_EQ(a, b);
640 }
641
642 {
643 std::optional<TestObject> a;
644 std::optional<TestObject> b(TestObject(3, 0.1));
645 a = b;
646
647 EXPECT_TRUE(!!a);
648 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
649 EXPECT_TRUE(a == b);
650 }
651
652 {
653 std::optional<TestObject> a(TestObject(4, 1.0));
654 std::optional<TestObject> b(TestObject(3, 0.1));
655 a = b;
656
657 EXPECT_TRUE(!!a);
658 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
659 EXPECT_TRUE(a == b);
660 }
661
662 {
663 std::optional<DeletedMove> a(std::in_place, 42);
664 std::optional<DeletedMove> b;
665 b = a;
666
667 EXPECT_TRUE(!!a);
668 EXPECT_TRUE(!!b);
669 EXPECT_EQ(a->foo(), b->foo());
670 }
671
672 {
673 std::optional<DeletedMove> a(std::in_place, 42);
674 std::optional<DeletedMove> b(std::in_place, 1);
675 b = a;
676
677 EXPECT_TRUE(!!a);
678 EXPECT_TRUE(!!b);
679 EXPECT_EQ(a->foo(), b->foo());
680 }
681
682 // Converting assignment.
683 {
684 std::optional<int> a(std::in_place, 1);
685 std::optional<double> b;
686 b = a;
687
688 EXPECT_TRUE(!!a);
689 EXPECT_TRUE(!!b);
690 EXPECT_EQ(1, a.value());
691 EXPECT_EQ(1.0, b.value());
692 }
693
694 {
695 std::optional<int> a(std::in_place, 42);
696 std::optional<double> b(std::in_place, 1);
697 b = a;
698
699 EXPECT_TRUE(!!a);
700 EXPECT_TRUE(!!b);
701 EXPECT_EQ(42, a.value());
702 EXPECT_EQ(42.0, b.value());
703 }
704
705 {
706 std::optional<int> a;
707 std::optional<double> b(std::in_place, 1);
708 b = a;
709 EXPECT_FALSE(!!a);
710 EXPECT_FALSE(!!b);
711 }
712 }
713
TEST(OptionalTest,AssignObject_rvalue)714 TEST(OptionalTest, AssignObject_rvalue) {
715 // NOLINTBEGIN(bugprone-use-after-move)
716 {
717 std::optional<float> a;
718 std::optional<float> b(0.1f);
719 a = std::move(b);
720
721 EXPECT_TRUE(a);
722 EXPECT_TRUE(b);
723 EXPECT_EQ(0.1f, a.value());
724 }
725
726 {
727 std::optional<std::string> a;
728 std::optional<std::string> b("foo");
729 a = std::move(b);
730
731 EXPECT_TRUE(a);
732 EXPECT_TRUE(b);
733 EXPECT_EQ("foo", a.value());
734 }
735
736 {
737 std::optional<TestObject> a;
738 std::optional<TestObject> b(TestObject(3, 0.1));
739 a = std::move(b);
740
741 EXPECT_TRUE(!!a);
742 EXPECT_TRUE(!!b);
743 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
744
745 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
746 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
747 }
748
749 {
750 std::optional<TestObject> a(TestObject(4, 1.0));
751 std::optional<TestObject> b(TestObject(3, 0.1));
752 a = std::move(b);
753
754 EXPECT_TRUE(!!a);
755 EXPECT_TRUE(!!b);
756 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
757
758 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
759 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
760 }
761
762 {
763 std::optional<DeletedMove> a(std::in_place, 42);
764 std::optional<DeletedMove> b;
765 b = std::move(a);
766
767 EXPECT_TRUE(!!a);
768 EXPECT_TRUE(!!b);
769 EXPECT_EQ(42, b->foo());
770 }
771
772 {
773 std::optional<DeletedMove> a(std::in_place, 42);
774 std::optional<DeletedMove> b(std::in_place, 1);
775 b = std::move(a);
776
777 EXPECT_TRUE(!!a);
778 EXPECT_TRUE(!!b);
779 EXPECT_EQ(42, b->foo());
780 }
781
782 // Converting assignment.
783 {
784 std::optional<int> a(std::in_place, 1);
785 std::optional<double> b;
786 b = std::move(a);
787
788 EXPECT_TRUE(!!a);
789 EXPECT_TRUE(!!b);
790 EXPECT_EQ(1.0, b.value());
791 }
792
793 {
794 std::optional<int> a(std::in_place, 42);
795 std::optional<double> b(std::in_place, 1);
796 b = std::move(a);
797
798 EXPECT_TRUE(!!a);
799 EXPECT_TRUE(!!b);
800 EXPECT_EQ(42.0, b.value());
801 }
802
803 {
804 std::optional<int> a;
805 std::optional<double> b(std::in_place, 1);
806 b = std::move(a);
807
808 EXPECT_FALSE(!!a);
809 EXPECT_FALSE(!!b);
810 }
811 // NOLINTEND(bugprone-use-after-move)
812 }
813
TEST(OptionalTest,AssignNull)814 TEST(OptionalTest, AssignNull) {
815 {
816 std::optional<float> a(0.1f);
817 std::optional<float> b(0.2f);
818 a = std::nullopt;
819 b = std::nullopt;
820 EXPECT_EQ(a, b);
821 }
822
823 {
824 std::optional<std::string> a("foo");
825 std::optional<std::string> b("bar");
826 a = std::nullopt;
827 b = std::nullopt;
828 EXPECT_EQ(a, b);
829 }
830
831 {
832 std::optional<TestObject> a(TestObject(3, 0.1));
833 std::optional<TestObject> b(TestObject(4, 1.0));
834 a = std::nullopt;
835 b = std::nullopt;
836 EXPECT_TRUE(a == b);
837 }
838 }
839
TEST(OptionalTest,AssignOverload)840 TEST(OptionalTest, AssignOverload) {
841 struct Test1 {
842 enum class State {
843 CONSTRUCTED,
844 MOVED,
845 };
846 State state = State::CONSTRUCTED;
847 };
848
849 // Here, std::optional<Test2> can be assigned from std::optional<Test1>. In
850 // case of move, marks MOVED to Test1 instance.
851 struct Test2 {
852 enum class State {
853 DEFAULT_CONSTRUCTED,
854 COPY_CONSTRUCTED_FROM_TEST1,
855 MOVE_CONSTRUCTED_FROM_TEST1,
856 COPY_ASSIGNED_FROM_TEST1,
857 MOVE_ASSIGNED_FROM_TEST1,
858 };
859
860 Test2() = default;
861 explicit Test2(const Test1& test1)
862 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
863 explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
864 test1.state = Test1::State::MOVED;
865 }
866 Test2& operator=(const Test1& test1) {
867 state = State::COPY_ASSIGNED_FROM_TEST1;
868 return *this;
869 }
870 Test2& operator=(Test1&& test1) {
871 state = State::MOVE_ASSIGNED_FROM_TEST1;
872 test1.state = Test1::State::MOVED;
873 return *this;
874 }
875
876 State state = State::DEFAULT_CONSTRUCTED;
877 };
878
879 {
880 std::optional<Test1> a(std::in_place);
881 std::optional<Test2> b;
882
883 b = a;
884 EXPECT_TRUE(!!a);
885 EXPECT_TRUE(!!b);
886 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
887 EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
888 }
889
890 {
891 std::optional<Test1> a(std::in_place);
892 std::optional<Test2> b(std::in_place);
893
894 b = a;
895 EXPECT_TRUE(!!a);
896 EXPECT_TRUE(!!b);
897 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
898 EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
899 }
900
901 {
902 std::optional<Test1> a(std::in_place);
903 std::optional<Test2> b;
904
905 b = std::move(a);
906 EXPECT_TRUE(!!a);
907 EXPECT_TRUE(!!b);
908 EXPECT_EQ(Test1::State::MOVED, a->state);
909 EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
910 }
911
912 {
913 std::optional<Test1> a(std::in_place);
914 std::optional<Test2> b(std::in_place);
915
916 b = std::move(a);
917 EXPECT_TRUE(!!a);
918 EXPECT_TRUE(!!b);
919 EXPECT_EQ(Test1::State::MOVED, a->state);
920 EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
921 }
922
923 // Similar to Test2, but Test3 also has copy/move ctor and assign operators
924 // from std::optional<Test1>, too. In this case, for a = b where a is
925 // std::optional<Test3> and b is std::optional<Test1>,
926 // std::optional<T>::operator=(U&&) where U is std::optional<Test1> should
927 // be used rather than std::optional<T>::operator=(std::optional<U>&&) where
928 // U is Test1.
929 struct Test3 {
930 enum class State {
931 DEFAULT_CONSTRUCTED,
932 COPY_CONSTRUCTED_FROM_TEST1,
933 MOVE_CONSTRUCTED_FROM_TEST1,
934 COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
935 MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
936 COPY_ASSIGNED_FROM_TEST1,
937 MOVE_ASSIGNED_FROM_TEST1,
938 COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
939 MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
940 };
941
942 Test3() = default;
943 explicit Test3(const Test1& test1)
944 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
945 explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
946 test1.state = Test1::State::MOVED;
947 }
948 explicit Test3(const std::optional<Test1>& test1)
949 : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
950 explicit Test3(std::optional<Test1>&& test1)
951 : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
952 // In the following senarios, given |test1| should always have value.
953 DCHECK(test1.has_value());
954 test1->state = Test1::State::MOVED;
955 }
956 Test3& operator=(const Test1& test1) {
957 state = State::COPY_ASSIGNED_FROM_TEST1;
958 return *this;
959 }
960 Test3& operator=(Test1&& test1) {
961 state = State::MOVE_ASSIGNED_FROM_TEST1;
962 test1.state = Test1::State::MOVED;
963 return *this;
964 }
965 Test3& operator=(const std::optional<Test1>& test1) {
966 state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
967 return *this;
968 }
969 Test3& operator=(std::optional<Test1>&& test1) {
970 state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
971 // In the following senarios, given |test1| should always have value.
972 DCHECK(test1.has_value());
973 test1->state = Test1::State::MOVED;
974 return *this;
975 }
976
977 State state = State::DEFAULT_CONSTRUCTED;
978 };
979
980 {
981 std::optional<Test1> a(std::in_place);
982 std::optional<Test3> b;
983
984 b = a;
985 EXPECT_TRUE(!!a);
986 EXPECT_TRUE(!!b);
987 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
988 EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
989 }
990
991 {
992 std::optional<Test1> a(std::in_place);
993 std::optional<Test3> b(std::in_place);
994
995 b = a;
996 EXPECT_TRUE(!!a);
997 EXPECT_TRUE(!!b);
998 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
999 EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
1000 }
1001
1002 {
1003 std::optional<Test1> a(std::in_place);
1004 std::optional<Test3> b;
1005
1006 b = std::move(a);
1007 EXPECT_TRUE(!!a);
1008 EXPECT_TRUE(!!b);
1009 EXPECT_EQ(Test1::State::MOVED, a->state);
1010 EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
1011 }
1012
1013 {
1014 std::optional<Test1> a(std::in_place);
1015 std::optional<Test3> b(std::in_place);
1016
1017 b = std::move(a);
1018 EXPECT_TRUE(!!a);
1019 EXPECT_TRUE(!!b);
1020 EXPECT_EQ(Test1::State::MOVED, a->state);
1021 EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
1022 }
1023 }
1024
TEST(OptionalTest,OperatorStar)1025 TEST(OptionalTest, OperatorStar) {
1026 {
1027 std::optional<float> a(0.1f);
1028 EXPECT_EQ(a.value(), *a);
1029 }
1030
1031 {
1032 std::optional<std::string> a("foo");
1033 EXPECT_EQ(a.value(), *a);
1034 }
1035
1036 {
1037 std::optional<TestObject> a(TestObject(3, 0.1));
1038 EXPECT_EQ(a.value(), *a);
1039 }
1040 }
1041
TEST(OptionalTest,OperatorStar_rvalue)1042 TEST(OptionalTest, OperatorStar_rvalue) {
1043 EXPECT_EQ(0.1f, *std::optional<float>(0.1f));
1044 EXPECT_EQ(std::string("foo"), *std::optional<std::string>("foo"));
1045 EXPECT_TRUE(TestObject(3, 0.1) ==
1046 *std::optional<TestObject>(TestObject(3, 0.1)));
1047 }
1048
TEST(OptionalTest,OperatorArrow)1049 TEST(OptionalTest, OperatorArrow) {
1050 std::optional<TestObject> a(TestObject(3, 0.1));
1051 EXPECT_EQ(a->foo(), 3);
1052 }
1053
TEST(OptionalTest,Value_rvalue)1054 TEST(OptionalTest, Value_rvalue) {
1055 EXPECT_EQ(0.1f, std::optional<float>(0.1f).value());
1056 EXPECT_EQ(std::string("foo"), std::optional<std::string>("foo").value());
1057 EXPECT_TRUE(TestObject(3, 0.1) ==
1058 std::optional<TestObject>(TestObject(3, 0.1)).value());
1059 }
1060
TEST(OptionalTest,ValueOr)1061 TEST(OptionalTest, ValueOr) {
1062 {
1063 std::optional<float> a;
1064 EXPECT_EQ(0.0f, a.value_or(0.0f));
1065
1066 a = 0.1f;
1067 EXPECT_EQ(0.1f, a.value_or(0.0f));
1068
1069 a = std::nullopt;
1070 EXPECT_EQ(0.0f, a.value_or(0.0f));
1071 }
1072
1073 // value_or() can be constexpr.
1074 {
1075 constexpr std::optional<int> a(std::in_place, 1);
1076 constexpr int value = a.value_or(10);
1077 EXPECT_EQ(1, value);
1078 }
1079 {
1080 constexpr std::optional<int> a;
1081 constexpr int value = a.value_or(10);
1082 EXPECT_EQ(10, value);
1083 }
1084
1085 {
1086 std::optional<std::string> a;
1087 EXPECT_EQ("bar", a.value_or("bar"));
1088
1089 a = std::string("foo");
1090 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
1091
1092 a = std::nullopt;
1093 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
1094 }
1095
1096 {
1097 std::optional<TestObject> a;
1098 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1099
1100 a = TestObject(3, 0.1);
1101 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
1102
1103 a = std::nullopt;
1104 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1105 }
1106 }
1107
TEST(OptionalTest,Swap_bothNoValue)1108 TEST(OptionalTest, Swap_bothNoValue) {
1109 std::optional<TestObject> a, b;
1110 a.swap(b);
1111
1112 EXPECT_FALSE(a);
1113 EXPECT_FALSE(b);
1114 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1115 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1116 }
1117
TEST(OptionalTest,Swap_inHasValue)1118 TEST(OptionalTest, Swap_inHasValue) {
1119 std::optional<TestObject> a(TestObject(1, 0.3));
1120 std::optional<TestObject> b;
1121 a.swap(b);
1122
1123 EXPECT_FALSE(a);
1124
1125 EXPECT_TRUE(!!b);
1126 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1127 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1128 }
1129
TEST(OptionalTest,Swap_outHasValue)1130 TEST(OptionalTest, Swap_outHasValue) {
1131 std::optional<TestObject> a;
1132 std::optional<TestObject> b(TestObject(1, 0.3));
1133 a.swap(b);
1134
1135 EXPECT_TRUE(!!a);
1136 EXPECT_FALSE(!!b);
1137 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1138 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1139 }
1140
TEST(OptionalTest,Swap_bothValue)1141 TEST(OptionalTest, Swap_bothValue) {
1142 std::optional<TestObject> a(TestObject(0, 0.1));
1143 std::optional<TestObject> b(TestObject(1, 0.3));
1144 a.swap(b);
1145
1146 EXPECT_TRUE(!!a);
1147 EXPECT_TRUE(!!b);
1148 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1149 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
1150 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1151 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
1152 }
1153
TEST(OptionalTest,Emplace)1154 TEST(OptionalTest, Emplace) {
1155 {
1156 std::optional<float> a(0.1f);
1157 EXPECT_EQ(0.3f, a.emplace(0.3f));
1158
1159 EXPECT_TRUE(a);
1160 EXPECT_EQ(0.3f, a.value());
1161 }
1162
1163 {
1164 std::optional<std::string> a("foo");
1165 EXPECT_EQ("bar", a.emplace("bar"));
1166
1167 EXPECT_TRUE(a);
1168 EXPECT_EQ("bar", a.value());
1169 }
1170
1171 {
1172 std::optional<TestObject> a(TestObject(0, 0.1));
1173 EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
1174
1175 EXPECT_TRUE(!!a);
1176 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
1177 }
1178
1179 {
1180 std::optional<std::vector<int>> a;
1181 auto& ref = a.emplace({2, 3});
1182 static_assert(std::is_same_v<std::vector<int>&, decltype(ref)>, "");
1183 EXPECT_TRUE(a);
1184 EXPECT_THAT(*a, ElementsAre(2, 3));
1185 EXPECT_EQ(&ref, &*a);
1186 }
1187
1188 {
1189 std::optional<std::vector<int>> a;
1190 auto& ref = a.emplace({4, 5}, std::allocator<int>());
1191 static_assert(std::is_same_v<std::vector<int>&, decltype(ref)>, "");
1192 EXPECT_TRUE(a);
1193 EXPECT_THAT(*a, ElementsAre(4, 5));
1194 EXPECT_EQ(&ref, &*a);
1195 }
1196 }
1197
TEST(OptionalTest,Equals_TwoEmpty)1198 TEST(OptionalTest, Equals_TwoEmpty) {
1199 std::optional<int> a;
1200 std::optional<int> b;
1201
1202 EXPECT_TRUE(a == b);
1203 }
1204
TEST(OptionalTest,Equals_TwoEquals)1205 TEST(OptionalTest, Equals_TwoEquals) {
1206 std::optional<int> a(1);
1207 std::optional<int> b(1);
1208
1209 EXPECT_TRUE(a == b);
1210 }
1211
TEST(OptionalTest,Equals_OneEmpty)1212 TEST(OptionalTest, Equals_OneEmpty) {
1213 std::optional<int> a;
1214 std::optional<int> b(1);
1215
1216 EXPECT_FALSE(a == b);
1217 }
1218
TEST(OptionalTest,Equals_TwoDifferent)1219 TEST(OptionalTest, Equals_TwoDifferent) {
1220 std::optional<int> a(0);
1221 std::optional<int> b(1);
1222
1223 EXPECT_FALSE(a == b);
1224 }
1225
TEST(OptionalTest,Equals_DifferentType)1226 TEST(OptionalTest, Equals_DifferentType) {
1227 std::optional<int> a(0);
1228 std::optional<double> b(0);
1229
1230 EXPECT_TRUE(a == b);
1231 }
1232
TEST(OptionalTest,Equals_Value)1233 TEST(OptionalTest, Equals_Value) {
1234 std::optional<int> a(0);
1235 std::optional<int> b;
1236
1237 EXPECT_TRUE(a == 0);
1238 EXPECT_FALSE(b == 0);
1239 }
1240
TEST(OptionalTest,NotEquals_TwoEmpty)1241 TEST(OptionalTest, NotEquals_TwoEmpty) {
1242 std::optional<int> a;
1243 std::optional<int> b;
1244
1245 EXPECT_FALSE(a != b);
1246 }
1247
TEST(OptionalTest,NotEquals_TwoEquals)1248 TEST(OptionalTest, NotEquals_TwoEquals) {
1249 std::optional<int> a(1);
1250 std::optional<int> b(1);
1251
1252 EXPECT_FALSE(a != b);
1253 }
1254
TEST(OptionalTest,NotEquals_OneEmpty)1255 TEST(OptionalTest, NotEquals_OneEmpty) {
1256 std::optional<int> a;
1257 std::optional<int> b(1);
1258
1259 EXPECT_TRUE(a != b);
1260 }
1261
TEST(OptionalTest,NotEquals_TwoDifferent)1262 TEST(OptionalTest, NotEquals_TwoDifferent) {
1263 std::optional<int> a(0);
1264 std::optional<int> b(1);
1265
1266 EXPECT_TRUE(a != b);
1267 }
1268
TEST(OptionalTest,NotEquals_DifferentType)1269 TEST(OptionalTest, NotEquals_DifferentType) {
1270 std::optional<int> a(0);
1271 std::optional<double> b(0.0);
1272
1273 EXPECT_FALSE(a != b);
1274 }
1275
TEST(OptionalTest,NotEquals_Value)1276 TEST(OptionalTest, NotEquals_Value) {
1277 std::optional<int> a(0);
1278 std::optional<int> b;
1279
1280 EXPECT_TRUE(a != 1);
1281 EXPECT_FALSE(a == 1);
1282
1283 EXPECT_TRUE(b != 1);
1284 EXPECT_FALSE(b == 1);
1285 }
1286
TEST(OptionalTest,Less_LeftEmpty)1287 TEST(OptionalTest, Less_LeftEmpty) {
1288 std::optional<int> l;
1289 std::optional<int> r(1);
1290
1291 EXPECT_TRUE(l < r);
1292 }
1293
TEST(OptionalTest,Less_RightEmpty)1294 TEST(OptionalTest, Less_RightEmpty) {
1295 std::optional<int> l(1);
1296 std::optional<int> r;
1297
1298 EXPECT_FALSE(l < r);
1299 }
1300
TEST(OptionalTest,Less_BothEmpty)1301 TEST(OptionalTest, Less_BothEmpty) {
1302 std::optional<int> l;
1303 std::optional<int> r;
1304
1305 EXPECT_FALSE(l < r);
1306 }
1307
TEST(OptionalTest,Less_BothValues)1308 TEST(OptionalTest, Less_BothValues) {
1309 {
1310 std::optional<int> l(1);
1311 std::optional<int> r(2);
1312
1313 EXPECT_TRUE(l < r);
1314 }
1315 {
1316 std::optional<int> l(2);
1317 std::optional<int> r(1);
1318
1319 EXPECT_FALSE(l < r);
1320 }
1321 {
1322 std::optional<int> l(1);
1323 std::optional<int> r(1);
1324
1325 EXPECT_FALSE(l < r);
1326 }
1327 }
1328
TEST(OptionalTest,Less_DifferentType)1329 TEST(OptionalTest, Less_DifferentType) {
1330 std::optional<int> l(1);
1331 std::optional<double> r(2.0);
1332
1333 EXPECT_TRUE(l < r);
1334 }
1335
TEST(OptionalTest,LessEq_LeftEmpty)1336 TEST(OptionalTest, LessEq_LeftEmpty) {
1337 std::optional<int> l;
1338 std::optional<int> r(1);
1339
1340 EXPECT_TRUE(l <= r);
1341 }
1342
TEST(OptionalTest,LessEq_RightEmpty)1343 TEST(OptionalTest, LessEq_RightEmpty) {
1344 std::optional<int> l(1);
1345 std::optional<int> r;
1346
1347 EXPECT_FALSE(l <= r);
1348 }
1349
TEST(OptionalTest,LessEq_BothEmpty)1350 TEST(OptionalTest, LessEq_BothEmpty) {
1351 std::optional<int> l;
1352 std::optional<int> r;
1353
1354 EXPECT_TRUE(l <= r);
1355 }
1356
TEST(OptionalTest,LessEq_BothValues)1357 TEST(OptionalTest, LessEq_BothValues) {
1358 {
1359 std::optional<int> l(1);
1360 std::optional<int> r(2);
1361
1362 EXPECT_TRUE(l <= r);
1363 }
1364 {
1365 std::optional<int> l(2);
1366 std::optional<int> r(1);
1367
1368 EXPECT_FALSE(l <= r);
1369 }
1370 {
1371 std::optional<int> l(1);
1372 std::optional<int> r(1);
1373
1374 EXPECT_TRUE(l <= r);
1375 }
1376 }
1377
TEST(OptionalTest,LessEq_DifferentType)1378 TEST(OptionalTest, LessEq_DifferentType) {
1379 std::optional<int> l(1);
1380 std::optional<double> r(2.0);
1381
1382 EXPECT_TRUE(l <= r);
1383 }
1384
TEST(OptionalTest,Greater_BothEmpty)1385 TEST(OptionalTest, Greater_BothEmpty) {
1386 std::optional<int> l;
1387 std::optional<int> r;
1388
1389 EXPECT_FALSE(l > r);
1390 }
1391
TEST(OptionalTest,Greater_LeftEmpty)1392 TEST(OptionalTest, Greater_LeftEmpty) {
1393 std::optional<int> l;
1394 std::optional<int> r(1);
1395
1396 EXPECT_FALSE(l > r);
1397 }
1398
TEST(OptionalTest,Greater_RightEmpty)1399 TEST(OptionalTest, Greater_RightEmpty) {
1400 std::optional<int> l(1);
1401 std::optional<int> r;
1402
1403 EXPECT_TRUE(l > r);
1404 }
1405
TEST(OptionalTest,Greater_BothValue)1406 TEST(OptionalTest, Greater_BothValue) {
1407 {
1408 std::optional<int> l(1);
1409 std::optional<int> r(2);
1410
1411 EXPECT_FALSE(l > r);
1412 }
1413 {
1414 std::optional<int> l(2);
1415 std::optional<int> r(1);
1416
1417 EXPECT_TRUE(l > r);
1418 }
1419 {
1420 std::optional<int> l(1);
1421 std::optional<int> r(1);
1422
1423 EXPECT_FALSE(l > r);
1424 }
1425 }
1426
TEST(OptionalTest,Greater_DifferentType)1427 TEST(OptionalTest, Greater_DifferentType) {
1428 std::optional<int> l(1);
1429 std::optional<double> r(2.0);
1430
1431 EXPECT_FALSE(l > r);
1432 }
1433
TEST(OptionalTest,GreaterEq_BothEmpty)1434 TEST(OptionalTest, GreaterEq_BothEmpty) {
1435 std::optional<int> l;
1436 std::optional<int> r;
1437
1438 EXPECT_TRUE(l >= r);
1439 }
1440
TEST(OptionalTest,GreaterEq_LeftEmpty)1441 TEST(OptionalTest, GreaterEq_LeftEmpty) {
1442 std::optional<int> l;
1443 std::optional<int> r(1);
1444
1445 EXPECT_FALSE(l >= r);
1446 }
1447
TEST(OptionalTest,GreaterEq_RightEmpty)1448 TEST(OptionalTest, GreaterEq_RightEmpty) {
1449 std::optional<int> l(1);
1450 std::optional<int> r;
1451
1452 EXPECT_TRUE(l >= r);
1453 }
1454
TEST(OptionalTest,GreaterEq_BothValue)1455 TEST(OptionalTest, GreaterEq_BothValue) {
1456 {
1457 std::optional<int> l(1);
1458 std::optional<int> r(2);
1459
1460 EXPECT_FALSE(l >= r);
1461 }
1462 {
1463 std::optional<int> l(2);
1464 std::optional<int> r(1);
1465
1466 EXPECT_TRUE(l >= r);
1467 }
1468 {
1469 std::optional<int> l(1);
1470 std::optional<int> r(1);
1471
1472 EXPECT_TRUE(l >= r);
1473 }
1474 }
1475
TEST(OptionalTest,GreaterEq_DifferentType)1476 TEST(OptionalTest, GreaterEq_DifferentType) {
1477 std::optional<int> l(1);
1478 std::optional<double> r(2.0);
1479
1480 EXPECT_FALSE(l >= r);
1481 }
1482
TEST(OptionalTest,OptNullEq)1483 TEST(OptionalTest, OptNullEq) {
1484 {
1485 std::optional<int> opt;
1486 EXPECT_TRUE(opt == std::nullopt);
1487 }
1488 {
1489 std::optional<int> opt(1);
1490 EXPECT_FALSE(opt == std::nullopt);
1491 }
1492 }
1493
TEST(OptionalTest,NullOptEq)1494 TEST(OptionalTest, NullOptEq) {
1495 {
1496 std::optional<int> opt;
1497 EXPECT_TRUE(std::nullopt == opt);
1498 }
1499 {
1500 std::optional<int> opt(1);
1501 EXPECT_FALSE(std::nullopt == opt);
1502 }
1503 }
1504
TEST(OptionalTest,OptNullNotEq)1505 TEST(OptionalTest, OptNullNotEq) {
1506 {
1507 std::optional<int> opt;
1508 EXPECT_FALSE(opt != std::nullopt);
1509 }
1510 {
1511 std::optional<int> opt(1);
1512 EXPECT_TRUE(opt != std::nullopt);
1513 }
1514 }
1515
TEST(OptionalTest,NullOptNotEq)1516 TEST(OptionalTest, NullOptNotEq) {
1517 {
1518 std::optional<int> opt;
1519 EXPECT_FALSE(std::nullopt != opt);
1520 }
1521 {
1522 std::optional<int> opt(1);
1523 EXPECT_TRUE(std::nullopt != opt);
1524 }
1525 }
1526
TEST(OptionalTest,OptNullLower)1527 TEST(OptionalTest, OptNullLower) {
1528 {
1529 std::optional<int> opt;
1530 EXPECT_FALSE(opt < std::nullopt);
1531 }
1532 {
1533 std::optional<int> opt(1);
1534 EXPECT_FALSE(opt < std::nullopt);
1535 }
1536 }
1537
TEST(OptionalTest,NullOptLower)1538 TEST(OptionalTest, NullOptLower) {
1539 {
1540 std::optional<int> opt;
1541 EXPECT_FALSE(std::nullopt < opt);
1542 }
1543 {
1544 std::optional<int> opt(1);
1545 EXPECT_TRUE(std::nullopt < opt);
1546 }
1547 }
1548
TEST(OptionalTest,OptNullLowerEq)1549 TEST(OptionalTest, OptNullLowerEq) {
1550 {
1551 std::optional<int> opt;
1552 EXPECT_TRUE(opt <= std::nullopt);
1553 }
1554 {
1555 std::optional<int> opt(1);
1556 EXPECT_FALSE(opt <= std::nullopt);
1557 }
1558 }
1559
TEST(OptionalTest,NullOptLowerEq)1560 TEST(OptionalTest, NullOptLowerEq) {
1561 {
1562 std::optional<int> opt;
1563 EXPECT_TRUE(std::nullopt <= opt);
1564 }
1565 {
1566 std::optional<int> opt(1);
1567 EXPECT_TRUE(std::nullopt <= opt);
1568 }
1569 }
1570
TEST(OptionalTest,OptNullGreater)1571 TEST(OptionalTest, OptNullGreater) {
1572 {
1573 std::optional<int> opt;
1574 EXPECT_FALSE(opt > std::nullopt);
1575 }
1576 {
1577 std::optional<int> opt(1);
1578 EXPECT_TRUE(opt > std::nullopt);
1579 }
1580 }
1581
TEST(OptionalTest,NullOptGreater)1582 TEST(OptionalTest, NullOptGreater) {
1583 {
1584 std::optional<int> opt;
1585 EXPECT_FALSE(std::nullopt > opt);
1586 }
1587 {
1588 std::optional<int> opt(1);
1589 EXPECT_FALSE(std::nullopt > opt);
1590 }
1591 }
1592
TEST(OptionalTest,OptNullGreaterEq)1593 TEST(OptionalTest, OptNullGreaterEq) {
1594 {
1595 std::optional<int> opt;
1596 EXPECT_TRUE(opt >= std::nullopt);
1597 }
1598 {
1599 std::optional<int> opt(1);
1600 EXPECT_TRUE(opt >= std::nullopt);
1601 }
1602 }
1603
TEST(OptionalTest,NullOptGreaterEq)1604 TEST(OptionalTest, NullOptGreaterEq) {
1605 {
1606 std::optional<int> opt;
1607 EXPECT_TRUE(std::nullopt >= opt);
1608 }
1609 {
1610 std::optional<int> opt(1);
1611 EXPECT_FALSE(std::nullopt >= opt);
1612 }
1613 }
1614
TEST(OptionalTest,ValueEq_Empty)1615 TEST(OptionalTest, ValueEq_Empty) {
1616 std::optional<int> opt;
1617 EXPECT_FALSE(opt == 1);
1618 }
1619
TEST(OptionalTest,ValueEq_NotEmpty)1620 TEST(OptionalTest, ValueEq_NotEmpty) {
1621 {
1622 std::optional<int> opt(0);
1623 EXPECT_FALSE(opt == 1);
1624 }
1625 {
1626 std::optional<int> opt(1);
1627 EXPECT_TRUE(opt == 1);
1628 }
1629 }
1630
TEST(OptionalTest,ValueEq_DifferentType)1631 TEST(OptionalTest, ValueEq_DifferentType) {
1632 std::optional<int> opt(0);
1633 EXPECT_TRUE(opt == 0.0);
1634 }
1635
TEST(OptionalTest,EqValue_Empty)1636 TEST(OptionalTest, EqValue_Empty) {
1637 std::optional<int> opt;
1638 EXPECT_FALSE(1 == opt);
1639 }
1640
TEST(OptionalTest,EqValue_NotEmpty)1641 TEST(OptionalTest, EqValue_NotEmpty) {
1642 {
1643 std::optional<int> opt(0);
1644 EXPECT_FALSE(1 == opt);
1645 }
1646 {
1647 std::optional<int> opt(1);
1648 EXPECT_TRUE(1 == opt);
1649 }
1650 }
1651
TEST(OptionalTest,EqValue_DifferentType)1652 TEST(OptionalTest, EqValue_DifferentType) {
1653 std::optional<int> opt(0);
1654 EXPECT_TRUE(0.0 == opt);
1655 }
1656
TEST(OptionalTest,ValueNotEq_Empty)1657 TEST(OptionalTest, ValueNotEq_Empty) {
1658 std::optional<int> opt;
1659 EXPECT_TRUE(opt != 1);
1660 }
1661
TEST(OptionalTest,ValueNotEq_NotEmpty)1662 TEST(OptionalTest, ValueNotEq_NotEmpty) {
1663 {
1664 std::optional<int> opt(0);
1665 EXPECT_TRUE(opt != 1);
1666 }
1667 {
1668 std::optional<int> opt(1);
1669 EXPECT_FALSE(opt != 1);
1670 }
1671 }
1672
TEST(OptionalTest,ValueNotEq_DifferentType)1673 TEST(OptionalTest, ValueNotEq_DifferentType) {
1674 std::optional<int> opt(0);
1675 EXPECT_FALSE(opt != 0.0);
1676 }
1677
TEST(OptionalTest,NotEqValue_Empty)1678 TEST(OptionalTest, NotEqValue_Empty) {
1679 std::optional<int> opt;
1680 EXPECT_TRUE(1 != opt);
1681 }
1682
TEST(OptionalTest,NotEqValue_NotEmpty)1683 TEST(OptionalTest, NotEqValue_NotEmpty) {
1684 {
1685 std::optional<int> opt(0);
1686 EXPECT_TRUE(1 != opt);
1687 }
1688 {
1689 std::optional<int> opt(1);
1690 EXPECT_FALSE(1 != opt);
1691 }
1692 }
1693
TEST(OptionalTest,NotEqValue_DifferentType)1694 TEST(OptionalTest, NotEqValue_DifferentType) {
1695 std::optional<int> opt(0);
1696 EXPECT_FALSE(0.0 != opt);
1697 }
1698
TEST(OptionalTest,ValueLess_Empty)1699 TEST(OptionalTest, ValueLess_Empty) {
1700 std::optional<int> opt;
1701 EXPECT_TRUE(opt < 1);
1702 }
1703
TEST(OptionalTest,ValueLess_NotEmpty)1704 TEST(OptionalTest, ValueLess_NotEmpty) {
1705 {
1706 std::optional<int> opt(0);
1707 EXPECT_TRUE(opt < 1);
1708 }
1709 {
1710 std::optional<int> opt(1);
1711 EXPECT_FALSE(opt < 1);
1712 }
1713 {
1714 std::optional<int> opt(2);
1715 EXPECT_FALSE(opt < 1);
1716 }
1717 }
1718
TEST(OptionalTest,ValueLess_DifferentType)1719 TEST(OptionalTest, ValueLess_DifferentType) {
1720 std::optional<int> opt(0);
1721 EXPECT_TRUE(opt < 1.0);
1722 }
1723
TEST(OptionalTest,LessValue_Empty)1724 TEST(OptionalTest, LessValue_Empty) {
1725 std::optional<int> opt;
1726 EXPECT_FALSE(1 < opt);
1727 }
1728
TEST(OptionalTest,LessValue_NotEmpty)1729 TEST(OptionalTest, LessValue_NotEmpty) {
1730 {
1731 std::optional<int> opt(0);
1732 EXPECT_FALSE(1 < opt);
1733 }
1734 {
1735 std::optional<int> opt(1);
1736 EXPECT_FALSE(1 < opt);
1737 }
1738 {
1739 std::optional<int> opt(2);
1740 EXPECT_TRUE(1 < opt);
1741 }
1742 }
1743
TEST(OptionalTest,LessValue_DifferentType)1744 TEST(OptionalTest, LessValue_DifferentType) {
1745 std::optional<int> opt(0);
1746 EXPECT_FALSE(0.0 < opt);
1747 }
1748
TEST(OptionalTest,ValueLessEq_Empty)1749 TEST(OptionalTest, ValueLessEq_Empty) {
1750 std::optional<int> opt;
1751 EXPECT_TRUE(opt <= 1);
1752 }
1753
TEST(OptionalTest,ValueLessEq_NotEmpty)1754 TEST(OptionalTest, ValueLessEq_NotEmpty) {
1755 {
1756 std::optional<int> opt(0);
1757 EXPECT_TRUE(opt <= 1);
1758 }
1759 {
1760 std::optional<int> opt(1);
1761 EXPECT_TRUE(opt <= 1);
1762 }
1763 {
1764 std::optional<int> opt(2);
1765 EXPECT_FALSE(opt <= 1);
1766 }
1767 }
1768
TEST(OptionalTest,ValueLessEq_DifferentType)1769 TEST(OptionalTest, ValueLessEq_DifferentType) {
1770 std::optional<int> opt(0);
1771 EXPECT_TRUE(opt <= 0.0);
1772 }
1773
TEST(OptionalTest,LessEqValue_Empty)1774 TEST(OptionalTest, LessEqValue_Empty) {
1775 std::optional<int> opt;
1776 EXPECT_FALSE(1 <= opt);
1777 }
1778
TEST(OptionalTest,LessEqValue_NotEmpty)1779 TEST(OptionalTest, LessEqValue_NotEmpty) {
1780 {
1781 std::optional<int> opt(0);
1782 EXPECT_FALSE(1 <= opt);
1783 }
1784 {
1785 std::optional<int> opt(1);
1786 EXPECT_TRUE(1 <= opt);
1787 }
1788 {
1789 std::optional<int> opt(2);
1790 EXPECT_TRUE(1 <= opt);
1791 }
1792 }
1793
TEST(OptionalTest,LessEqValue_DifferentType)1794 TEST(OptionalTest, LessEqValue_DifferentType) {
1795 std::optional<int> opt(0);
1796 EXPECT_TRUE(0.0 <= opt);
1797 }
1798
TEST(OptionalTest,ValueGreater_Empty)1799 TEST(OptionalTest, ValueGreater_Empty) {
1800 std::optional<int> opt;
1801 EXPECT_FALSE(opt > 1);
1802 }
1803
TEST(OptionalTest,ValueGreater_NotEmpty)1804 TEST(OptionalTest, ValueGreater_NotEmpty) {
1805 {
1806 std::optional<int> opt(0);
1807 EXPECT_FALSE(opt > 1);
1808 }
1809 {
1810 std::optional<int> opt(1);
1811 EXPECT_FALSE(opt > 1);
1812 }
1813 {
1814 std::optional<int> opt(2);
1815 EXPECT_TRUE(opt > 1);
1816 }
1817 }
1818
TEST(OptionalTest,ValueGreater_DifferentType)1819 TEST(OptionalTest, ValueGreater_DifferentType) {
1820 std::optional<int> opt(0);
1821 EXPECT_FALSE(opt > 0.0);
1822 }
1823
TEST(OptionalTest,GreaterValue_Empty)1824 TEST(OptionalTest, GreaterValue_Empty) {
1825 std::optional<int> opt;
1826 EXPECT_TRUE(1 > opt);
1827 }
1828
TEST(OptionalTest,GreaterValue_NotEmpty)1829 TEST(OptionalTest, GreaterValue_NotEmpty) {
1830 {
1831 std::optional<int> opt(0);
1832 EXPECT_TRUE(1 > opt);
1833 }
1834 {
1835 std::optional<int> opt(1);
1836 EXPECT_FALSE(1 > opt);
1837 }
1838 {
1839 std::optional<int> opt(2);
1840 EXPECT_FALSE(1 > opt);
1841 }
1842 }
1843
TEST(OptionalTest,GreaterValue_DifferentType)1844 TEST(OptionalTest, GreaterValue_DifferentType) {
1845 std::optional<int> opt(0);
1846 EXPECT_FALSE(0.0 > opt);
1847 }
1848
TEST(OptionalTest,ValueGreaterEq_Empty)1849 TEST(OptionalTest, ValueGreaterEq_Empty) {
1850 std::optional<int> opt;
1851 EXPECT_FALSE(opt >= 1);
1852 }
1853
TEST(OptionalTest,ValueGreaterEq_NotEmpty)1854 TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1855 {
1856 std::optional<int> opt(0);
1857 EXPECT_FALSE(opt >= 1);
1858 }
1859 {
1860 std::optional<int> opt(1);
1861 EXPECT_TRUE(opt >= 1);
1862 }
1863 {
1864 std::optional<int> opt(2);
1865 EXPECT_TRUE(opt >= 1);
1866 }
1867 }
1868
TEST(OptionalTest,ValueGreaterEq_DifferentType)1869 TEST(OptionalTest, ValueGreaterEq_DifferentType) {
1870 std::optional<int> opt(0);
1871 EXPECT_TRUE(opt <= 0.0);
1872 }
1873
TEST(OptionalTest,GreaterEqValue_Empty)1874 TEST(OptionalTest, GreaterEqValue_Empty) {
1875 std::optional<int> opt;
1876 EXPECT_TRUE(1 >= opt);
1877 }
1878
TEST(OptionalTest,GreaterEqValue_NotEmpty)1879 TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1880 {
1881 std::optional<int> opt(0);
1882 EXPECT_TRUE(1 >= opt);
1883 }
1884 {
1885 std::optional<int> opt(1);
1886 EXPECT_TRUE(1 >= opt);
1887 }
1888 {
1889 std::optional<int> opt(2);
1890 EXPECT_FALSE(1 >= opt);
1891 }
1892 }
1893
TEST(OptionalTest,GreaterEqValue_DifferentType)1894 TEST(OptionalTest, GreaterEqValue_DifferentType) {
1895 std::optional<int> opt(0);
1896 EXPECT_TRUE(0.0 >= opt);
1897 }
1898
TEST(OptionalTest,NotEquals)1899 TEST(OptionalTest, NotEquals) {
1900 {
1901 std::optional<float> a(0.1f);
1902 std::optional<float> b(0.2f);
1903 EXPECT_NE(a, b);
1904 }
1905
1906 {
1907 std::optional<std::string> a("foo");
1908 std::optional<std::string> b("bar");
1909 EXPECT_NE(a, b);
1910 }
1911
1912 {
1913 std::optional<int> a(1);
1914 std::optional<double> b(2);
1915 EXPECT_NE(a, b);
1916 }
1917
1918 {
1919 std::optional<TestObject> a(TestObject(3, 0.1));
1920 std::optional<TestObject> b(TestObject(4, 1.0));
1921 EXPECT_TRUE(a != b);
1922 }
1923 }
1924
TEST(OptionalTest,NotEqualsNull)1925 TEST(OptionalTest, NotEqualsNull) {
1926 {
1927 std::optional<float> a(0.1f);
1928 std::optional<float> b(0.1f);
1929 b = std::nullopt;
1930 EXPECT_NE(a, b);
1931 }
1932
1933 {
1934 std::optional<std::string> a("foo");
1935 std::optional<std::string> b("foo");
1936 b = std::nullopt;
1937 EXPECT_NE(a, b);
1938 }
1939
1940 {
1941 std::optional<TestObject> a(TestObject(3, 0.1));
1942 std::optional<TestObject> b(TestObject(3, 0.1));
1943 b = std::nullopt;
1944 EXPECT_TRUE(a != b);
1945 }
1946 }
1947
TEST(OptionalTest,MakeOptional)1948 TEST(OptionalTest, MakeOptional) {
1949 {
1950 std::optional<float> o = std::make_optional(32.f);
1951 EXPECT_TRUE(o);
1952 EXPECT_EQ(32.f, *o);
1953
1954 float value = 3.f;
1955 o = std::make_optional(std::move(value));
1956 EXPECT_TRUE(o);
1957 EXPECT_EQ(3.f, *o);
1958 }
1959
1960 {
1961 std::optional<std::string> o = std::make_optional(std::string("foo"));
1962 EXPECT_TRUE(o);
1963 EXPECT_EQ("foo", *o);
1964
1965 std::string value = "bar";
1966 o = std::make_optional(std::move(value));
1967 EXPECT_TRUE(o);
1968 EXPECT_EQ(std::string("bar"), *o);
1969 }
1970
1971 {
1972 // NOLINTBEGIN(bugprone-use-after-move)
1973 std::optional<TestObject> o = std::make_optional(TestObject(3, 0.1));
1974 EXPECT_TRUE(!!o);
1975 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1976
1977 TestObject value = TestObject(0, 0.42);
1978 o = std::make_optional(std::move(value));
1979 EXPECT_TRUE(!!o);
1980 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1981 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
1982 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
1983
1984 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1985 std::make_optional(std::move(value))->state());
1986 // NOLINTEND(bugprone-use-after-move)
1987 }
1988
1989 {
1990 struct Test {
1991 Test(int a, double b, bool c) : a(a), b(b), c(c) {}
1992
1993 int a;
1994 double b;
1995 bool c;
1996 };
1997
1998 std::optional<Test> o = std::make_optional<Test>(1, 2.0, true);
1999 EXPECT_TRUE(!!o);
2000 EXPECT_EQ(1, o->a);
2001 EXPECT_EQ(2.0, o->b);
2002 EXPECT_TRUE(o->c);
2003 }
2004
2005 {
2006 auto str1 = std::make_optional<std::string>({'1', '2', '3'});
2007 EXPECT_EQ("123", *str1);
2008
2009 auto str2 = std::make_optional<std::string>({'a', 'b', 'c'},
2010 std::allocator<char>());
2011 EXPECT_EQ("abc", *str2);
2012 }
2013 }
2014
TEST(OptionalTest,NonMemberSwap_bothNoValue)2015 TEST(OptionalTest, NonMemberSwap_bothNoValue) {
2016 std::optional<TestObject> a, b;
2017 std::swap(a, b);
2018
2019 EXPECT_FALSE(!!a);
2020 EXPECT_FALSE(!!b);
2021 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
2022 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
2023 }
2024
TEST(OptionalTest,NonMemberSwap_inHasValue)2025 TEST(OptionalTest, NonMemberSwap_inHasValue) {
2026 std::optional<TestObject> a(TestObject(1, 0.3));
2027 std::optional<TestObject> b;
2028 std::swap(a, b);
2029
2030 EXPECT_FALSE(!!a);
2031 EXPECT_TRUE(!!b);
2032 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
2033 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
2034 }
2035
TEST(OptionalTest,NonMemberSwap_outHasValue)2036 TEST(OptionalTest, NonMemberSwap_outHasValue) {
2037 std::optional<TestObject> a;
2038 std::optional<TestObject> b(TestObject(1, 0.3));
2039 std::swap(a, b);
2040
2041 EXPECT_TRUE(!!a);
2042 EXPECT_FALSE(!!b);
2043 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2044 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
2045 }
2046
TEST(OptionalTest,NonMemberSwap_bothValue)2047 TEST(OptionalTest, NonMemberSwap_bothValue) {
2048 std::optional<TestObject> a(TestObject(0, 0.1));
2049 std::optional<TestObject> b(TestObject(1, 0.3));
2050 std::swap(a, b);
2051
2052 EXPECT_TRUE(!!a);
2053 EXPECT_TRUE(!!b);
2054 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2055 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
2056 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
2057 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
2058 }
2059
TEST(OptionalTest,Hash_OptionalReflectsInternal)2060 TEST(OptionalTest, Hash_OptionalReflectsInternal) {
2061 {
2062 std::hash<int> int_hash;
2063 std::hash<std::optional<int>> opt_int_hash;
2064
2065 EXPECT_EQ(int_hash(1), opt_int_hash(std::optional<int>(1)));
2066 }
2067
2068 {
2069 std::hash<std::string> str_hash;
2070 std::hash<std::optional<std::string>> opt_str_hash;
2071
2072 EXPECT_EQ(str_hash(std::string("foobar")),
2073 opt_str_hash(std::optional<std::string>(std::string("foobar"))));
2074 }
2075 }
2076
TEST(OptionalTest,Hash_NullOptEqualsNullOpt)2077 TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
2078 std::hash<std::optional<int>> opt_int_hash;
2079 std::hash<std::optional<std::string>> opt_str_hash;
2080
2081 EXPECT_EQ(opt_str_hash(std::optional<std::string>()),
2082 opt_int_hash(std::optional<int>()));
2083 }
2084
TEST(OptionalTest,Hash_UseInSet)2085 TEST(OptionalTest, Hash_UseInSet) {
2086 std::set<std::optional<int>> setOptInt;
2087
2088 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2089
2090 setOptInt.insert(std::optional<int>(3));
2091 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2092 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
2093 }
2094
TEST(OptionalTest,HasValue)2095 TEST(OptionalTest, HasValue) {
2096 std::optional<int> a;
2097 EXPECT_FALSE(a.has_value());
2098
2099 a = 42;
2100 EXPECT_TRUE(a.has_value());
2101
2102 a = std::nullopt;
2103 EXPECT_FALSE(a.has_value());
2104
2105 a = 0;
2106 EXPECT_TRUE(a.has_value());
2107
2108 a = std::optional<int>();
2109 EXPECT_FALSE(a.has_value());
2110 }
2111
TEST(OptionalTest,Reset_int)2112 TEST(OptionalTest, Reset_int) {
2113 std::optional<int> a(0);
2114 EXPECT_TRUE(a.has_value());
2115 EXPECT_EQ(0, a.value());
2116
2117 a.reset();
2118 EXPECT_FALSE(a.has_value());
2119 EXPECT_EQ(-1, a.value_or(-1));
2120 }
2121
TEST(OptionalTest,Reset_Object)2122 TEST(OptionalTest, Reset_Object) {
2123 std::optional<TestObject> a(TestObject(0, 0.1));
2124 EXPECT_TRUE(a.has_value());
2125 EXPECT_EQ(TestObject(0, 0.1), a.value());
2126
2127 a.reset();
2128 EXPECT_FALSE(a.has_value());
2129 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
2130 }
2131
TEST(OptionalTest,Reset_NoOp)2132 TEST(OptionalTest, Reset_NoOp) {
2133 std::optional<int> a;
2134 EXPECT_FALSE(a.has_value());
2135
2136 a.reset();
2137 EXPECT_FALSE(a.has_value());
2138 }
2139
TEST(OptionalTest,AssignFromRValue)2140 TEST(OptionalTest, AssignFromRValue) {
2141 std::optional<TestObject> a;
2142 EXPECT_FALSE(a.has_value());
2143
2144 TestObject obj;
2145 a = std::move(obj);
2146 EXPECT_TRUE(a.has_value());
2147 EXPECT_EQ(1, a->move_ctors_count());
2148 }
2149
TEST(OptionalTest,DontCallDefaultCtor)2150 TEST(OptionalTest, DontCallDefaultCtor) {
2151 std::optional<DeletedDefaultConstructor> a;
2152 EXPECT_FALSE(a.has_value());
2153
2154 a = std::make_optional<DeletedDefaultConstructor>(42);
2155 EXPECT_TRUE(a.has_value());
2156 EXPECT_EQ(42, a->foo());
2157 }
2158
TEST(OptionalTest,DontCallNewMemberFunction)2159 TEST(OptionalTest, DontCallNewMemberFunction) {
2160 std::optional<DeleteNewOperators> a;
2161 EXPECT_FALSE(a.has_value());
2162
2163 a = DeleteNewOperators();
2164 EXPECT_TRUE(a.has_value());
2165 }
2166
TEST(OptionalTest,DereferencingNoValueCrashes)2167 TEST(OptionalTest, DereferencingNoValueCrashes) {
2168 class C {
2169 public:
2170 void Method() const {}
2171 };
2172
2173 {
2174 const std::optional<C> const_optional;
2175 EXPECT_DEATH_IF_SUPPORTED(const_optional.value(), "");
2176 EXPECT_DEATH_IF_SUPPORTED(const_optional->Method(), "");
2177 EXPECT_DEATH_IF_SUPPORTED(*const_optional, "");
2178 EXPECT_DEATH_IF_SUPPORTED(*std::move(const_optional), "");
2179 }
2180
2181 {
2182 std::optional<C> non_const_optional;
2183 EXPECT_DEATH_IF_SUPPORTED(non_const_optional.value(), "");
2184 EXPECT_DEATH_IF_SUPPORTED(non_const_optional->Method(), "");
2185 EXPECT_DEATH_IF_SUPPORTED(*non_const_optional, "");
2186 EXPECT_DEATH_IF_SUPPORTED(*std::move(non_const_optional), "");
2187 }
2188 }
2189
TEST(OptionalTest,Noexcept)2190 TEST(OptionalTest, Noexcept) {
2191 // Trivial copy ctor, non-trivial move ctor, nothrow move assign.
2192 struct Test1 {
2193 Test1(const Test1&) = default;
2194 Test1(Test1&&) {}
2195 Test1& operator=(Test1&&) = default;
2196 };
2197 // Non-trivial copy ctor, trivial move ctor, throw move assign.
2198 struct Test2 {
2199 Test2(const Test2&) {}
2200 Test2(Test2&&) = default;
2201 Test2& operator=(Test2&&) { return *this; }
2202 };
2203 // Trivial copy ctor, non-trivial nothrow move ctor.
2204 struct Test3 {
2205 Test3(const Test3&) = default;
2206 Test3(Test3&&) noexcept {}
2207 };
2208 // Non-trivial copy ctor, non-trivial nothrow move ctor.
2209 struct Test4 {
2210 Test4(const Test4&) {}
2211 Test4(Test4&&) noexcept {}
2212 };
2213 // Non-trivial copy ctor, non-trivial move ctor.
2214 struct Test5 {
2215 Test5(const Test5&) {}
2216 Test5(Test5&&) {}
2217 };
2218
2219 static_assert(
2220 noexcept(std::optional<int>(std::declval<std::optional<int>>())),
2221 "move constructor for noexcept move-constructible T must be noexcept "
2222 "(trivial copy, trivial move)");
2223 static_assert(
2224 !noexcept(std::optional<Test1>(std::declval<std::optional<Test1>>())),
2225 "move constructor for non-noexcept move-constructible T must not be "
2226 "noexcept (trivial copy)");
2227 static_assert(
2228 noexcept(std::optional<Test2>(std::declval<std::optional<Test2>>())),
2229 "move constructor for noexcept move-constructible T must be noexcept "
2230 "(non-trivial copy, trivial move)");
2231 static_assert(
2232 noexcept(std::optional<Test3>(std::declval<std::optional<Test3>>())),
2233 "move constructor for noexcept move-constructible T must be noexcept "
2234 "(trivial copy, non-trivial move)");
2235 static_assert(
2236 noexcept(std::optional<Test4>(std::declval<std::optional<Test4>>())),
2237 "move constructor for noexcept move-constructible T must be noexcept "
2238 "(non-trivial copy, non-trivial move)");
2239 static_assert(
2240 !noexcept(std::optional<Test5>(std::declval<std::optional<Test5>>())),
2241 "move constructor for non-noexcept move-constructible T must not be "
2242 "noexcept (non-trivial copy)");
2243
2244 static_assert(noexcept(std::declval<std::optional<int>>() =
2245 std::declval<std::optional<int>>()),
2246 "move assign for noexcept move-constructible/move-assignable T "
2247 "must be noexcept");
2248 static_assert(
2249 !noexcept(std::declval<std::optional<Test1>>() =
2250 std::declval<std::optional<Test1>>()),
2251 "move assign for non-noexcept move-constructible T must not be noexcept");
2252 static_assert(
2253 !noexcept(std::declval<std::optional<Test2>>() =
2254 std::declval<std::optional<Test2>>()),
2255 "move assign for non-noexcept move-assignable T must not be noexcept");
2256 }
2257
TEST(OptionalTest,OverrideAddressOf)2258 TEST(OptionalTest, OverrideAddressOf) {
2259 // Objects with an overloaded address-of should not trigger the overload for
2260 // arrow or copy assignment.
2261 static_assert(
2262 std::is_trivially_destructible_v<TriviallyDestructibleOverloadAddressOf>,
2263 "Trivially...AddressOf must be trivially destructible.");
2264 std::optional<TriviallyDestructibleOverloadAddressOf> optional;
2265 TriviallyDestructibleOverloadAddressOf n;
2266 optional = n;
2267
2268 // operator->() should not call address-of either, for either const or non-
2269 // const calls. It's not strictly necessary that we call a nonconst method
2270 // to test the non-const operator->(), but it makes it very clear that the
2271 // compiler can't chose the const operator->().
2272 optional->nonconst_method();
2273 const auto& const_optional = optional;
2274 const_optional->const_method();
2275
2276 static_assert(!std::is_trivially_destructible_v<
2277 NonTriviallyDestructibleOverloadAddressOf>,
2278 "NotTrivially...AddressOf must not be trivially destructible.");
2279 std::optional<NonTriviallyDestructibleOverloadAddressOf> nontrivial_optional;
2280 NonTriviallyDestructibleOverloadAddressOf n1;
2281 nontrivial_optional = n1;
2282 }
2283
2284 } // namespace base
2285