• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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