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.
5 #include "base/optional.h"
12 #include "base/macros.h"
13 #include "base/test/gtest_util.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
17 using ::testing::ElementsAre;
23 // Object used to test complex object with Optional<T> in addition of the move
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 } // anonymous namespace
178 static_assert(std::is_trivially_destructible<Optional<int>>::value,
179 "OptionalIsTriviallyDestructible");
182 !std::is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
183 "OptionalIsTriviallyDestructible");
185 static_assert(sizeof(Optional<int>) == sizeof(internal::OptionalBase<int>),
186 "internal::{Copy,Move}{Constructible,Assignable} structs "
187 "should be 0-sized");
189 TEST(OptionalTest, DefaultConstructor) {
191 constexpr Optional<float> o;
196 Optional<std::string> o;
201 Optional<TestObject> o;
206 TEST(OptionalTest, CopyConstructor) {
208 constexpr Optional<float> first(0.1f);
209 constexpr Optional<float> other(first);
212 EXPECT_EQ(other.value(), 0.1f);
213 EXPECT_EQ(first, other);
217 Optional<std::string> first("foo");
218 Optional<std::string> other(first);
221 EXPECT_EQ(other.value(), "foo");
222 EXPECT_EQ(first, other);
226 const Optional<std::string> first("foo");
227 Optional<std::string> other(first);
230 EXPECT_EQ(other.value(), "foo");
231 EXPECT_EQ(first, other);
235 Optional<TestObject> first(TestObject(3, 0.1));
236 Optional<TestObject> other(first);
238 EXPECT_TRUE(!!other);
239 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
240 EXPECT_TRUE(first == other);
244 TEST(OptionalTest, ValueConstructor) {
246 constexpr float value = 0.1f;
247 constexpr Optional<float> o(value);
250 EXPECT_EQ(value, o.value());
254 std::string value("foo");
255 Optional<std::string> o(value);
258 EXPECT_EQ(value, o.value());
262 TestObject value(3, 0.1);
263 Optional<TestObject> o(value);
266 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
267 EXPECT_EQ(value, o.value());
271 TEST(OptionalTest, MoveConstructor) {
273 constexpr Optional<float> first(0.1f);
274 constexpr Optional<float> second(std::move(first));
276 EXPECT_TRUE(second.has_value());
277 EXPECT_EQ(second.value(), 0.1f);
279 EXPECT_TRUE(first.has_value());
283 Optional<std::string> first("foo");
284 Optional<std::string> second(std::move(first));
286 EXPECT_TRUE(second.has_value());
287 EXPECT_EQ("foo", second.value());
289 EXPECT_TRUE(first.has_value());
293 Optional<TestObject> first(TestObject(3, 0.1));
294 Optional<TestObject> second(std::move(first));
296 EXPECT_TRUE(second.has_value());
297 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
298 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
300 EXPECT_TRUE(first.has_value());
301 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
304 // Even if copy constructor is deleted, move constructor needs to work.
305 // Note that it couldn't be constexpr.
307 Optional<DeletedCopy> first(in_place, 42);
308 Optional<DeletedCopy> second(std::move(first));
310 EXPECT_TRUE(second.has_value());
311 EXPECT_EQ(42, second->foo());
313 EXPECT_TRUE(first.has_value());
317 Optional<DeletedMove> first(in_place, 42);
318 Optional<DeletedMove> second(std::move(first));
320 EXPECT_TRUE(second.has_value());
321 EXPECT_EQ(42, second->foo());
323 EXPECT_TRUE(first.has_value());
327 Optional<NonTriviallyDestructibleDeletedCopyConstructor> first(in_place,
329 Optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
332 EXPECT_TRUE(second.has_value());
333 EXPECT_EQ(42, second->foo());
335 EXPECT_TRUE(first.has_value());
339 TEST(OptionalTest, MoveValueConstructor) {
341 constexpr float value = 0.1f;
342 constexpr Optional<float> o(std::move(value));
345 EXPECT_EQ(0.1f, o.value());
350 Optional<float> o(std::move(value));
353 EXPECT_EQ(0.1f, o.value());
357 std::string value("foo");
358 Optional<std::string> o(std::move(value));
361 EXPECT_EQ("foo", o.value());
365 TestObject value(3, 0.1);
366 Optional<TestObject> o(std::move(value));
369 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
370 EXPECT_EQ(TestObject(3, 0.1), o.value());
374 TEST(OptionalTest, ConvertingCopyConstructor) {
376 Optional<int> first(1);
377 Optional<double> second(first);
378 EXPECT_TRUE(second.has_value());
379 EXPECT_EQ(1.0, second.value());
382 // Make sure explicit is not marked for convertible case.
385 ignore_result<Optional<double>>(o);
389 TEST(OptionalTest, ConvertingMoveConstructor) {
391 Optional<int> first(1);
392 Optional<double> second(std::move(first));
393 EXPECT_TRUE(second.has_value());
394 EXPECT_EQ(1.0, second.value());
397 // Make sure explicit is not marked for convertible case.
400 ignore_result<Optional<double>>(std::move(o));
406 explicit Test1(int foo) : foo_(foo) {}
408 int foo() const { return foo_; }
414 // Not copyable but convertible from Test1.
417 Test2(const Test2&) = delete;
418 explicit Test2(Test1&& other) : bar_(other.foo()) {}
420 double bar() const { return bar_; }
426 Optional<Test1> first(in_place, 42);
427 Optional<Test2> second(std::move(first));
428 EXPECT_TRUE(second.has_value());
429 EXPECT_EQ(42.0, second->bar());
433 TEST(OptionalTest, ConstructorForwardArguments) {
435 constexpr Optional<float> a(base::in_place, 0.1f);
437 EXPECT_EQ(0.1f, a.value());
441 Optional<float> a(base::in_place, 0.1f);
443 EXPECT_EQ(0.1f, a.value());
447 Optional<std::string> a(base::in_place, "foo");
449 EXPECT_EQ("foo", a.value());
453 Optional<TestObject> a(base::in_place, 0, 0.1);
455 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
459 TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
461 Optional<std::vector<int>> opt(in_place, {3, 1});
463 EXPECT_THAT(*opt, ElementsAre(3, 1));
464 EXPECT_EQ(2u, opt->size());
468 Optional<std::vector<int>> opt(in_place, {3, 1}, std::allocator<int>());
470 EXPECT_THAT(*opt, ElementsAre(3, 1));
471 EXPECT_EQ(2u, opt->size());
475 TEST(OptionalTest, ForwardConstructor) {
477 Optional<double> a(1);
478 EXPECT_TRUE(a.has_value());
479 EXPECT_EQ(1.0, a.value());
482 // Test that default type of 'U' is value_type.
490 Optional<TestData> a({1, 2.0, true});
491 EXPECT_TRUE(a.has_value());
493 EXPECT_EQ(2.0, a->b);
497 // If T has a constructor with a param Optional<U>, and another ctor with a
498 // param U, then T(Optional<U>) should be used for Optional<T>(Optional<U>)
501 enum class ParamType {
510 Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
511 Test(const Test& param) : param_type(ParamType::COPY_CONSTRUCTED) {}
512 Test(Test&& param) : param_type(ParamType::MOVE_CONSTRUCTED) {}
513 explicit Test(int param) : param_type(ParamType::INT) {}
514 explicit Test(in_place_t param) : param_type(ParamType::IN_PLACE) {}
515 explicit Test(Optional<int> param)
516 : param_type(ParamType::OPTIONAL_INT) {}
518 ParamType param_type;
521 // Overload resolution with copy-conversion constructor.
523 const Optional<int> arg(in_place, 1);
524 Optional<Test> testee(arg);
525 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
528 // Overload resolution with move conversion constructor.
530 Optional<Test> testee(Optional<int>(in_place, 1));
531 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
534 // Default constructor should be used.
536 Optional<Test> testee(in_place);
537 EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
543 Test(int a) {} // NOLINT(runtime/explicit)
545 // If T is convertible from U, it is not marked as explicit.
546 static_assert(std::is_convertible<int, Test>::value,
547 "Int should be convertible to Test.");
548 ([](Optional<Test> param) {})(1);
552 TEST(OptionalTest, NulloptConstructor) {
553 constexpr Optional<int> a(base::nullopt);
557 TEST(OptionalTest, AssignValue) {
564 Optional<float> b(0.1f);
569 Optional<std::string> a;
571 a = std::string("foo");
574 Optional<std::string> b(std::string("foo"));
579 Optional<TestObject> a;
581 a = TestObject(3, 0.1);
584 Optional<TestObject> b(TestObject(3, 0.1));
589 Optional<TestObject> a = TestObject(4, 1.0);
591 a = TestObject(3, 0.1);
594 Optional<TestObject> b(TestObject(3, 0.1));
599 TEST(OptionalTest, AssignObject) {
602 Optional<float> b(0.1f);
606 EXPECT_EQ(a.value(), 0.1f);
611 Optional<std::string> a;
612 Optional<std::string> b("foo");
616 EXPECT_EQ(a.value(), "foo");
621 Optional<TestObject> a;
622 Optional<TestObject> b(TestObject(3, 0.1));
626 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
631 Optional<TestObject> a(TestObject(4, 1.0));
632 Optional<TestObject> b(TestObject(3, 0.1));
636 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
641 Optional<DeletedMove> a(in_place, 42);
642 Optional<DeletedMove> b;
647 EXPECT_EQ(a->foo(), b->foo());
651 Optional<DeletedMove> a(in_place, 42);
652 Optional<DeletedMove> b(in_place, 1);
657 EXPECT_EQ(a->foo(), b->foo());
660 // Converting assignment.
662 Optional<int> a(in_place, 1);
668 EXPECT_EQ(1, a.value());
669 EXPECT_EQ(1.0, b.value());
673 Optional<int> a(in_place, 42);
674 Optional<double> b(in_place, 1);
679 EXPECT_EQ(42, a.value());
680 EXPECT_EQ(42.0, b.value());
685 Optional<double> b(in_place, 1);
692 TEST(OptionalTest, AssignObject_rvalue) {
695 Optional<float> b(0.1f);
700 EXPECT_EQ(0.1f, a.value());
704 Optional<std::string> a;
705 Optional<std::string> b("foo");
710 EXPECT_EQ("foo", a.value());
714 Optional<TestObject> a;
715 Optional<TestObject> b(TestObject(3, 0.1));
720 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
722 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
723 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
727 Optional<TestObject> a(TestObject(4, 1.0));
728 Optional<TestObject> b(TestObject(3, 0.1));
733 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
735 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
736 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
740 Optional<DeletedMove> a(in_place, 42);
741 Optional<DeletedMove> b;
746 EXPECT_EQ(42, b->foo());
750 Optional<DeletedMove> a(in_place, 42);
751 Optional<DeletedMove> b(in_place, 1);
756 EXPECT_EQ(42, b->foo());
759 // Converting assignment.
761 Optional<int> a(in_place, 1);
767 EXPECT_EQ(1.0, b.value());
771 Optional<int> a(in_place, 42);
772 Optional<double> b(in_place, 1);
777 EXPECT_EQ(42.0, b.value());
782 Optional<double> b(in_place, 1);
790 TEST(OptionalTest, AssignNull) {
792 Optional<float> a(0.1f);
793 Optional<float> b(0.2f);
800 Optional<std::string> a("foo");
801 Optional<std::string> b("bar");
808 Optional<TestObject> a(TestObject(3, 0.1));
809 Optional<TestObject> b(TestObject(4, 1.0));
816 TEST(OptionalTest, AssignOverload) {
822 State state = State::CONSTRUCTED;
825 // Here, Optional<Test2> can be assigned from Optioanl<Test1>.
826 // In case of move, marks MOVED to Test1 instance.
830 COPY_CONSTRUCTED_FROM_TEST1,
831 MOVE_CONSTRUCTED_FROM_TEST1,
832 COPY_ASSIGNED_FROM_TEST1,
833 MOVE_ASSIGNED_FROM_TEST1,
837 explicit Test2(const Test1& test1)
838 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
839 explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
840 test1.state = Test1::State::MOVED;
842 Test2& operator=(const Test1& test1) {
843 state = State::COPY_ASSIGNED_FROM_TEST1;
846 Test2& operator=(Test1&& test1) {
847 state = State::MOVE_ASSIGNED_FROM_TEST1;
848 test1.state = Test1::State::MOVED;
852 State state = State::DEFAULT_CONSTRUCTED;
856 Optional<Test1> a(in_place);
862 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
863 EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
867 Optional<Test1> a(in_place);
868 Optional<Test2> b(in_place);
873 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
874 EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
878 Optional<Test1> a(in_place);
884 EXPECT_EQ(Test1::State::MOVED, a->state);
885 EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
889 Optional<Test1> a(in_place);
890 Optional<Test2> b(in_place);
895 EXPECT_EQ(Test1::State::MOVED, a->state);
896 EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
899 // Similar to Test2, but Test3 also has copy/move ctor and assign operators
900 // from Optional<Test1>, too. In this case, for a = b where a is
901 // Optional<Test3> and b is Optional<Test1>,
902 // Optional<T>::operator=(U&&) where U is Optional<Test1> should be used
903 // rather than Optional<T>::operator=(Optional<U>&&) where U is Test1.
907 COPY_CONSTRUCTED_FROM_TEST1,
908 MOVE_CONSTRUCTED_FROM_TEST1,
909 COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
910 MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
911 COPY_ASSIGNED_FROM_TEST1,
912 MOVE_ASSIGNED_FROM_TEST1,
913 COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
914 MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
918 explicit Test3(const Test1& test1)
919 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
920 explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
921 test1.state = Test1::State::MOVED;
923 explicit Test3(const Optional<Test1>& test1)
924 : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
925 explicit Test3(Optional<Test1>&& test1)
926 : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
927 // In the following senarios, given |test1| should always have value.
928 DCHECK(test1.has_value());
929 test1->state = Test1::State::MOVED;
931 Test3& operator=(const Test1& test1) {
932 state = State::COPY_ASSIGNED_FROM_TEST1;
935 Test3& operator=(Test1&& test1) {
936 state = State::MOVE_ASSIGNED_FROM_TEST1;
937 test1.state = Test1::State::MOVED;
940 Test3& operator=(const Optional<Test1>& test1) {
941 state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
944 Test3& operator=(Optional<Test1>&& test1) {
945 state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
946 // In the following senarios, given |test1| should always have value.
947 DCHECK(test1.has_value());
948 test1->state = Test1::State::MOVED;
952 State state = State::DEFAULT_CONSTRUCTED;
956 Optional<Test1> a(in_place);
962 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
963 EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
967 Optional<Test1> a(in_place);
968 Optional<Test3> b(in_place);
973 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
974 EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
978 Optional<Test1> a(in_place);
984 EXPECT_EQ(Test1::State::MOVED, a->state);
985 EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
989 Optional<Test1> a(in_place);
990 Optional<Test3> b(in_place);
995 EXPECT_EQ(Test1::State::MOVED, a->state);
996 EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
1000 TEST(OptionalTest, OperatorStar) {
1002 Optional<float> a(0.1f);
1003 EXPECT_EQ(a.value(), *a);
1007 Optional<std::string> a("foo");
1008 EXPECT_EQ(a.value(), *a);
1012 Optional<TestObject> a(TestObject(3, 0.1));
1013 EXPECT_EQ(a.value(), *a);
1017 TEST(OptionalTest, OperatorStar_rvalue) {
1018 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
1019 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
1020 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
1023 TEST(OptionalTest, OperatorArrow) {
1024 Optional<TestObject> a(TestObject(3, 0.1));
1025 EXPECT_EQ(a->foo(), 3);
1028 TEST(OptionalTest, Value_rvalue) {
1029 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
1030 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
1031 EXPECT_TRUE(TestObject(3, 0.1) ==
1032 Optional<TestObject>(TestObject(3, 0.1)).value());
1035 TEST(OptionalTest, ValueOr) {
1038 EXPECT_EQ(0.0f, a.value_or(0.0f));
1041 EXPECT_EQ(0.1f, a.value_or(0.0f));
1044 EXPECT_EQ(0.0f, a.value_or(0.0f));
1047 // value_or() can be constexpr.
1049 constexpr Optional<int> a(in_place, 1);
1050 constexpr int value = a.value_or(10);
1051 EXPECT_EQ(1, value);
1054 constexpr Optional<int> a;
1055 constexpr int value = a.value_or(10);
1056 EXPECT_EQ(10, value);
1060 Optional<std::string> a;
1061 EXPECT_EQ("bar", a.value_or("bar"));
1063 a = std::string("foo");
1064 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
1067 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
1071 Optional<TestObject> a;
1072 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1074 a = TestObject(3, 0.1);
1075 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
1078 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1082 TEST(OptionalTest, Swap_bothNoValue) {
1083 Optional<TestObject> a, b;
1088 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1089 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1092 TEST(OptionalTest, Swap_inHasValue) {
1093 Optional<TestObject> a(TestObject(1, 0.3));
1094 Optional<TestObject> b;
1100 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1101 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1104 TEST(OptionalTest, Swap_outHasValue) {
1105 Optional<TestObject> a;
1106 Optional<TestObject> b(TestObject(1, 0.3));
1111 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1112 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1115 TEST(OptionalTest, Swap_bothValue) {
1116 Optional<TestObject> a(TestObject(0, 0.1));
1117 Optional<TestObject> b(TestObject(1, 0.3));
1122 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1123 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
1124 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1125 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
1128 TEST(OptionalTest, Emplace) {
1130 Optional<float> a(0.1f);
1131 EXPECT_EQ(0.3f, a.emplace(0.3f));
1134 EXPECT_EQ(0.3f, a.value());
1138 Optional<std::string> a("foo");
1139 EXPECT_EQ("bar", a.emplace("bar"));
1142 EXPECT_EQ("bar", a.value());
1146 Optional<TestObject> a(TestObject(0, 0.1));
1147 EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
1150 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
1154 Optional<std::vector<int>> a;
1155 auto& ref = a.emplace({2, 3});
1156 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1158 EXPECT_THAT(*a, ElementsAre(2, 3));
1159 EXPECT_EQ(&ref, &*a);
1163 Optional<std::vector<int>> a;
1164 auto& ref = a.emplace({4, 5}, std::allocator<int>());
1165 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1167 EXPECT_THAT(*a, ElementsAre(4, 5));
1168 EXPECT_EQ(&ref, &*a);
1172 TEST(OptionalTest, Equals_TwoEmpty) {
1176 EXPECT_TRUE(a == b);
1179 TEST(OptionalTest, Equals_TwoEquals) {
1183 EXPECT_TRUE(a == b);
1186 TEST(OptionalTest, Equals_OneEmpty) {
1190 EXPECT_FALSE(a == b);
1193 TEST(OptionalTest, Equals_TwoDifferent) {
1197 EXPECT_FALSE(a == b);
1200 TEST(OptionalTest, Equals_DifferentType) {
1202 Optional<double> b(0);
1204 EXPECT_TRUE(a == b);
1207 TEST(OptionalTest, NotEquals_TwoEmpty) {
1211 EXPECT_FALSE(a != b);
1214 TEST(OptionalTest, NotEquals_TwoEquals) {
1218 EXPECT_FALSE(a != b);
1221 TEST(OptionalTest, NotEquals_OneEmpty) {
1225 EXPECT_TRUE(a != b);
1228 TEST(OptionalTest, NotEquals_TwoDifferent) {
1232 EXPECT_TRUE(a != b);
1235 TEST(OptionalTest, NotEquals_DifferentType) {
1237 Optional<double> b(0.0);
1239 EXPECT_FALSE(a != b);
1242 TEST(OptionalTest, Less_LeftEmpty) {
1249 TEST(OptionalTest, Less_RightEmpty) {
1253 EXPECT_FALSE(l < r);
1256 TEST(OptionalTest, Less_BothEmpty) {
1260 EXPECT_FALSE(l < r);
1263 TEST(OptionalTest, Less_BothValues) {
1274 EXPECT_FALSE(l < r);
1280 EXPECT_FALSE(l < r);
1284 TEST(OptionalTest, Less_DifferentType) {
1286 Optional<double> r(2.0);
1291 TEST(OptionalTest, LessEq_LeftEmpty) {
1295 EXPECT_TRUE(l <= r);
1298 TEST(OptionalTest, LessEq_RightEmpty) {
1302 EXPECT_FALSE(l <= r);
1305 TEST(OptionalTest, LessEq_BothEmpty) {
1309 EXPECT_TRUE(l <= r);
1312 TEST(OptionalTest, LessEq_BothValues) {
1317 EXPECT_TRUE(l <= r);
1323 EXPECT_FALSE(l <= r);
1329 EXPECT_TRUE(l <= r);
1333 TEST(OptionalTest, LessEq_DifferentType) {
1335 Optional<double> r(2.0);
1337 EXPECT_TRUE(l <= r);
1340 TEST(OptionalTest, Greater_BothEmpty) {
1344 EXPECT_FALSE(l > r);
1347 TEST(OptionalTest, Greater_LeftEmpty) {
1351 EXPECT_FALSE(l > r);
1354 TEST(OptionalTest, Greater_RightEmpty) {
1361 TEST(OptionalTest, Greater_BothValue) {
1366 EXPECT_FALSE(l > r);
1378 EXPECT_FALSE(l > r);
1382 TEST(OptionalTest, Greater_DifferentType) {
1384 Optional<double> r(2.0);
1386 EXPECT_FALSE(l > r);
1389 TEST(OptionalTest, GreaterEq_BothEmpty) {
1393 EXPECT_TRUE(l >= r);
1396 TEST(OptionalTest, GreaterEq_LeftEmpty) {
1400 EXPECT_FALSE(l >= r);
1403 TEST(OptionalTest, GreaterEq_RightEmpty) {
1407 EXPECT_TRUE(l >= r);
1410 TEST(OptionalTest, GreaterEq_BothValue) {
1415 EXPECT_FALSE(l >= r);
1421 EXPECT_TRUE(l >= r);
1427 EXPECT_TRUE(l >= r);
1431 TEST(OptionalTest, GreaterEq_DifferentType) {
1433 Optional<double> r(2.0);
1435 EXPECT_FALSE(l >= r);
1438 TEST(OptionalTest, OptNullEq) {
1441 EXPECT_TRUE(opt == base::nullopt);
1444 Optional<int> opt(1);
1445 EXPECT_FALSE(opt == base::nullopt);
1449 TEST(OptionalTest, NullOptEq) {
1452 EXPECT_TRUE(base::nullopt == opt);
1455 Optional<int> opt(1);
1456 EXPECT_FALSE(base::nullopt == opt);
1460 TEST(OptionalTest, OptNullNotEq) {
1463 EXPECT_FALSE(opt != base::nullopt);
1466 Optional<int> opt(1);
1467 EXPECT_TRUE(opt != base::nullopt);
1471 TEST(OptionalTest, NullOptNotEq) {
1474 EXPECT_FALSE(base::nullopt != opt);
1477 Optional<int> opt(1);
1478 EXPECT_TRUE(base::nullopt != opt);
1482 TEST(OptionalTest, OptNullLower) {
1485 EXPECT_FALSE(opt < base::nullopt);
1488 Optional<int> opt(1);
1489 EXPECT_FALSE(opt < base::nullopt);
1493 TEST(OptionalTest, NullOptLower) {
1496 EXPECT_FALSE(base::nullopt < opt);
1499 Optional<int> opt(1);
1500 EXPECT_TRUE(base::nullopt < opt);
1504 TEST(OptionalTest, OptNullLowerEq) {
1507 EXPECT_TRUE(opt <= base::nullopt);
1510 Optional<int> opt(1);
1511 EXPECT_FALSE(opt <= base::nullopt);
1515 TEST(OptionalTest, NullOptLowerEq) {
1518 EXPECT_TRUE(base::nullopt <= opt);
1521 Optional<int> opt(1);
1522 EXPECT_TRUE(base::nullopt <= opt);
1526 TEST(OptionalTest, OptNullGreater) {
1529 EXPECT_FALSE(opt > base::nullopt);
1532 Optional<int> opt(1);
1533 EXPECT_TRUE(opt > base::nullopt);
1537 TEST(OptionalTest, NullOptGreater) {
1540 EXPECT_FALSE(base::nullopt > opt);
1543 Optional<int> opt(1);
1544 EXPECT_FALSE(base::nullopt > opt);
1548 TEST(OptionalTest, OptNullGreaterEq) {
1551 EXPECT_TRUE(opt >= base::nullopt);
1554 Optional<int> opt(1);
1555 EXPECT_TRUE(opt >= base::nullopt);
1559 TEST(OptionalTest, NullOptGreaterEq) {
1562 EXPECT_TRUE(base::nullopt >= opt);
1565 Optional<int> opt(1);
1566 EXPECT_FALSE(base::nullopt >= opt);
1570 TEST(OptionalTest, ValueEq_Empty) {
1572 EXPECT_FALSE(opt == 1);
1575 TEST(OptionalTest, ValueEq_NotEmpty) {
1577 Optional<int> opt(0);
1578 EXPECT_FALSE(opt == 1);
1581 Optional<int> opt(1);
1582 EXPECT_TRUE(opt == 1);
1586 TEST(OptionalTest, ValueEq_DifferentType) {
1587 Optional<int> opt(0);
1588 EXPECT_TRUE(opt == 0.0);
1591 TEST(OptionalTest, EqValue_Empty) {
1593 EXPECT_FALSE(1 == opt);
1596 TEST(OptionalTest, EqValue_NotEmpty) {
1598 Optional<int> opt(0);
1599 EXPECT_FALSE(1 == opt);
1602 Optional<int> opt(1);
1603 EXPECT_TRUE(1 == opt);
1607 TEST(OptionalTest, EqValue_DifferentType) {
1608 Optional<int> opt(0);
1609 EXPECT_TRUE(0.0 == opt);
1612 TEST(OptionalTest, ValueNotEq_Empty) {
1614 EXPECT_TRUE(opt != 1);
1617 TEST(OptionalTest, ValueNotEq_NotEmpty) {
1619 Optional<int> opt(0);
1620 EXPECT_TRUE(opt != 1);
1623 Optional<int> opt(1);
1624 EXPECT_FALSE(opt != 1);
1628 TEST(OPtionalTest, ValueNotEq_DifferentType) {
1629 Optional<int> opt(0);
1630 EXPECT_FALSE(opt != 0.0);
1633 TEST(OptionalTest, NotEqValue_Empty) {
1635 EXPECT_TRUE(1 != opt);
1638 TEST(OptionalTest, NotEqValue_NotEmpty) {
1640 Optional<int> opt(0);
1641 EXPECT_TRUE(1 != opt);
1644 Optional<int> opt(1);
1645 EXPECT_FALSE(1 != opt);
1649 TEST(OptionalTest, NotEqValue_DifferentType) {
1650 Optional<int> opt(0);
1651 EXPECT_FALSE(0.0 != opt);
1654 TEST(OptionalTest, ValueLess_Empty) {
1656 EXPECT_TRUE(opt < 1);
1659 TEST(OptionalTest, ValueLess_NotEmpty) {
1661 Optional<int> opt(0);
1662 EXPECT_TRUE(opt < 1);
1665 Optional<int> opt(1);
1666 EXPECT_FALSE(opt < 1);
1669 Optional<int> opt(2);
1670 EXPECT_FALSE(opt < 1);
1674 TEST(OPtionalTest, ValueLess_DifferentType) {
1675 Optional<int> opt(0);
1676 EXPECT_TRUE(opt < 1.0);
1679 TEST(OptionalTest, LessValue_Empty) {
1681 EXPECT_FALSE(1 < opt);
1684 TEST(OptionalTest, LessValue_NotEmpty) {
1686 Optional<int> opt(0);
1687 EXPECT_FALSE(1 < opt);
1690 Optional<int> opt(1);
1691 EXPECT_FALSE(1 < opt);
1694 Optional<int> opt(2);
1695 EXPECT_TRUE(1 < opt);
1699 TEST(OptionalTest, LessValue_DifferentType) {
1700 Optional<int> opt(0);
1701 EXPECT_FALSE(0.0 < opt);
1704 TEST(OptionalTest, ValueLessEq_Empty) {
1706 EXPECT_TRUE(opt <= 1);
1709 TEST(OptionalTest, ValueLessEq_NotEmpty) {
1711 Optional<int> opt(0);
1712 EXPECT_TRUE(opt <= 1);
1715 Optional<int> opt(1);
1716 EXPECT_TRUE(opt <= 1);
1719 Optional<int> opt(2);
1720 EXPECT_FALSE(opt <= 1);
1724 TEST(OptionalTest, ValueLessEq_DifferentType) {
1725 Optional<int> opt(0);
1726 EXPECT_TRUE(opt <= 0.0);
1729 TEST(OptionalTest, LessEqValue_Empty) {
1731 EXPECT_FALSE(1 <= opt);
1734 TEST(OptionalTest, LessEqValue_NotEmpty) {
1736 Optional<int> opt(0);
1737 EXPECT_FALSE(1 <= opt);
1740 Optional<int> opt(1);
1741 EXPECT_TRUE(1 <= opt);
1744 Optional<int> opt(2);
1745 EXPECT_TRUE(1 <= opt);
1749 TEST(OptionalTest, LessEqValue_DifferentType) {
1750 Optional<int> opt(0);
1751 EXPECT_TRUE(0.0 <= opt);
1754 TEST(OptionalTest, ValueGreater_Empty) {
1756 EXPECT_FALSE(opt > 1);
1759 TEST(OptionalTest, ValueGreater_NotEmpty) {
1761 Optional<int> opt(0);
1762 EXPECT_FALSE(opt > 1);
1765 Optional<int> opt(1);
1766 EXPECT_FALSE(opt > 1);
1769 Optional<int> opt(2);
1770 EXPECT_TRUE(opt > 1);
1774 TEST(OptionalTest, ValueGreater_DifferentType) {
1775 Optional<int> opt(0);
1776 EXPECT_FALSE(opt > 0.0);
1779 TEST(OptionalTest, GreaterValue_Empty) {
1781 EXPECT_TRUE(1 > opt);
1784 TEST(OptionalTest, GreaterValue_NotEmpty) {
1786 Optional<int> opt(0);
1787 EXPECT_TRUE(1 > opt);
1790 Optional<int> opt(1);
1791 EXPECT_FALSE(1 > opt);
1794 Optional<int> opt(2);
1795 EXPECT_FALSE(1 > opt);
1799 TEST(OptionalTest, GreaterValue_DifferentType) {
1800 Optional<int> opt(0);
1801 EXPECT_FALSE(0.0 > opt);
1804 TEST(OptionalTest, ValueGreaterEq_Empty) {
1806 EXPECT_FALSE(opt >= 1);
1809 TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1811 Optional<int> opt(0);
1812 EXPECT_FALSE(opt >= 1);
1815 Optional<int> opt(1);
1816 EXPECT_TRUE(opt >= 1);
1819 Optional<int> opt(2);
1820 EXPECT_TRUE(opt >= 1);
1824 TEST(OptionalTest, ValueGreaterEq_DifferentType) {
1825 Optional<int> opt(0);
1826 EXPECT_TRUE(opt <= 0.0);
1829 TEST(OptionalTest, GreaterEqValue_Empty) {
1831 EXPECT_TRUE(1 >= opt);
1834 TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1836 Optional<int> opt(0);
1837 EXPECT_TRUE(1 >= opt);
1840 Optional<int> opt(1);
1841 EXPECT_TRUE(1 >= opt);
1844 Optional<int> opt(2);
1845 EXPECT_FALSE(1 >= opt);
1849 TEST(OptionalTest, GreaterEqValue_DifferentType) {
1850 Optional<int> opt(0);
1851 EXPECT_TRUE(0.0 >= opt);
1854 TEST(OptionalTest, NotEquals) {
1856 Optional<float> a(0.1f);
1857 Optional<float> b(0.2f);
1862 Optional<std::string> a("foo");
1863 Optional<std::string> b("bar");
1869 Optional<double> b(2);
1874 Optional<TestObject> a(TestObject(3, 0.1));
1875 Optional<TestObject> b(TestObject(4, 1.0));
1876 EXPECT_TRUE(a != b);
1880 TEST(OptionalTest, NotEqualsNull) {
1882 Optional<float> a(0.1f);
1883 Optional<float> b(0.1f);
1889 Optional<std::string> a("foo");
1890 Optional<std::string> b("foo");
1896 Optional<TestObject> a(TestObject(3, 0.1));
1897 Optional<TestObject> b(TestObject(3, 0.1));
1899 EXPECT_TRUE(a != b);
1903 TEST(OptionalTest, MakeOptional) {
1905 // Use qualified base::make_optional here and elsewhere to avoid the name
1906 // confliction to std::make_optional.
1907 // The name conflict happens only for types in std namespace, such as
1908 // std::string. The other qualified base::make_optional usages are just for
1910 Optional<float> o = base::make_optional(32.f);
1912 EXPECT_EQ(32.f, *o);
1915 o = base::make_optional(std::move(value));
1921 Optional<std::string> o = base::make_optional(std::string("foo"));
1923 EXPECT_EQ("foo", *o);
1925 std::string value = "bar";
1926 o = base::make_optional(std::move(value));
1928 EXPECT_EQ(std::string("bar"), *o);
1932 Optional<TestObject> o = base::make_optional(TestObject(3, 0.1));
1934 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1936 TestObject value = TestObject(0, 0.42);
1937 o = base::make_optional(std::move(value));
1939 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1940 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
1941 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
1943 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1944 base::make_optional(std::move(value))->state());
1949 Test(int a, double b, bool c) : a(a), b(b), c(c) {}
1956 Optional<Test> o = base::make_optional<Test>(1, 2.0, true);
1959 EXPECT_EQ(2.0, o->b);
1964 auto str1 = base::make_optional<std::string>({'1', '2', '3'});
1965 EXPECT_EQ("123", *str1);
1967 auto str2 = base::make_optional<std::string>({'a', 'b', 'c'},
1968 std::allocator<char>());
1969 EXPECT_EQ("abc", *str2);
1973 TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1974 Optional<TestObject> a, b;
1979 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1980 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1983 TEST(OptionalTest, NonMemberSwap_inHasValue) {
1984 Optional<TestObject> a(TestObject(1, 0.3));
1985 Optional<TestObject> b;
1990 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1991 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1994 TEST(OptionalTest, NonMemberSwap_outHasValue) {
1995 Optional<TestObject> a;
1996 Optional<TestObject> b(TestObject(1, 0.3));
2001 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2002 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
2005 TEST(OptionalTest, NonMemberSwap_bothValue) {
2006 Optional<TestObject> a(TestObject(0, 0.1));
2007 Optional<TestObject> b(TestObject(1, 0.3));
2012 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2013 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
2014 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
2015 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
2018 TEST(OptionalTest, Hash_OptionalReflectsInternal) {
2020 std::hash<int> int_hash;
2021 std::hash<Optional<int>> opt_int_hash;
2023 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
2027 std::hash<std::string> str_hash;
2028 std::hash<Optional<std::string>> opt_str_hash;
2030 EXPECT_EQ(str_hash(std::string("foobar")),
2031 opt_str_hash(Optional<std::string>(std::string("foobar"))));
2035 TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
2036 std::hash<Optional<int>> opt_int_hash;
2037 std::hash<Optional<std::string>> opt_str_hash;
2039 EXPECT_EQ(opt_str_hash(Optional<std::string>()),
2040 opt_int_hash(Optional<int>()));
2043 TEST(OptionalTest, Hash_UseInSet) {
2044 std::set<Optional<int>> setOptInt;
2046 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2048 setOptInt.insert(Optional<int>(3));
2049 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2050 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
2053 TEST(OptionalTest, HasValue) {
2055 EXPECT_FALSE(a.has_value());
2058 EXPECT_TRUE(a.has_value());
2061 EXPECT_FALSE(a.has_value());
2064 EXPECT_TRUE(a.has_value());
2066 a = Optional<int>();
2067 EXPECT_FALSE(a.has_value());
2070 TEST(OptionalTest, Reset_int) {
2072 EXPECT_TRUE(a.has_value());
2073 EXPECT_EQ(0, a.value());
2076 EXPECT_FALSE(a.has_value());
2077 EXPECT_EQ(-1, a.value_or(-1));
2080 TEST(OptionalTest, Reset_Object) {
2081 Optional<TestObject> a(TestObject(0, 0.1));
2082 EXPECT_TRUE(a.has_value());
2083 EXPECT_EQ(TestObject(0, 0.1), a.value());
2086 EXPECT_FALSE(a.has_value());
2087 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
2090 TEST(OptionalTest, Reset_NoOp) {
2092 EXPECT_FALSE(a.has_value());
2095 EXPECT_FALSE(a.has_value());
2098 TEST(OptionalTest, AssignFromRValue) {
2099 Optional<TestObject> a;
2100 EXPECT_FALSE(a.has_value());
2104 EXPECT_TRUE(a.has_value());
2105 EXPECT_EQ(1, a->move_ctors_count());
2108 TEST(OptionalTest, DontCallDefaultCtor) {
2109 Optional<DeletedDefaultConstructor> a;
2110 EXPECT_FALSE(a.has_value());
2112 a = base::make_optional<DeletedDefaultConstructor>(42);
2113 EXPECT_TRUE(a.has_value());
2114 EXPECT_EQ(42, a->foo());
2117 TEST(OptionalTest, DontCallNewMemberFunction) {
2118 Optional<DeleteNewOperators> a;
2119 EXPECT_FALSE(a.has_value());
2121 a = DeleteNewOperators();
2122 EXPECT_TRUE(a.has_value());
2125 TEST(OptionalTest, DereferencingNoValueCrashes) {
2128 void Method() const {}
2132 const Optional<C> const_optional;
2133 EXPECT_CHECK_DEATH(const_optional.value());
2134 EXPECT_CHECK_DEATH(const_optional->Method());
2135 EXPECT_CHECK_DEATH(*const_optional);
2136 EXPECT_CHECK_DEATH(*std::move(const_optional));
2140 Optional<C> non_const_optional;
2141 EXPECT_CHECK_DEATH(non_const_optional.value());
2142 EXPECT_CHECK_DEATH(non_const_optional->Method());
2143 EXPECT_CHECK_DEATH(*non_const_optional);
2144 EXPECT_CHECK_DEATH(*std::move(non_const_optional));
2148 TEST(OptionalTest, Noexcept) {
2149 // Trivial copy ctor, non-trivial move ctor, nothrow move assign.
2151 Test1(const Test1&) = default;
2153 Test1& operator=(Test1&&) = default;
2155 // Non-trivial copy ctor, trivial move ctor, throw move assign.
2157 Test2(const Test2&) {}
2158 Test2(Test2&&) = default;
2159 Test2& operator=(Test2&&) { return *this; }
2161 // Trivial copy ctor, non-trivial nothrow move ctor.
2163 Test3(const Test3&) = default;
2164 Test3(Test3&&) noexcept {}
2166 // Non-trivial copy ctor, non-trivial nothrow move ctor.
2168 Test4(const Test4&) {}
2169 Test4(Test4&&) noexcept {}
2171 // Non-trivial copy ctor, non-trivial move ctor.
2173 Test5(const Test5&) {}
2178 noexcept(Optional<int>(std::declval<Optional<int>>())),
2179 "move constructor for noexcept move-constructible T must be noexcept "
2180 "(trivial copy, trivial move)");
2182 !noexcept(Optional<Test1>(std::declval<Optional<Test1>>())),
2183 "move constructor for non-noexcept move-constructible T must not be "
2184 "noexcept (trivial copy)");
2186 noexcept(Optional<Test2>(std::declval<Optional<Test2>>())),
2187 "move constructor for noexcept move-constructible T must be noexcept "
2188 "(non-trivial copy, trivial move)");
2190 noexcept(Optional<Test3>(std::declval<Optional<Test3>>())),
2191 "move constructor for noexcept move-constructible T must be noexcept "
2192 "(trivial copy, non-trivial move)");
2194 noexcept(Optional<Test4>(std::declval<Optional<Test4>>())),
2195 "move constructor for noexcept move-constructible T must be noexcept "
2196 "(non-trivial copy, non-trivial move)");
2198 !noexcept(Optional<Test5>(std::declval<Optional<Test5>>())),
2199 "move constructor for non-noexcept move-constructible T must not be "
2200 "noexcept (non-trivial copy)");
2203 noexcept(std::declval<Optional<int>>() = std::declval<Optional<int>>()),
2204 "move assign for noexcept move-constructible/move-assignable T "
2205 "must be noexcept");
2207 !noexcept(std::declval<Optional<Test1>>() =
2208 std::declval<Optional<Test1>>()),
2209 "move assign for non-noexcept move-constructible T must not be noexcept");
2211 !noexcept(std::declval<Optional<Test2>>() =
2212 std::declval<Optional<Test2>>()),
2213 "move assign for non-noexcept move-assignable T must not be noexcept");