1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
11 #include "base/macros.h"
12 #include "base/test/gtest_util.h"
13 #include "testing/gmock/include/gmock/gmock.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/abseil-cpp/absl/types/optional.h"
17 using ::testing::ElementsAre;
23 // Object used to test complex object with absl::optional<T> in addition of the
38 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
40 TestObject(int foo, double bar)
41 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
43 TestObject(const TestObject& other)
46 state_(State::COPY_CONSTRUCTED),
47 move_ctors_count_(other.move_ctors_count_) {}
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;
57 TestObject& operator=(const TestObject& other) {
60 state_ = State::COPY_ASSIGNED;
61 move_ctors_count_ = other.move_ctors_count_;
65 TestObject& operator=(TestObject&& other) {
68 state_ = State::MOVE_ASSIGNED;
69 move_ctors_count_ = other.move_ctors_count_;
70 other.state_ = State::MOVED_FROM;
74 void Swap(TestObject* other) {
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;
83 bool operator==(const TestObject& other) const {
84 return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
87 bool operator!=(const TestObject& other) const { return !(*this == other); }
89 int foo() const { return foo_; }
90 State state() const { return state_; }
91 int move_ctors_count() const { return move_ctors_count_; }
97 int move_ctors_count_ = 0;
100 // Implementing Swappable concept.
101 void swap(TestObject& lhs, TestObject& rhs) {
105 class NonTriviallyDestructible {
107 ~NonTriviallyDestructible() {}
110 class DeletedDefaultConstructor {
112 DeletedDefaultConstructor() = delete;
113 DeletedDefaultConstructor(int foo) : foo_(foo) {}
115 int foo() const { return foo_; }
123 explicit DeletedCopy(int foo) : foo_(foo) {}
124 DeletedCopy(const DeletedCopy&) = delete;
125 DeletedCopy(DeletedCopy&&) = default;
127 DeletedCopy& operator=(const DeletedCopy&) = delete;
128 DeletedCopy& operator=(DeletedCopy&&) = default;
130 int foo() const { return foo_; }
138 explicit DeletedMove(int foo) : foo_(foo) {}
139 DeletedMove(const DeletedMove&) = default;
140 DeletedMove(DeletedMove&&) = delete;
142 DeletedMove& operator=(const DeletedMove&) = default;
143 DeletedMove& operator=(DeletedMove&&) = delete;
145 int foo() const { return foo_; }
151 class NonTriviallyDestructibleDeletedCopyConstructor {
153 explicit NonTriviallyDestructibleDeletedCopyConstructor(int foo)
155 NonTriviallyDestructibleDeletedCopyConstructor(
156 const NonTriviallyDestructibleDeletedCopyConstructor&) = delete;
157 NonTriviallyDestructibleDeletedCopyConstructor(
158 NonTriviallyDestructibleDeletedCopyConstructor&&) = default;
160 ~NonTriviallyDestructibleDeletedCopyConstructor() {}
162 int foo() const { return foo_; }
168 class DeleteNewOperators {
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;
176 class TriviallyDestructibleOverloadAddressOf {
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.
181 TriviallyDestructibleOverloadAddressOf* operator&() {
186 // So we can test the const version of operator->.
187 const TriviallyDestructibleOverloadAddressOf* operator&() const {
192 void const_method() const {}
193 void nonconst_method() {}
196 class NonTriviallyDestructibleOverloadAddressOf {
198 ~NonTriviallyDestructibleOverloadAddressOf() {}
199 NonTriviallyDestructibleOverloadAddressOf* operator&() {
205 } // anonymous namespace
207 static_assert(std::is_trivially_destructible<absl::optional<int>>::value,
208 "OptionalIsTriviallyDestructible");
210 static_assert(!std::is_trivially_destructible<
211 absl::optional<NonTriviallyDestructible>>::value,
212 "OptionalIsTriviallyDestructible");
214 TEST(OptionalTest, DefaultConstructor) {
216 constexpr absl::optional<float> o;
221 absl::optional<std::string> o;
226 absl::optional<TestObject> o;
231 TEST(OptionalTest, CopyConstructor) {
233 constexpr absl::optional<float> first(0.1f);
234 constexpr absl::optional<float> other(first);
237 EXPECT_EQ(other.value(), 0.1f);
238 EXPECT_EQ(first, other);
242 absl::optional<std::string> first("foo");
243 absl::optional<std::string> other(first);
246 EXPECT_EQ(other.value(), "foo");
247 EXPECT_EQ(first, other);
251 const absl::optional<std::string> first("foo");
252 absl::optional<std::string> other(first);
255 EXPECT_EQ(other.value(), "foo");
256 EXPECT_EQ(first, other);
260 absl::optional<TestObject> first(TestObject(3, 0.1));
261 absl::optional<TestObject> other(first);
263 EXPECT_TRUE(!!other);
264 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
265 EXPECT_TRUE(first == other);
269 TEST(OptionalTest, ValueConstructor) {
271 constexpr float value = 0.1f;
272 constexpr absl::optional<float> o(value);
275 EXPECT_EQ(value, o.value());
279 std::string value("foo");
280 absl::optional<std::string> o(value);
283 EXPECT_EQ(value, o.value());
287 TestObject value(3, 0.1);
288 absl::optional<TestObject> o(value);
291 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
292 EXPECT_EQ(value, o.value());
296 TEST(OptionalTest, MoveConstructor) {
298 constexpr absl::optional<float> first(0.1f);
299 constexpr absl::optional<float> second(std::move(first));
301 EXPECT_TRUE(second.has_value());
302 EXPECT_EQ(second.value(), 0.1f);
304 EXPECT_TRUE(first.has_value());
308 absl::optional<std::string> first("foo");
309 absl::optional<std::string> second(std::move(first));
311 EXPECT_TRUE(second.has_value());
312 EXPECT_EQ("foo", second.value());
314 EXPECT_TRUE(first.has_value());
318 absl::optional<TestObject> first(TestObject(3, 0.1));
319 absl::optional<TestObject> second(std::move(first));
321 EXPECT_TRUE(second.has_value());
322 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
323 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
325 EXPECT_TRUE(first.has_value());
326 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
329 // Even if copy constructor is deleted, move constructor needs to work.
330 // Note that it couldn't be constexpr.
332 absl::optional<DeletedCopy> first(absl::in_place, 42);
333 absl::optional<DeletedCopy> second(std::move(first));
335 EXPECT_TRUE(second.has_value());
336 EXPECT_EQ(42, second->foo());
338 EXPECT_TRUE(first.has_value());
342 absl::optional<DeletedMove> first(absl::in_place, 42);
343 absl::optional<DeletedMove> second(std::move(first));
345 EXPECT_TRUE(second.has_value());
346 EXPECT_EQ(42, second->foo());
348 EXPECT_TRUE(first.has_value());
352 absl::optional<NonTriviallyDestructibleDeletedCopyConstructor> first(
354 absl::optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
357 EXPECT_TRUE(second.has_value());
358 EXPECT_EQ(42, second->foo());
360 EXPECT_TRUE(first.has_value());
364 TEST(OptionalTest, MoveValueConstructor) {
366 constexpr float value = 0.1f;
367 constexpr absl::optional<float> o(std::move(value));
370 EXPECT_EQ(0.1f, o.value());
375 absl::optional<float> o(std::move(value));
378 EXPECT_EQ(0.1f, o.value());
382 std::string value("foo");
383 absl::optional<std::string> o(std::move(value));
386 EXPECT_EQ("foo", o.value());
390 TestObject value(3, 0.1);
391 absl::optional<TestObject> o(std::move(value));
394 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
395 EXPECT_EQ(TestObject(3, 0.1), o.value());
399 TEST(OptionalTest, ConvertingCopyConstructor) {
401 absl::optional<int> first(1);
402 absl::optional<double> second(first);
403 EXPECT_TRUE(second.has_value());
404 EXPECT_EQ(1.0, second.value());
407 // Make sure explicit is not marked for convertible case.
409 absl::optional<int> o(1);
410 ignore_result<absl::optional<double>>(o);
414 TEST(OptionalTest, ConvertingMoveConstructor) {
416 absl::optional<int> first(1);
417 absl::optional<double> second(std::move(first));
418 EXPECT_TRUE(second.has_value());
419 EXPECT_EQ(1.0, second.value());
422 // Make sure explicit is not marked for convertible case.
424 absl::optional<int> o(1);
425 ignore_result<absl::optional<double>>(std::move(o));
431 explicit Test1(int foo) : foo_(foo) {}
433 int foo() const { return foo_; }
439 // Not copyable but convertible from Test1.
442 Test2(const Test2&) = delete;
443 explicit Test2(Test1&& other) : bar_(other.foo()) {}
445 double bar() const { return bar_; }
451 absl::optional<Test1> first(absl::in_place, 42);
452 absl::optional<Test2> second(std::move(first));
453 EXPECT_TRUE(second.has_value());
454 EXPECT_EQ(42.0, second->bar());
458 TEST(OptionalTest, ConstructorForwardArguments) {
460 constexpr absl::optional<float> a(absl::in_place, 0.1f);
462 EXPECT_EQ(0.1f, a.value());
466 absl::optional<float> a(absl::in_place, 0.1f);
468 EXPECT_EQ(0.1f, a.value());
472 absl::optional<std::string> a(absl::in_place, "foo");
474 EXPECT_EQ("foo", a.value());
478 absl::optional<TestObject> a(absl::in_place, 0, 0.1);
480 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
484 TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
486 absl::optional<std::vector<int>> opt(absl::in_place, {3, 1});
488 EXPECT_THAT(*opt, ElementsAre(3, 1));
489 EXPECT_EQ(2u, opt->size());
493 absl::optional<std::vector<int>> opt(absl::in_place, {3, 1},
494 std::allocator<int>());
496 EXPECT_THAT(*opt, ElementsAre(3, 1));
497 EXPECT_EQ(2u, opt->size());
501 TEST(OptionalTest, ForwardConstructor) {
503 absl::optional<double> a(1);
504 EXPECT_TRUE(a.has_value());
505 EXPECT_EQ(1.0, a.value());
508 // Test that default type of 'U' is value_type.
516 absl::optional<TestData> a({1, 2.0, true});
517 EXPECT_TRUE(a.has_value());
519 EXPECT_EQ(2.0, a->b);
523 // If T has a constructor with a param absl::optional<U>, and another ctor
524 // with a param U, then T(absl::optional<U>) should be used for
525 // absl::optional<T>(absl::optional<U>) constructor.
527 enum class ParamType {
536 Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
537 Test(const Test& param) : param_type(ParamType::COPY_CONSTRUCTED) {}
538 Test(Test&& param) : param_type(ParamType::MOVE_CONSTRUCTED) {}
539 explicit Test(int param) : param_type(ParamType::INT) {}
540 explicit Test(in_place_t param) : param_type(ParamType::IN_PLACE) {}
541 explicit Test(absl::optional<int> param)
542 : param_type(ParamType::OPTIONAL_INT) {}
544 ParamType param_type;
547 // Overload resolution with copy-conversion constructor.
549 const absl::optional<int> arg(absl::in_place, 1);
550 absl::optional<Test> testee(arg);
551 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
554 // Overload resolution with move conversion constructor.
556 absl::optional<Test> testee(absl::optional<int>(absl::in_place, 1));
557 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
560 // Default constructor should be used.
562 absl::optional<Test> testee(absl::in_place);
563 EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
569 Test(int a) {} // NOLINT(runtime/explicit)
571 // If T is convertible from U, it is not marked as explicit.
572 static_assert(std::is_convertible<int, Test>::value,
573 "Int should be convertible to Test.");
574 ([](absl::optional<Test> param) {})(1);
578 TEST(OptionalTest, NulloptConstructor) {
579 constexpr absl::optional<int> a(absl::nullopt);
583 TEST(OptionalTest, AssignValue) {
585 absl::optional<float> a;
590 absl::optional<float> b(0.1f);
595 absl::optional<std::string> a;
597 a = std::string("foo");
600 absl::optional<std::string> b(std::string("foo"));
605 absl::optional<TestObject> a;
607 a = TestObject(3, 0.1);
610 absl::optional<TestObject> b(TestObject(3, 0.1));
615 absl::optional<TestObject> a = TestObject(4, 1.0);
617 a = TestObject(3, 0.1);
620 absl::optional<TestObject> b(TestObject(3, 0.1));
625 TEST(OptionalTest, AssignObject) {
627 absl::optional<float> a;
628 absl::optional<float> b(0.1f);
632 EXPECT_EQ(a.value(), 0.1f);
637 absl::optional<std::string> a;
638 absl::optional<std::string> b("foo");
642 EXPECT_EQ(a.value(), "foo");
647 absl::optional<TestObject> a;
648 absl::optional<TestObject> b(TestObject(3, 0.1));
652 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
657 absl::optional<TestObject> a(TestObject(4, 1.0));
658 absl::optional<TestObject> b(TestObject(3, 0.1));
662 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
667 absl::optional<DeletedMove> a(absl::in_place, 42);
668 absl::optional<DeletedMove> b;
673 EXPECT_EQ(a->foo(), b->foo());
677 absl::optional<DeletedMove> a(absl::in_place, 42);
678 absl::optional<DeletedMove> b(absl::in_place, 1);
683 EXPECT_EQ(a->foo(), b->foo());
686 // Converting assignment.
688 absl::optional<int> a(absl::in_place, 1);
689 absl::optional<double> b;
694 EXPECT_EQ(1, a.value());
695 EXPECT_EQ(1.0, b.value());
699 absl::optional<int> a(absl::in_place, 42);
700 absl::optional<double> b(absl::in_place, 1);
705 EXPECT_EQ(42, a.value());
706 EXPECT_EQ(42.0, b.value());
710 absl::optional<int> a;
711 absl::optional<double> b(absl::in_place, 1);
718 TEST(OptionalTest, AssignObject_rvalue) {
720 absl::optional<float> a;
721 absl::optional<float> b(0.1f);
726 EXPECT_EQ(0.1f, a.value());
730 absl::optional<std::string> a;
731 absl::optional<std::string> b("foo");
736 EXPECT_EQ("foo", a.value());
740 absl::optional<TestObject> a;
741 absl::optional<TestObject> b(TestObject(3, 0.1));
746 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
748 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
749 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
753 absl::optional<TestObject> a(TestObject(4, 1.0));
754 absl::optional<TestObject> b(TestObject(3, 0.1));
759 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
761 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
762 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
766 absl::optional<DeletedMove> a(absl::in_place, 42);
767 absl::optional<DeletedMove> b;
772 EXPECT_EQ(42, b->foo());
776 absl::optional<DeletedMove> a(absl::in_place, 42);
777 absl::optional<DeletedMove> b(absl::in_place, 1);
782 EXPECT_EQ(42, b->foo());
785 // Converting assignment.
787 absl::optional<int> a(absl::in_place, 1);
788 absl::optional<double> b;
793 EXPECT_EQ(1.0, b.value());
797 absl::optional<int> a(absl::in_place, 42);
798 absl::optional<double> b(absl::in_place, 1);
803 EXPECT_EQ(42.0, b.value());
807 absl::optional<int> a;
808 absl::optional<double> b(absl::in_place, 1);
816 TEST(OptionalTest, AssignNull) {
818 absl::optional<float> a(0.1f);
819 absl::optional<float> b(0.2f);
826 absl::optional<std::string> a("foo");
827 absl::optional<std::string> b("bar");
834 absl::optional<TestObject> a(TestObject(3, 0.1));
835 absl::optional<TestObject> b(TestObject(4, 1.0));
842 TEST(OptionalTest, AssignOverload) {
848 State state = State::CONSTRUCTED;
851 // Here, absl::optional<Test2> can be assigned from absl::optional<Test1>. In
852 // case of move, marks MOVED to Test1 instance.
856 COPY_CONSTRUCTED_FROM_TEST1,
857 MOVE_CONSTRUCTED_FROM_TEST1,
858 COPY_ASSIGNED_FROM_TEST1,
859 MOVE_ASSIGNED_FROM_TEST1,
863 explicit Test2(const Test1& test1)
864 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
865 explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
866 test1.state = Test1::State::MOVED;
868 Test2& operator=(const Test1& test1) {
869 state = State::COPY_ASSIGNED_FROM_TEST1;
872 Test2& operator=(Test1&& test1) {
873 state = State::MOVE_ASSIGNED_FROM_TEST1;
874 test1.state = Test1::State::MOVED;
878 State state = State::DEFAULT_CONSTRUCTED;
882 absl::optional<Test1> a(absl::in_place);
883 absl::optional<Test2> b;
888 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
889 EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
893 absl::optional<Test1> a(absl::in_place);
894 absl::optional<Test2> b(absl::in_place);
899 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
900 EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
904 absl::optional<Test1> a(absl::in_place);
905 absl::optional<Test2> b;
910 EXPECT_EQ(Test1::State::MOVED, a->state);
911 EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
915 absl::optional<Test1> a(absl::in_place);
916 absl::optional<Test2> b(absl::in_place);
921 EXPECT_EQ(Test1::State::MOVED, a->state);
922 EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
925 // Similar to Test2, but Test3 also has copy/move ctor and assign operators
926 // from absl::optional<Test1>, too. In this case, for a = b where a is
927 // absl::optional<Test3> and b is absl::optional<Test1>,
928 // absl::optional<T>::operator=(U&&) where U is absl::optional<Test1> should
929 // be used rather than absl::optional<T>::operator=(absl::optional<U>&&) where
934 COPY_CONSTRUCTED_FROM_TEST1,
935 MOVE_CONSTRUCTED_FROM_TEST1,
936 COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
937 MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
938 COPY_ASSIGNED_FROM_TEST1,
939 MOVE_ASSIGNED_FROM_TEST1,
940 COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
941 MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
945 explicit Test3(const Test1& test1)
946 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
947 explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
948 test1.state = Test1::State::MOVED;
950 explicit Test3(const absl::optional<Test1>& test1)
951 : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
952 explicit Test3(absl::optional<Test1>&& test1)
953 : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
954 // In the following senarios, given |test1| should always have value.
955 DCHECK(test1.has_value());
956 test1->state = Test1::State::MOVED;
958 Test3& operator=(const Test1& test1) {
959 state = State::COPY_ASSIGNED_FROM_TEST1;
962 Test3& operator=(Test1&& test1) {
963 state = State::MOVE_ASSIGNED_FROM_TEST1;
964 test1.state = Test1::State::MOVED;
967 Test3& operator=(const absl::optional<Test1>& test1) {
968 state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
971 Test3& operator=(absl::optional<Test1>&& test1) {
972 state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
973 // In the following senarios, given |test1| should always have value.
974 DCHECK(test1.has_value());
975 test1->state = Test1::State::MOVED;
979 State state = State::DEFAULT_CONSTRUCTED;
983 absl::optional<Test1> a(absl::in_place);
984 absl::optional<Test3> b;
989 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
990 EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
994 absl::optional<Test1> a(absl::in_place);
995 absl::optional<Test3> b(absl::in_place);
1000 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
1001 EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
1005 absl::optional<Test1> a(absl::in_place);
1006 absl::optional<Test3> b;
1011 EXPECT_EQ(Test1::State::MOVED, a->state);
1012 EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
1016 absl::optional<Test1> a(absl::in_place);
1017 absl::optional<Test3> b(absl::in_place);
1022 EXPECT_EQ(Test1::State::MOVED, a->state);
1023 EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
1027 TEST(OptionalTest, OperatorStar) {
1029 absl::optional<float> a(0.1f);
1030 EXPECT_EQ(a.value(), *a);
1034 absl::optional<std::string> a("foo");
1035 EXPECT_EQ(a.value(), *a);
1039 absl::optional<TestObject> a(TestObject(3, 0.1));
1040 EXPECT_EQ(a.value(), *a);
1044 TEST(OptionalTest, OperatorStar_rvalue) {
1045 EXPECT_EQ(0.1f, *absl::optional<float>(0.1f));
1046 EXPECT_EQ(std::string("foo"), *absl::optional<std::string>("foo"));
1047 EXPECT_TRUE(TestObject(3, 0.1) ==
1048 *absl::optional<TestObject>(TestObject(3, 0.1)));
1051 TEST(OptionalTest, OperatorArrow) {
1052 absl::optional<TestObject> a(TestObject(3, 0.1));
1053 EXPECT_EQ(a->foo(), 3);
1056 TEST(OptionalTest, Value_rvalue) {
1057 EXPECT_EQ(0.1f, absl::optional<float>(0.1f).value());
1058 EXPECT_EQ(std::string("foo"), absl::optional<std::string>("foo").value());
1059 EXPECT_TRUE(TestObject(3, 0.1) ==
1060 absl::optional<TestObject>(TestObject(3, 0.1)).value());
1063 TEST(OptionalTest, ValueOr) {
1065 absl::optional<float> a;
1066 EXPECT_EQ(0.0f, a.value_or(0.0f));
1069 EXPECT_EQ(0.1f, a.value_or(0.0f));
1072 EXPECT_EQ(0.0f, a.value_or(0.0f));
1075 // value_or() can be constexpr.
1077 constexpr absl::optional<int> a(absl::in_place, 1);
1078 constexpr int value = a.value_or(10);
1079 EXPECT_EQ(1, value);
1082 constexpr absl::optional<int> a;
1083 constexpr int value = a.value_or(10);
1084 EXPECT_EQ(10, value);
1088 absl::optional<std::string> a;
1089 EXPECT_EQ("bar", a.value_or("bar"));
1091 a = std::string("foo");
1092 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
1095 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
1099 absl::optional<TestObject> a;
1100 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1102 a = TestObject(3, 0.1);
1103 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
1106 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1110 TEST(OptionalTest, Swap_bothNoValue) {
1111 absl::optional<TestObject> a, b;
1116 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1117 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1120 TEST(OptionalTest, Swap_inHasValue) {
1121 absl::optional<TestObject> a(TestObject(1, 0.3));
1122 absl::optional<TestObject> b;
1128 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1129 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1132 TEST(OptionalTest, Swap_outHasValue) {
1133 absl::optional<TestObject> a;
1134 absl::optional<TestObject> b(TestObject(1, 0.3));
1139 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1140 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1143 TEST(OptionalTest, Swap_bothValue) {
1144 absl::optional<TestObject> a(TestObject(0, 0.1));
1145 absl::optional<TestObject> b(TestObject(1, 0.3));
1150 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1151 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
1152 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1153 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
1156 TEST(OptionalTest, Emplace) {
1158 absl::optional<float> a(0.1f);
1159 EXPECT_EQ(0.3f, a.emplace(0.3f));
1162 EXPECT_EQ(0.3f, a.value());
1166 absl::optional<std::string> a("foo");
1167 EXPECT_EQ("bar", a.emplace("bar"));
1170 EXPECT_EQ("bar", a.value());
1174 absl::optional<TestObject> a(TestObject(0, 0.1));
1175 EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
1178 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
1182 absl::optional<std::vector<int>> a;
1183 auto& ref = a.emplace({2, 3});
1184 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1186 EXPECT_THAT(*a, ElementsAre(2, 3));
1187 EXPECT_EQ(&ref, &*a);
1191 absl::optional<std::vector<int>> a;
1192 auto& ref = a.emplace({4, 5}, std::allocator<int>());
1193 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1195 EXPECT_THAT(*a, ElementsAre(4, 5));
1196 EXPECT_EQ(&ref, &*a);
1200 TEST(OptionalTest, Equals_TwoEmpty) {
1201 absl::optional<int> a;
1202 absl::optional<int> b;
1204 EXPECT_TRUE(a == b);
1207 TEST(OptionalTest, Equals_TwoEquals) {
1208 absl::optional<int> a(1);
1209 absl::optional<int> b(1);
1211 EXPECT_TRUE(a == b);
1214 TEST(OptionalTest, Equals_OneEmpty) {
1215 absl::optional<int> a;
1216 absl::optional<int> b(1);
1218 EXPECT_FALSE(a == b);
1221 TEST(OptionalTest, Equals_TwoDifferent) {
1222 absl::optional<int> a(0);
1223 absl::optional<int> b(1);
1225 EXPECT_FALSE(a == b);
1228 TEST(OptionalTest, Equals_DifferentType) {
1229 absl::optional<int> a(0);
1230 absl::optional<double> b(0);
1232 EXPECT_TRUE(a == b);
1235 TEST(OptionalTest, NotEquals_TwoEmpty) {
1236 absl::optional<int> a;
1237 absl::optional<int> b;
1239 EXPECT_FALSE(a != b);
1242 TEST(OptionalTest, NotEquals_TwoEquals) {
1243 absl::optional<int> a(1);
1244 absl::optional<int> b(1);
1246 EXPECT_FALSE(a != b);
1249 TEST(OptionalTest, NotEquals_OneEmpty) {
1250 absl::optional<int> a;
1251 absl::optional<int> b(1);
1253 EXPECT_TRUE(a != b);
1256 TEST(OptionalTest, NotEquals_TwoDifferent) {
1257 absl::optional<int> a(0);
1258 absl::optional<int> b(1);
1260 EXPECT_TRUE(a != b);
1263 TEST(OptionalTest, NotEquals_DifferentType) {
1264 absl::optional<int> a(0);
1265 absl::optional<double> b(0.0);
1267 EXPECT_FALSE(a != b);
1270 TEST(OptionalTest, Less_LeftEmpty) {
1271 absl::optional<int> l;
1272 absl::optional<int> r(1);
1277 TEST(OptionalTest, Less_RightEmpty) {
1278 absl::optional<int> l(1);
1279 absl::optional<int> r;
1281 EXPECT_FALSE(l < r);
1284 TEST(OptionalTest, Less_BothEmpty) {
1285 absl::optional<int> l;
1286 absl::optional<int> r;
1288 EXPECT_FALSE(l < r);
1291 TEST(OptionalTest, Less_BothValues) {
1293 absl::optional<int> l(1);
1294 absl::optional<int> r(2);
1299 absl::optional<int> l(2);
1300 absl::optional<int> r(1);
1302 EXPECT_FALSE(l < r);
1305 absl::optional<int> l(1);
1306 absl::optional<int> r(1);
1308 EXPECT_FALSE(l < r);
1312 TEST(OptionalTest, Less_DifferentType) {
1313 absl::optional<int> l(1);
1314 absl::optional<double> r(2.0);
1319 TEST(OptionalTest, LessEq_LeftEmpty) {
1320 absl::optional<int> l;
1321 absl::optional<int> r(1);
1323 EXPECT_TRUE(l <= r);
1326 TEST(OptionalTest, LessEq_RightEmpty) {
1327 absl::optional<int> l(1);
1328 absl::optional<int> r;
1330 EXPECT_FALSE(l <= r);
1333 TEST(OptionalTest, LessEq_BothEmpty) {
1334 absl::optional<int> l;
1335 absl::optional<int> r;
1337 EXPECT_TRUE(l <= r);
1340 TEST(OptionalTest, LessEq_BothValues) {
1342 absl::optional<int> l(1);
1343 absl::optional<int> r(2);
1345 EXPECT_TRUE(l <= r);
1348 absl::optional<int> l(2);
1349 absl::optional<int> r(1);
1351 EXPECT_FALSE(l <= r);
1354 absl::optional<int> l(1);
1355 absl::optional<int> r(1);
1357 EXPECT_TRUE(l <= r);
1361 TEST(OptionalTest, LessEq_DifferentType) {
1362 absl::optional<int> l(1);
1363 absl::optional<double> r(2.0);
1365 EXPECT_TRUE(l <= r);
1368 TEST(OptionalTest, Greater_BothEmpty) {
1369 absl::optional<int> l;
1370 absl::optional<int> r;
1372 EXPECT_FALSE(l > r);
1375 TEST(OptionalTest, Greater_LeftEmpty) {
1376 absl::optional<int> l;
1377 absl::optional<int> r(1);
1379 EXPECT_FALSE(l > r);
1382 TEST(OptionalTest, Greater_RightEmpty) {
1383 absl::optional<int> l(1);
1384 absl::optional<int> r;
1389 TEST(OptionalTest, Greater_BothValue) {
1391 absl::optional<int> l(1);
1392 absl::optional<int> r(2);
1394 EXPECT_FALSE(l > r);
1397 absl::optional<int> l(2);
1398 absl::optional<int> r(1);
1403 absl::optional<int> l(1);
1404 absl::optional<int> r(1);
1406 EXPECT_FALSE(l > r);
1410 TEST(OptionalTest, Greater_DifferentType) {
1411 absl::optional<int> l(1);
1412 absl::optional<double> r(2.0);
1414 EXPECT_FALSE(l > r);
1417 TEST(OptionalTest, GreaterEq_BothEmpty) {
1418 absl::optional<int> l;
1419 absl::optional<int> r;
1421 EXPECT_TRUE(l >= r);
1424 TEST(OptionalTest, GreaterEq_LeftEmpty) {
1425 absl::optional<int> l;
1426 absl::optional<int> r(1);
1428 EXPECT_FALSE(l >= r);
1431 TEST(OptionalTest, GreaterEq_RightEmpty) {
1432 absl::optional<int> l(1);
1433 absl::optional<int> r;
1435 EXPECT_TRUE(l >= r);
1438 TEST(OptionalTest, GreaterEq_BothValue) {
1440 absl::optional<int> l(1);
1441 absl::optional<int> r(2);
1443 EXPECT_FALSE(l >= r);
1446 absl::optional<int> l(2);
1447 absl::optional<int> r(1);
1449 EXPECT_TRUE(l >= r);
1452 absl::optional<int> l(1);
1453 absl::optional<int> r(1);
1455 EXPECT_TRUE(l >= r);
1459 TEST(OptionalTest, GreaterEq_DifferentType) {
1460 absl::optional<int> l(1);
1461 absl::optional<double> r(2.0);
1463 EXPECT_FALSE(l >= r);
1466 TEST(OptionalTest, OptNullEq) {
1468 absl::optional<int> opt;
1469 EXPECT_TRUE(opt == absl::nullopt);
1472 absl::optional<int> opt(1);
1473 EXPECT_FALSE(opt == absl::nullopt);
1477 TEST(OptionalTest, NullOptEq) {
1479 absl::optional<int> opt;
1480 EXPECT_TRUE(absl::nullopt == opt);
1483 absl::optional<int> opt(1);
1484 EXPECT_FALSE(absl::nullopt == opt);
1488 TEST(OptionalTest, OptNullNotEq) {
1490 absl::optional<int> opt;
1491 EXPECT_FALSE(opt != absl::nullopt);
1494 absl::optional<int> opt(1);
1495 EXPECT_TRUE(opt != absl::nullopt);
1499 TEST(OptionalTest, NullOptNotEq) {
1501 absl::optional<int> opt;
1502 EXPECT_FALSE(absl::nullopt != opt);
1505 absl::optional<int> opt(1);
1506 EXPECT_TRUE(absl::nullopt != opt);
1510 TEST(OptionalTest, OptNullLower) {
1512 absl::optional<int> opt;
1513 EXPECT_FALSE(opt < absl::nullopt);
1516 absl::optional<int> opt(1);
1517 EXPECT_FALSE(opt < absl::nullopt);
1521 TEST(OptionalTest, NullOptLower) {
1523 absl::optional<int> opt;
1524 EXPECT_FALSE(absl::nullopt < opt);
1527 absl::optional<int> opt(1);
1528 EXPECT_TRUE(absl::nullopt < opt);
1532 TEST(OptionalTest, OptNullLowerEq) {
1534 absl::optional<int> opt;
1535 EXPECT_TRUE(opt <= absl::nullopt);
1538 absl::optional<int> opt(1);
1539 EXPECT_FALSE(opt <= absl::nullopt);
1543 TEST(OptionalTest, NullOptLowerEq) {
1545 absl::optional<int> opt;
1546 EXPECT_TRUE(absl::nullopt <= opt);
1549 absl::optional<int> opt(1);
1550 EXPECT_TRUE(absl::nullopt <= opt);
1554 TEST(OptionalTest, OptNullGreater) {
1556 absl::optional<int> opt;
1557 EXPECT_FALSE(opt > absl::nullopt);
1560 absl::optional<int> opt(1);
1561 EXPECT_TRUE(opt > absl::nullopt);
1565 TEST(OptionalTest, NullOptGreater) {
1567 absl::optional<int> opt;
1568 EXPECT_FALSE(absl::nullopt > opt);
1571 absl::optional<int> opt(1);
1572 EXPECT_FALSE(absl::nullopt > opt);
1576 TEST(OptionalTest, OptNullGreaterEq) {
1578 absl::optional<int> opt;
1579 EXPECT_TRUE(opt >= absl::nullopt);
1582 absl::optional<int> opt(1);
1583 EXPECT_TRUE(opt >= absl::nullopt);
1587 TEST(OptionalTest, NullOptGreaterEq) {
1589 absl::optional<int> opt;
1590 EXPECT_TRUE(absl::nullopt >= opt);
1593 absl::optional<int> opt(1);
1594 EXPECT_FALSE(absl::nullopt >= opt);
1598 TEST(OptionalTest, ValueEq_Empty) {
1599 absl::optional<int> opt;
1600 EXPECT_FALSE(opt == 1);
1603 TEST(OptionalTest, ValueEq_NotEmpty) {
1605 absl::optional<int> opt(0);
1606 EXPECT_FALSE(opt == 1);
1609 absl::optional<int> opt(1);
1610 EXPECT_TRUE(opt == 1);
1614 TEST(OptionalTest, ValueEq_DifferentType) {
1615 absl::optional<int> opt(0);
1616 EXPECT_TRUE(opt == 0.0);
1619 TEST(OptionalTest, EqValue_Empty) {
1620 absl::optional<int> opt;
1621 EXPECT_FALSE(1 == opt);
1624 TEST(OptionalTest, EqValue_NotEmpty) {
1626 absl::optional<int> opt(0);
1627 EXPECT_FALSE(1 == opt);
1630 absl::optional<int> opt(1);
1631 EXPECT_TRUE(1 == opt);
1635 TEST(OptionalTest, EqValue_DifferentType) {
1636 absl::optional<int> opt(0);
1637 EXPECT_TRUE(0.0 == opt);
1640 TEST(OptionalTest, ValueNotEq_Empty) {
1641 absl::optional<int> opt;
1642 EXPECT_TRUE(opt != 1);
1645 TEST(OptionalTest, ValueNotEq_NotEmpty) {
1647 absl::optional<int> opt(0);
1648 EXPECT_TRUE(opt != 1);
1651 absl::optional<int> opt(1);
1652 EXPECT_FALSE(opt != 1);
1656 TEST(OptionalTest, ValueNotEq_DifferentType) {
1657 absl::optional<int> opt(0);
1658 EXPECT_FALSE(opt != 0.0);
1661 TEST(OptionalTest, NotEqValue_Empty) {
1662 absl::optional<int> opt;
1663 EXPECT_TRUE(1 != opt);
1666 TEST(OptionalTest, NotEqValue_NotEmpty) {
1668 absl::optional<int> opt(0);
1669 EXPECT_TRUE(1 != opt);
1672 absl::optional<int> opt(1);
1673 EXPECT_FALSE(1 != opt);
1677 TEST(OptionalTest, NotEqValue_DifferentType) {
1678 absl::optional<int> opt(0);
1679 EXPECT_FALSE(0.0 != opt);
1682 TEST(OptionalTest, ValueLess_Empty) {
1683 absl::optional<int> opt;
1684 EXPECT_TRUE(opt < 1);
1687 TEST(OptionalTest, ValueLess_NotEmpty) {
1689 absl::optional<int> opt(0);
1690 EXPECT_TRUE(opt < 1);
1693 absl::optional<int> opt(1);
1694 EXPECT_FALSE(opt < 1);
1697 absl::optional<int> opt(2);
1698 EXPECT_FALSE(opt < 1);
1702 TEST(OptionalTest, ValueLess_DifferentType) {
1703 absl::optional<int> opt(0);
1704 EXPECT_TRUE(opt < 1.0);
1707 TEST(OptionalTest, LessValue_Empty) {
1708 absl::optional<int> opt;
1709 EXPECT_FALSE(1 < opt);
1712 TEST(OptionalTest, LessValue_NotEmpty) {
1714 absl::optional<int> opt(0);
1715 EXPECT_FALSE(1 < opt);
1718 absl::optional<int> opt(1);
1719 EXPECT_FALSE(1 < opt);
1722 absl::optional<int> opt(2);
1723 EXPECT_TRUE(1 < opt);
1727 TEST(OptionalTest, LessValue_DifferentType) {
1728 absl::optional<int> opt(0);
1729 EXPECT_FALSE(0.0 < opt);
1732 TEST(OptionalTest, ValueLessEq_Empty) {
1733 absl::optional<int> opt;
1734 EXPECT_TRUE(opt <= 1);
1737 TEST(OptionalTest, ValueLessEq_NotEmpty) {
1739 absl::optional<int> opt(0);
1740 EXPECT_TRUE(opt <= 1);
1743 absl::optional<int> opt(1);
1744 EXPECT_TRUE(opt <= 1);
1747 absl::optional<int> opt(2);
1748 EXPECT_FALSE(opt <= 1);
1752 TEST(OptionalTest, ValueLessEq_DifferentType) {
1753 absl::optional<int> opt(0);
1754 EXPECT_TRUE(opt <= 0.0);
1757 TEST(OptionalTest, LessEqValue_Empty) {
1758 absl::optional<int> opt;
1759 EXPECT_FALSE(1 <= opt);
1762 TEST(OptionalTest, LessEqValue_NotEmpty) {
1764 absl::optional<int> opt(0);
1765 EXPECT_FALSE(1 <= opt);
1768 absl::optional<int> opt(1);
1769 EXPECT_TRUE(1 <= opt);
1772 absl::optional<int> opt(2);
1773 EXPECT_TRUE(1 <= opt);
1777 TEST(OptionalTest, LessEqValue_DifferentType) {
1778 absl::optional<int> opt(0);
1779 EXPECT_TRUE(0.0 <= opt);
1782 TEST(OptionalTest, ValueGreater_Empty) {
1783 absl::optional<int> opt;
1784 EXPECT_FALSE(opt > 1);
1787 TEST(OptionalTest, ValueGreater_NotEmpty) {
1789 absl::optional<int> opt(0);
1790 EXPECT_FALSE(opt > 1);
1793 absl::optional<int> opt(1);
1794 EXPECT_FALSE(opt > 1);
1797 absl::optional<int> opt(2);
1798 EXPECT_TRUE(opt > 1);
1802 TEST(OptionalTest, ValueGreater_DifferentType) {
1803 absl::optional<int> opt(0);
1804 EXPECT_FALSE(opt > 0.0);
1807 TEST(OptionalTest, GreaterValue_Empty) {
1808 absl::optional<int> opt;
1809 EXPECT_TRUE(1 > opt);
1812 TEST(OptionalTest, GreaterValue_NotEmpty) {
1814 absl::optional<int> opt(0);
1815 EXPECT_TRUE(1 > opt);
1818 absl::optional<int> opt(1);
1819 EXPECT_FALSE(1 > opt);
1822 absl::optional<int> opt(2);
1823 EXPECT_FALSE(1 > opt);
1827 TEST(OptionalTest, GreaterValue_DifferentType) {
1828 absl::optional<int> opt(0);
1829 EXPECT_FALSE(0.0 > opt);
1832 TEST(OptionalTest, ValueGreaterEq_Empty) {
1833 absl::optional<int> opt;
1834 EXPECT_FALSE(opt >= 1);
1837 TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1839 absl::optional<int> opt(0);
1840 EXPECT_FALSE(opt >= 1);
1843 absl::optional<int> opt(1);
1844 EXPECT_TRUE(opt >= 1);
1847 absl::optional<int> opt(2);
1848 EXPECT_TRUE(opt >= 1);
1852 TEST(OptionalTest, ValueGreaterEq_DifferentType) {
1853 absl::optional<int> opt(0);
1854 EXPECT_TRUE(opt <= 0.0);
1857 TEST(OptionalTest, GreaterEqValue_Empty) {
1858 absl::optional<int> opt;
1859 EXPECT_TRUE(1 >= opt);
1862 TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1864 absl::optional<int> opt(0);
1865 EXPECT_TRUE(1 >= opt);
1868 absl::optional<int> opt(1);
1869 EXPECT_TRUE(1 >= opt);
1872 absl::optional<int> opt(2);
1873 EXPECT_FALSE(1 >= opt);
1877 TEST(OptionalTest, GreaterEqValue_DifferentType) {
1878 absl::optional<int> opt(0);
1879 EXPECT_TRUE(0.0 >= opt);
1882 TEST(OptionalTest, NotEquals) {
1884 absl::optional<float> a(0.1f);
1885 absl::optional<float> b(0.2f);
1890 absl::optional<std::string> a("foo");
1891 absl::optional<std::string> b("bar");
1896 absl::optional<int> a(1);
1897 absl::optional<double> b(2);
1902 absl::optional<TestObject> a(TestObject(3, 0.1));
1903 absl::optional<TestObject> b(TestObject(4, 1.0));
1904 EXPECT_TRUE(a != b);
1908 TEST(OptionalTest, NotEqualsNull) {
1910 absl::optional<float> a(0.1f);
1911 absl::optional<float> b(0.1f);
1917 absl::optional<std::string> a("foo");
1918 absl::optional<std::string> b("foo");
1924 absl::optional<TestObject> a(TestObject(3, 0.1));
1925 absl::optional<TestObject> b(TestObject(3, 0.1));
1927 EXPECT_TRUE(a != b);
1931 TEST(OptionalTest, MakeOptional) {
1933 absl::optional<float> o = absl::make_optional(32.f);
1935 EXPECT_EQ(32.f, *o);
1938 o = absl::make_optional(std::move(value));
1944 absl::optional<std::string> o = absl::make_optional(std::string("foo"));
1946 EXPECT_EQ("foo", *o);
1948 std::string value = "bar";
1949 o = absl::make_optional(std::move(value));
1951 EXPECT_EQ(std::string("bar"), *o);
1955 absl::optional<TestObject> o = absl::make_optional(TestObject(3, 0.1));
1957 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1959 TestObject value = TestObject(0, 0.42);
1960 o = absl::make_optional(std::move(value));
1962 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1963 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
1964 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
1966 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1967 absl::make_optional(std::move(value))->state());
1972 Test(int a, double b, bool c) : a(a), b(b), c(c) {}
1979 absl::optional<Test> o = absl::make_optional<Test>(1, 2.0, true);
1982 EXPECT_EQ(2.0, o->b);
1987 auto str1 = absl::make_optional<std::string>({'1', '2', '3'});
1988 EXPECT_EQ("123", *str1);
1990 auto str2 = absl::make_optional<std::string>({'a', 'b', 'c'},
1991 std::allocator<char>());
1992 EXPECT_EQ("abc", *str2);
1996 TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1997 absl::optional<TestObject> a, b;
2002 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
2003 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
2006 TEST(OptionalTest, NonMemberSwap_inHasValue) {
2007 absl::optional<TestObject> a(TestObject(1, 0.3));
2008 absl::optional<TestObject> b;
2013 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
2014 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
2017 TEST(OptionalTest, NonMemberSwap_outHasValue) {
2018 absl::optional<TestObject> a;
2019 absl::optional<TestObject> b(TestObject(1, 0.3));
2024 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2025 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
2028 TEST(OptionalTest, NonMemberSwap_bothValue) {
2029 absl::optional<TestObject> a(TestObject(0, 0.1));
2030 absl::optional<TestObject> b(TestObject(1, 0.3));
2035 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2036 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
2037 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
2038 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
2041 TEST(OptionalTest, Hash_OptionalReflectsInternal) {
2043 std::hash<int> int_hash;
2044 std::hash<absl::optional<int>> opt_int_hash;
2046 EXPECT_EQ(int_hash(1), opt_int_hash(absl::optional<int>(1)));
2050 std::hash<std::string> str_hash;
2051 std::hash<absl::optional<std::string>> opt_str_hash;
2053 EXPECT_EQ(str_hash(std::string("foobar")),
2054 opt_str_hash(absl::optional<std::string>(std::string("foobar"))));
2058 TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
2059 std::hash<absl::optional<int>> opt_int_hash;
2060 std::hash<absl::optional<std::string>> opt_str_hash;
2062 EXPECT_EQ(opt_str_hash(absl::optional<std::string>()),
2063 opt_int_hash(absl::optional<int>()));
2066 TEST(OptionalTest, Hash_UseInSet) {
2067 std::set<absl::optional<int>> setOptInt;
2069 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2071 setOptInt.insert(absl::optional<int>(3));
2072 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2073 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
2076 TEST(OptionalTest, HasValue) {
2077 absl::optional<int> a;
2078 EXPECT_FALSE(a.has_value());
2081 EXPECT_TRUE(a.has_value());
2084 EXPECT_FALSE(a.has_value());
2087 EXPECT_TRUE(a.has_value());
2089 a = absl::optional<int>();
2090 EXPECT_FALSE(a.has_value());
2093 TEST(OptionalTest, Reset_int) {
2094 absl::optional<int> a(0);
2095 EXPECT_TRUE(a.has_value());
2096 EXPECT_EQ(0, a.value());
2099 EXPECT_FALSE(a.has_value());
2100 EXPECT_EQ(-1, a.value_or(-1));
2103 TEST(OptionalTest, Reset_Object) {
2104 absl::optional<TestObject> a(TestObject(0, 0.1));
2105 EXPECT_TRUE(a.has_value());
2106 EXPECT_EQ(TestObject(0, 0.1), a.value());
2109 EXPECT_FALSE(a.has_value());
2110 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
2113 TEST(OptionalTest, Reset_NoOp) {
2114 absl::optional<int> a;
2115 EXPECT_FALSE(a.has_value());
2118 EXPECT_FALSE(a.has_value());
2121 TEST(OptionalTest, AssignFromRValue) {
2122 absl::optional<TestObject> a;
2123 EXPECT_FALSE(a.has_value());
2127 EXPECT_TRUE(a.has_value());
2128 EXPECT_EQ(1, a->move_ctors_count());
2131 TEST(OptionalTest, DontCallDefaultCtor) {
2132 absl::optional<DeletedDefaultConstructor> a;
2133 EXPECT_FALSE(a.has_value());
2135 a = absl::make_optional<DeletedDefaultConstructor>(42);
2136 EXPECT_TRUE(a.has_value());
2137 EXPECT_EQ(42, a->foo());
2140 TEST(OptionalTest, DontCallNewMemberFunction) {
2141 absl::optional<DeleteNewOperators> a;
2142 EXPECT_FALSE(a.has_value());
2144 a = DeleteNewOperators();
2145 EXPECT_TRUE(a.has_value());
2148 TEST(OptionalTest, DereferencingNoValueCrashes) {
2151 void Method() const {}
2155 const absl::optional<C> const_optional;
2156 EXPECT_DEATH_IF_SUPPORTED(const_optional.value(), "");
2157 EXPECT_DEATH_IF_SUPPORTED(const_optional->Method(), "");
2158 EXPECT_DEATH_IF_SUPPORTED(*const_optional, "");
2159 EXPECT_DEATH_IF_SUPPORTED(*std::move(const_optional), "");
2163 absl::optional<C> non_const_optional;
2164 EXPECT_DEATH_IF_SUPPORTED(non_const_optional.value(), "");
2165 EXPECT_DEATH_IF_SUPPORTED(non_const_optional->Method(), "");
2166 EXPECT_DEATH_IF_SUPPORTED(*non_const_optional, "");
2167 EXPECT_DEATH_IF_SUPPORTED(*std::move(non_const_optional), "");
2171 TEST(OptionalTest, Noexcept) {
2172 // Trivial copy ctor, non-trivial move ctor, nothrow move assign.
2174 Test1(const Test1&) = default;
2176 Test1& operator=(Test1&&) = default;
2178 // Non-trivial copy ctor, trivial move ctor, throw move assign.
2180 Test2(const Test2&) {}
2181 Test2(Test2&&) = default;
2182 Test2& operator=(Test2&&) { return *this; }
2184 // Trivial copy ctor, non-trivial nothrow move ctor.
2186 Test3(const Test3&) = default;
2187 Test3(Test3&&) noexcept {}
2189 // Non-trivial copy ctor, non-trivial nothrow move ctor.
2191 Test4(const Test4&) {}
2192 Test4(Test4&&) noexcept {}
2194 // Non-trivial copy ctor, non-trivial move ctor.
2196 Test5(const Test5&) {}
2201 noexcept(absl::optional<int>(std::declval<absl::optional<int>>())),
2202 "move constructor for noexcept move-constructible T must be noexcept "
2203 "(trivial copy, trivial move)");
2205 !noexcept(absl::optional<Test1>(std::declval<absl::optional<Test1>>())),
2206 "move constructor for non-noexcept move-constructible T must not be "
2207 "noexcept (trivial copy)");
2209 noexcept(absl::optional<Test2>(std::declval<absl::optional<Test2>>())),
2210 "move constructor for noexcept move-constructible T must be noexcept "
2211 "(non-trivial copy, trivial move)");
2213 noexcept(absl::optional<Test3>(std::declval<absl::optional<Test3>>())),
2214 "move constructor for noexcept move-constructible T must be noexcept "
2215 "(trivial copy, non-trivial move)");
2217 noexcept(absl::optional<Test4>(std::declval<absl::optional<Test4>>())),
2218 "move constructor for noexcept move-constructible T must be noexcept "
2219 "(non-trivial copy, non-trivial move)");
2221 !noexcept(absl::optional<Test5>(std::declval<absl::optional<Test5>>())),
2222 "move constructor for non-noexcept move-constructible T must not be "
2223 "noexcept (non-trivial copy)");
2225 static_assert(noexcept(std::declval<absl::optional<int>>() =
2226 std::declval<absl::optional<int>>()),
2227 "move assign for noexcept move-constructible/move-assignable T "
2228 "must be noexcept");
2230 !noexcept(std::declval<absl::optional<Test1>>() =
2231 std::declval<absl::optional<Test1>>()),
2232 "move assign for non-noexcept move-constructible T must not be noexcept");
2234 !noexcept(std::declval<absl::optional<Test2>>() =
2235 std::declval<absl::optional<Test2>>()),
2236 "move assign for non-noexcept move-assignable T must not be noexcept");
2239 TEST(OptionalTest, OverrideAddressOf) {
2240 // Objects with an overloaded address-of should not trigger the overload for
2241 // arrow or copy assignment.
2242 static_assert(std::is_trivially_destructible<
2243 TriviallyDestructibleOverloadAddressOf>::value,
2244 "Trivially...AddressOf must be trivially destructible.");
2245 absl::optional<TriviallyDestructibleOverloadAddressOf> optional;
2246 TriviallyDestructibleOverloadAddressOf n;
2249 // operator->() should not call address-of either, for either const or non-
2250 // const calls. It's not strictly necessary that we call a nonconst method
2251 // to test the non-const operator->(), but it makes it very clear that the
2252 // compiler can't chose the const operator->().
2253 optional->nonconst_method();
2254 const auto& const_optional = optional;
2255 const_optional->const_method();
2257 static_assert(!std::is_trivially_destructible<
2258 NonTriviallyDestructibleOverloadAddressOf>::value,
2259 "NotTrivially...AddressOf must not be trivially destructible.");
2260 absl::optional<NonTriviallyDestructibleOverloadAddressOf> nontrivial_optional;
2261 NonTriviallyDestructibleOverloadAddressOf n1;
2262 nontrivial_optional = n1;