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 "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
15 using ::testing::ElementsAre;
21 // Object used to test complex object with Optional<T> in addition of the move
36 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
38 TestObject(int foo, double bar)
39 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
41 TestObject(const TestObject& other)
44 state_(State::COPY_CONSTRUCTED),
45 move_ctors_count_(other.move_ctors_count_) {}
47 TestObject(TestObject&& other)
48 : foo_(std::move(other.foo_)),
49 bar_(std::move(other.bar_)),
50 state_(State::MOVE_CONSTRUCTED),
51 move_ctors_count_(other.move_ctors_count_ + 1) {
52 other.state_ = State::MOVED_FROM;
55 TestObject& operator=(const TestObject& other) {
58 state_ = State::COPY_ASSIGNED;
59 move_ctors_count_ = other.move_ctors_count_;
63 TestObject& operator=(TestObject&& other) {
66 state_ = State::MOVE_ASSIGNED;
67 move_ctors_count_ = other.move_ctors_count_;
68 other.state_ = State::MOVED_FROM;
72 void Swap(TestObject* other) {
74 swap(foo_, other->foo_);
75 swap(bar_, other->bar_);
76 swap(move_ctors_count_, other->move_ctors_count_);
77 state_ = State::SWAPPED;
78 other->state_ = State::SWAPPED;
81 bool operator==(const TestObject& other) const {
82 return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
85 bool operator!=(const TestObject& other) const { return !(*this == other); }
87 int foo() const { return foo_; }
88 State state() const { return state_; }
89 int move_ctors_count() const { return move_ctors_count_; }
95 int move_ctors_count_ = 0;
98 // Implementing Swappable concept.
99 void swap(TestObject& lhs, TestObject& rhs) {
103 class NonTriviallyDestructible {
104 ~NonTriviallyDestructible() {}
107 class DeletedDefaultConstructor {
109 DeletedDefaultConstructor() = delete;
110 DeletedDefaultConstructor(int foo) : foo_(foo) {}
112 int foo() const { return foo_; }
120 explicit DeletedCopy(int foo) : foo_(foo) {}
121 DeletedCopy(const DeletedCopy&) = delete;
122 DeletedCopy(DeletedCopy&&) = default;
124 DeletedCopy& operator=(const DeletedCopy&) = delete;
125 DeletedCopy& operator=(DeletedCopy&&) = default;
127 int foo() const { return foo_; }
135 explicit DeletedMove(int foo) : foo_(foo) {}
136 DeletedMove(const DeletedMove&) = default;
137 DeletedMove(DeletedMove&&) = delete;
139 DeletedMove& operator=(const DeletedMove&) = default;
140 DeletedMove& operator=(DeletedMove&&) = delete;
142 int foo() const { return foo_; }
148 class NonTriviallyDestructibleDeletedCopyConstructor {
150 explicit NonTriviallyDestructibleDeletedCopyConstructor(int foo)
152 NonTriviallyDestructibleDeletedCopyConstructor(
153 const NonTriviallyDestructibleDeletedCopyConstructor&) = delete;
154 NonTriviallyDestructibleDeletedCopyConstructor(
155 NonTriviallyDestructibleDeletedCopyConstructor&&) = default;
157 ~NonTriviallyDestructibleDeletedCopyConstructor() {}
159 int foo() const { return foo_; }
165 class DeleteNewOperators {
167 void* operator new(size_t) = delete;
168 void* operator new(size_t, void*) = delete;
169 void* operator new[](size_t) = delete;
170 void* operator new[](size_t, void*) = delete;
173 } // anonymous namespace
175 static_assert(std::is_trivially_destructible<Optional<int>>::value,
176 "OptionalIsTriviallyDestructible");
179 !std::is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
180 "OptionalIsTriviallyDestructible");
182 static_assert(sizeof(Optional<int>) == sizeof(internal::OptionalBase<int>),
183 "internal::{Copy,Move}{Constructible,Assignable} structs "
184 "should be 0-sized");
186 TEST(OptionalTest, DefaultConstructor) {
188 constexpr Optional<float> o;
193 Optional<std::string> o;
198 Optional<TestObject> o;
203 TEST(OptionalTest, CopyConstructor) {
205 constexpr Optional<float> first(0.1f);
206 constexpr Optional<float> other(first);
209 EXPECT_EQ(other.value(), 0.1f);
210 EXPECT_EQ(first, other);
214 Optional<std::string> first("foo");
215 Optional<std::string> other(first);
218 EXPECT_EQ(other.value(), "foo");
219 EXPECT_EQ(first, other);
223 const Optional<std::string> first("foo");
224 Optional<std::string> other(first);
227 EXPECT_EQ(other.value(), "foo");
228 EXPECT_EQ(first, other);
232 Optional<TestObject> first(TestObject(3, 0.1));
233 Optional<TestObject> other(first);
235 EXPECT_TRUE(!!other);
236 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
237 EXPECT_TRUE(first == other);
241 TEST(OptionalTest, ValueConstructor) {
243 constexpr float value = 0.1f;
244 constexpr Optional<float> o(value);
247 EXPECT_EQ(value, o.value());
251 std::string value("foo");
252 Optional<std::string> o(value);
255 EXPECT_EQ(value, o.value());
259 TestObject value(3, 0.1);
260 Optional<TestObject> o(value);
263 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
264 EXPECT_EQ(value, o.value());
268 TEST(OptionalTest, MoveConstructor) {
270 constexpr Optional<float> first(0.1f);
271 constexpr Optional<float> second(std::move(first));
273 EXPECT_TRUE(second.has_value());
274 EXPECT_EQ(second.value(), 0.1f);
276 EXPECT_TRUE(first.has_value());
280 Optional<std::string> first("foo");
281 Optional<std::string> second(std::move(first));
283 EXPECT_TRUE(second.has_value());
284 EXPECT_EQ("foo", second.value());
286 EXPECT_TRUE(first.has_value());
290 Optional<TestObject> first(TestObject(3, 0.1));
291 Optional<TestObject> second(std::move(first));
293 EXPECT_TRUE(second.has_value());
294 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
295 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
297 EXPECT_TRUE(first.has_value());
298 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
301 // Even if copy constructor is deleted, move constructor needs to work.
302 // Note that it couldn't be constexpr.
304 Optional<DeletedCopy> first(in_place, 42);
305 Optional<DeletedCopy> second(std::move(first));
307 EXPECT_TRUE(second.has_value());
308 EXPECT_EQ(42, second->foo());
310 EXPECT_TRUE(first.has_value());
314 Optional<DeletedMove> first(in_place, 42);
315 Optional<DeletedMove> second(std::move(first));
317 EXPECT_TRUE(second.has_value());
318 EXPECT_EQ(42, second->foo());
320 EXPECT_TRUE(first.has_value());
324 Optional<NonTriviallyDestructibleDeletedCopyConstructor> first(in_place,
326 Optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
329 EXPECT_TRUE(second.has_value());
330 EXPECT_EQ(42, second->foo());
332 EXPECT_TRUE(first.has_value());
336 TEST(OptionalTest, MoveValueConstructor) {
338 constexpr float value = 0.1f;
339 constexpr Optional<float> o(std::move(value));
342 EXPECT_EQ(0.1f, o.value());
347 Optional<float> o(std::move(value));
350 EXPECT_EQ(0.1f, o.value());
354 std::string value("foo");
355 Optional<std::string> o(std::move(value));
358 EXPECT_EQ("foo", o.value());
362 TestObject value(3, 0.1);
363 Optional<TestObject> o(std::move(value));
366 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
367 EXPECT_EQ(TestObject(3, 0.1), o.value());
371 TEST(OptionalTest, ConvertingCopyConstructor) {
373 Optional<int> first(1);
374 Optional<double> second(first);
375 EXPECT_TRUE(second.has_value());
376 EXPECT_EQ(1.0, second.value());
379 // Make sure explicit is not marked for convertible case.
382 ignore_result<Optional<double>>(o);
386 TEST(OptionalTest, ConvertingMoveConstructor) {
388 Optional<int> first(1);
389 Optional<double> second(std::move(first));
390 EXPECT_TRUE(second.has_value());
391 EXPECT_EQ(1.0, second.value());
394 // Make sure explicit is not marked for convertible case.
397 ignore_result<Optional<double>>(std::move(o));
403 explicit Test1(int foo) : foo_(foo) {}
405 int foo() const { return foo_; }
411 // Not copyable but convertible from Test1.
414 Test2(const Test2&) = delete;
415 explicit Test2(Test1&& other) : bar_(other.foo()) {}
417 double bar() const { return bar_; }
423 Optional<Test1> first(in_place, 42);
424 Optional<Test2> second(std::move(first));
425 EXPECT_TRUE(second.has_value());
426 EXPECT_EQ(42.0, second->bar());
430 TEST(OptionalTest, ConstructorForwardArguments) {
432 constexpr Optional<float> a(base::in_place, 0.1f);
434 EXPECT_EQ(0.1f, a.value());
438 Optional<float> a(base::in_place, 0.1f);
440 EXPECT_EQ(0.1f, a.value());
444 Optional<std::string> a(base::in_place, "foo");
446 EXPECT_EQ("foo", a.value());
450 Optional<TestObject> a(base::in_place, 0, 0.1);
452 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
456 TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
458 Optional<std::vector<int>> opt(in_place, {3, 1});
460 EXPECT_THAT(*opt, ElementsAre(3, 1));
461 EXPECT_EQ(2u, opt->size());
465 Optional<std::vector<int>> opt(in_place, {3, 1}, std::allocator<int>());
467 EXPECT_THAT(*opt, ElementsAre(3, 1));
468 EXPECT_EQ(2u, opt->size());
472 TEST(OptionalTest, ForwardConstructor) {
474 Optional<double> a(1);
475 EXPECT_TRUE(a.has_value());
476 EXPECT_EQ(1.0, a.value());
479 // Test that default type of 'U' is value_type.
487 Optional<TestData> a({1, 2.0, true});
488 EXPECT_TRUE(a.has_value());
490 EXPECT_EQ(2.0, a->b);
494 // If T has a constructor with a param Optional<U>, and another ctor with a
495 // param U, then T(Optional<U>) should be used for Optional<T>(Optional<U>)
498 enum class ParamType {
507 Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
508 Test(const Test& param) : param_type(ParamType::COPY_CONSTRUCTED) {}
509 Test(Test&& param) : param_type(ParamType::MOVE_CONSTRUCTED) {}
510 explicit Test(int param) : param_type(ParamType::INT) {}
511 explicit Test(in_place_t param) : param_type(ParamType::IN_PLACE) {}
512 explicit Test(Optional<int> param)
513 : param_type(ParamType::OPTIONAL_INT) {}
515 ParamType param_type;
518 // Overload resolution with copy-conversion constructor.
520 const Optional<int> arg(in_place, 1);
521 Optional<Test> testee(arg);
522 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
525 // Overload resolution with move conversion constructor.
527 Optional<Test> testee(Optional<int>(in_place, 1));
528 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
531 // Default constructor should be used.
533 Optional<Test> testee(in_place);
534 EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
540 Test(int a) {} // NOLINT(runtime/explicit)
542 // If T is convertible from U, it is not marked as explicit.
543 static_assert(std::is_convertible<int, Test>::value,
544 "Int should be convertible to Test.");
545 ([](Optional<Test> param) {})(1);
549 TEST(OptionalTest, NulloptConstructor) {
550 constexpr Optional<int> a(base::nullopt);
554 TEST(OptionalTest, AssignValue) {
561 Optional<float> b(0.1f);
566 Optional<std::string> a;
568 a = std::string("foo");
571 Optional<std::string> b(std::string("foo"));
576 Optional<TestObject> a;
578 a = TestObject(3, 0.1);
581 Optional<TestObject> b(TestObject(3, 0.1));
586 Optional<TestObject> a = TestObject(4, 1.0);
588 a = TestObject(3, 0.1);
591 Optional<TestObject> b(TestObject(3, 0.1));
596 TEST(OptionalTest, AssignObject) {
599 Optional<float> b(0.1f);
603 EXPECT_EQ(a.value(), 0.1f);
608 Optional<std::string> a;
609 Optional<std::string> b("foo");
613 EXPECT_EQ(a.value(), "foo");
618 Optional<TestObject> a;
619 Optional<TestObject> b(TestObject(3, 0.1));
623 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
628 Optional<TestObject> a(TestObject(4, 1.0));
629 Optional<TestObject> b(TestObject(3, 0.1));
633 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
638 Optional<DeletedMove> a(in_place, 42);
639 Optional<DeletedMove> b;
644 EXPECT_EQ(a->foo(), b->foo());
648 Optional<DeletedMove> a(in_place, 42);
649 Optional<DeletedMove> b(in_place, 1);
654 EXPECT_EQ(a->foo(), b->foo());
657 // Converting assignment.
659 Optional<int> a(in_place, 1);
665 EXPECT_EQ(1, a.value());
666 EXPECT_EQ(1.0, b.value());
670 Optional<int> a(in_place, 42);
671 Optional<double> b(in_place, 1);
676 EXPECT_EQ(42, a.value());
677 EXPECT_EQ(42.0, b.value());
682 Optional<double> b(in_place, 1);
689 TEST(OptionalTest, AssignObject_rvalue) {
692 Optional<float> b(0.1f);
697 EXPECT_EQ(0.1f, a.value());
701 Optional<std::string> a;
702 Optional<std::string> b("foo");
707 EXPECT_EQ("foo", a.value());
711 Optional<TestObject> a;
712 Optional<TestObject> b(TestObject(3, 0.1));
717 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
719 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
720 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
724 Optional<TestObject> a(TestObject(4, 1.0));
725 Optional<TestObject> b(TestObject(3, 0.1));
730 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
732 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
733 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
737 Optional<DeletedMove> a(in_place, 42);
738 Optional<DeletedMove> b;
743 EXPECT_EQ(42, b->foo());
747 Optional<DeletedMove> a(in_place, 42);
748 Optional<DeletedMove> b(in_place, 1);
753 EXPECT_EQ(42, b->foo());
756 // Converting assignment.
758 Optional<int> a(in_place, 1);
764 EXPECT_EQ(1.0, b.value());
768 Optional<int> a(in_place, 42);
769 Optional<double> b(in_place, 1);
774 EXPECT_EQ(42.0, b.value());
779 Optional<double> b(in_place, 1);
787 TEST(OptionalTest, AssignNull) {
789 Optional<float> a(0.1f);
790 Optional<float> b(0.2f);
797 Optional<std::string> a("foo");
798 Optional<std::string> b("bar");
805 Optional<TestObject> a(TestObject(3, 0.1));
806 Optional<TestObject> b(TestObject(4, 1.0));
813 TEST(OptionalTest, AssignOverload) {
819 State state = State::CONSTRUCTED;
822 // Here, Optional<Test2> can be assigned from Optioanl<Test1>.
823 // In case of move, marks MOVED to Test1 instance.
827 COPY_CONSTRUCTED_FROM_TEST1,
828 MOVE_CONSTRUCTED_FROM_TEST1,
829 COPY_ASSIGNED_FROM_TEST1,
830 MOVE_ASSIGNED_FROM_TEST1,
834 explicit Test2(const Test1& test1)
835 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
836 explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
837 test1.state = Test1::State::MOVED;
839 Test2& operator=(const Test1& test1) {
840 state = State::COPY_ASSIGNED_FROM_TEST1;
843 Test2& operator=(Test1&& test1) {
844 state = State::MOVE_ASSIGNED_FROM_TEST1;
845 test1.state = Test1::State::MOVED;
849 State state = State::DEFAULT_CONSTRUCTED;
853 Optional<Test1> a(in_place);
859 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
860 EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
864 Optional<Test1> a(in_place);
865 Optional<Test2> b(in_place);
870 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
871 EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
875 Optional<Test1> a(in_place);
881 EXPECT_EQ(Test1::State::MOVED, a->state);
882 EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
886 Optional<Test1> a(in_place);
887 Optional<Test2> b(in_place);
892 EXPECT_EQ(Test1::State::MOVED, a->state);
893 EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
896 // Similar to Test2, but Test3 also has copy/move ctor and assign operators
897 // from Optional<Test1>, too. In this case, for a = b where a is
898 // Optional<Test3> and b is Optional<Test1>,
899 // Optional<T>::operator=(U&&) where U is Optional<Test1> should be used
900 // rather than Optional<T>::operator=(Optional<U>&&) where U is Test1.
904 COPY_CONSTRUCTED_FROM_TEST1,
905 MOVE_CONSTRUCTED_FROM_TEST1,
906 COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
907 MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
908 COPY_ASSIGNED_FROM_TEST1,
909 MOVE_ASSIGNED_FROM_TEST1,
910 COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
911 MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
915 explicit Test3(const Test1& test1)
916 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
917 explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
918 test1.state = Test1::State::MOVED;
920 explicit Test3(const Optional<Test1>& test1)
921 : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
922 explicit Test3(Optional<Test1>&& test1)
923 : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
924 // In the following senarios, given |test1| should always have value.
925 DCHECK(test1.has_value());
926 test1->state = Test1::State::MOVED;
928 Test3& operator=(const Test1& test1) {
929 state = State::COPY_ASSIGNED_FROM_TEST1;
932 Test3& operator=(Test1&& test1) {
933 state = State::MOVE_ASSIGNED_FROM_TEST1;
934 test1.state = Test1::State::MOVED;
937 Test3& operator=(const Optional<Test1>& test1) {
938 state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
941 Test3& operator=(Optional<Test1>&& test1) {
942 state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
943 // In the following senarios, given |test1| should always have value.
944 DCHECK(test1.has_value());
945 test1->state = Test1::State::MOVED;
949 State state = State::DEFAULT_CONSTRUCTED;
953 Optional<Test1> a(in_place);
959 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
960 EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
964 Optional<Test1> a(in_place);
965 Optional<Test3> b(in_place);
970 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
971 EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
975 Optional<Test1> a(in_place);
981 EXPECT_EQ(Test1::State::MOVED, a->state);
982 EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
986 Optional<Test1> a(in_place);
987 Optional<Test3> b(in_place);
992 EXPECT_EQ(Test1::State::MOVED, a->state);
993 EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
997 TEST(OptionalTest, OperatorStar) {
999 Optional<float> a(0.1f);
1000 EXPECT_EQ(a.value(), *a);
1004 Optional<std::string> a("foo");
1005 EXPECT_EQ(a.value(), *a);
1009 Optional<TestObject> a(TestObject(3, 0.1));
1010 EXPECT_EQ(a.value(), *a);
1014 TEST(OptionalTest, OperatorStar_rvalue) {
1015 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
1016 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
1017 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
1020 TEST(OptionalTest, OperatorArrow) {
1021 Optional<TestObject> a(TestObject(3, 0.1));
1022 EXPECT_EQ(a->foo(), 3);
1025 TEST(OptionalTest, Value_rvalue) {
1026 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
1027 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
1028 EXPECT_TRUE(TestObject(3, 0.1) ==
1029 Optional<TestObject>(TestObject(3, 0.1)).value());
1032 TEST(OptionalTest, ValueOr) {
1035 EXPECT_EQ(0.0f, a.value_or(0.0f));
1038 EXPECT_EQ(0.1f, a.value_or(0.0f));
1041 EXPECT_EQ(0.0f, a.value_or(0.0f));
1044 // value_or() can be constexpr.
1046 constexpr Optional<int> a(in_place, 1);
1047 constexpr int value = a.value_or(10);
1048 EXPECT_EQ(1, value);
1051 constexpr Optional<int> a;
1052 constexpr int value = a.value_or(10);
1053 EXPECT_EQ(10, value);
1057 Optional<std::string> a;
1058 EXPECT_EQ("bar", a.value_or("bar"));
1060 a = std::string("foo");
1061 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
1064 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
1068 Optional<TestObject> a;
1069 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1071 a = TestObject(3, 0.1);
1072 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
1075 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1079 TEST(OptionalTest, Swap_bothNoValue) {
1080 Optional<TestObject> a, b;
1085 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1086 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1089 TEST(OptionalTest, Swap_inHasValue) {
1090 Optional<TestObject> a(TestObject(1, 0.3));
1091 Optional<TestObject> b;
1097 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1098 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1101 TEST(OptionalTest, Swap_outHasValue) {
1102 Optional<TestObject> a;
1103 Optional<TestObject> b(TestObject(1, 0.3));
1108 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1109 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1112 TEST(OptionalTest, Swap_bothValue) {
1113 Optional<TestObject> a(TestObject(0, 0.1));
1114 Optional<TestObject> b(TestObject(1, 0.3));
1119 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1120 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
1121 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1122 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
1125 TEST(OptionalTest, Emplace) {
1127 Optional<float> a(0.1f);
1128 EXPECT_EQ(0.3f, a.emplace(0.3f));
1131 EXPECT_EQ(0.3f, a.value());
1135 Optional<std::string> a("foo");
1136 EXPECT_EQ("bar", a.emplace("bar"));
1139 EXPECT_EQ("bar", a.value());
1143 Optional<TestObject> a(TestObject(0, 0.1));
1144 EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
1147 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
1151 Optional<std::vector<int>> a;
1152 auto& ref = a.emplace({2, 3});
1153 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1155 EXPECT_THAT(*a, ElementsAre(2, 3));
1156 EXPECT_EQ(&ref, &*a);
1160 Optional<std::vector<int>> a;
1161 auto& ref = a.emplace({4, 5}, std::allocator<int>());
1162 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1164 EXPECT_THAT(*a, ElementsAre(4, 5));
1165 EXPECT_EQ(&ref, &*a);
1169 TEST(OptionalTest, Equals_TwoEmpty) {
1173 EXPECT_TRUE(a == b);
1176 TEST(OptionalTest, Equals_TwoEquals) {
1180 EXPECT_TRUE(a == b);
1183 TEST(OptionalTest, Equals_OneEmpty) {
1187 EXPECT_FALSE(a == b);
1190 TEST(OptionalTest, Equals_TwoDifferent) {
1194 EXPECT_FALSE(a == b);
1197 TEST(OptionalTest, Equals_DifferentType) {
1199 Optional<double> b(0);
1201 EXPECT_TRUE(a == b);
1204 TEST(OptionalTest, NotEquals_TwoEmpty) {
1208 EXPECT_FALSE(a != b);
1211 TEST(OptionalTest, NotEquals_TwoEquals) {
1215 EXPECT_FALSE(a != b);
1218 TEST(OptionalTest, NotEquals_OneEmpty) {
1222 EXPECT_TRUE(a != b);
1225 TEST(OptionalTest, NotEquals_TwoDifferent) {
1229 EXPECT_TRUE(a != b);
1232 TEST(OptionalTest, NotEquals_DifferentType) {
1234 Optional<double> b(0.0);
1236 EXPECT_FALSE(a != b);
1239 TEST(OptionalTest, Less_LeftEmpty) {
1246 TEST(OptionalTest, Less_RightEmpty) {
1250 EXPECT_FALSE(l < r);
1253 TEST(OptionalTest, Less_BothEmpty) {
1257 EXPECT_FALSE(l < r);
1260 TEST(OptionalTest, Less_BothValues) {
1271 EXPECT_FALSE(l < r);
1277 EXPECT_FALSE(l < r);
1281 TEST(OptionalTest, Less_DifferentType) {
1283 Optional<double> r(2.0);
1288 TEST(OptionalTest, LessEq_LeftEmpty) {
1292 EXPECT_TRUE(l <= r);
1295 TEST(OptionalTest, LessEq_RightEmpty) {
1299 EXPECT_FALSE(l <= r);
1302 TEST(OptionalTest, LessEq_BothEmpty) {
1306 EXPECT_TRUE(l <= r);
1309 TEST(OptionalTest, LessEq_BothValues) {
1314 EXPECT_TRUE(l <= r);
1320 EXPECT_FALSE(l <= r);
1326 EXPECT_TRUE(l <= r);
1330 TEST(OptionalTest, LessEq_DifferentType) {
1332 Optional<double> r(2.0);
1334 EXPECT_TRUE(l <= r);
1337 TEST(OptionalTest, Greater_BothEmpty) {
1341 EXPECT_FALSE(l > r);
1344 TEST(OptionalTest, Greater_LeftEmpty) {
1348 EXPECT_FALSE(l > r);
1351 TEST(OptionalTest, Greater_RightEmpty) {
1358 TEST(OptionalTest, Greater_BothValue) {
1363 EXPECT_FALSE(l > r);
1375 EXPECT_FALSE(l > r);
1379 TEST(OptionalTest, Greater_DifferentType) {
1381 Optional<double> r(2.0);
1383 EXPECT_FALSE(l > r);
1386 TEST(OptionalTest, GreaterEq_BothEmpty) {
1390 EXPECT_TRUE(l >= r);
1393 TEST(OptionalTest, GreaterEq_LeftEmpty) {
1397 EXPECT_FALSE(l >= r);
1400 TEST(OptionalTest, GreaterEq_RightEmpty) {
1404 EXPECT_TRUE(l >= r);
1407 TEST(OptionalTest, GreaterEq_BothValue) {
1412 EXPECT_FALSE(l >= r);
1418 EXPECT_TRUE(l >= r);
1424 EXPECT_TRUE(l >= r);
1428 TEST(OptionalTest, GreaterEq_DifferentType) {
1430 Optional<double> r(2.0);
1432 EXPECT_FALSE(l >= r);
1435 TEST(OptionalTest, OptNullEq) {
1438 EXPECT_TRUE(opt == base::nullopt);
1441 Optional<int> opt(1);
1442 EXPECT_FALSE(opt == base::nullopt);
1446 TEST(OptionalTest, NullOptEq) {
1449 EXPECT_TRUE(base::nullopt == opt);
1452 Optional<int> opt(1);
1453 EXPECT_FALSE(base::nullopt == opt);
1457 TEST(OptionalTest, OptNullNotEq) {
1460 EXPECT_FALSE(opt != base::nullopt);
1463 Optional<int> opt(1);
1464 EXPECT_TRUE(opt != base::nullopt);
1468 TEST(OptionalTest, NullOptNotEq) {
1471 EXPECT_FALSE(base::nullopt != opt);
1474 Optional<int> opt(1);
1475 EXPECT_TRUE(base::nullopt != opt);
1479 TEST(OptionalTest, OptNullLower) {
1482 EXPECT_FALSE(opt < base::nullopt);
1485 Optional<int> opt(1);
1486 EXPECT_FALSE(opt < base::nullopt);
1490 TEST(OptionalTest, NullOptLower) {
1493 EXPECT_FALSE(base::nullopt < opt);
1496 Optional<int> opt(1);
1497 EXPECT_TRUE(base::nullopt < opt);
1501 TEST(OptionalTest, OptNullLowerEq) {
1504 EXPECT_TRUE(opt <= base::nullopt);
1507 Optional<int> opt(1);
1508 EXPECT_FALSE(opt <= base::nullopt);
1512 TEST(OptionalTest, NullOptLowerEq) {
1515 EXPECT_TRUE(base::nullopt <= opt);
1518 Optional<int> opt(1);
1519 EXPECT_TRUE(base::nullopt <= opt);
1523 TEST(OptionalTest, OptNullGreater) {
1526 EXPECT_FALSE(opt > base::nullopt);
1529 Optional<int> opt(1);
1530 EXPECT_TRUE(opt > base::nullopt);
1534 TEST(OptionalTest, NullOptGreater) {
1537 EXPECT_FALSE(base::nullopt > opt);
1540 Optional<int> opt(1);
1541 EXPECT_FALSE(base::nullopt > opt);
1545 TEST(OptionalTest, OptNullGreaterEq) {
1548 EXPECT_TRUE(opt >= base::nullopt);
1551 Optional<int> opt(1);
1552 EXPECT_TRUE(opt >= base::nullopt);
1556 TEST(OptionalTest, NullOptGreaterEq) {
1559 EXPECT_TRUE(base::nullopt >= opt);
1562 Optional<int> opt(1);
1563 EXPECT_FALSE(base::nullopt >= opt);
1567 TEST(OptionalTest, ValueEq_Empty) {
1569 EXPECT_FALSE(opt == 1);
1572 TEST(OptionalTest, ValueEq_NotEmpty) {
1574 Optional<int> opt(0);
1575 EXPECT_FALSE(opt == 1);
1578 Optional<int> opt(1);
1579 EXPECT_TRUE(opt == 1);
1583 TEST(OptionalTest, ValueEq_DifferentType) {
1584 Optional<int> opt(0);
1585 EXPECT_TRUE(opt == 0.0);
1588 TEST(OptionalTest, EqValue_Empty) {
1590 EXPECT_FALSE(1 == opt);
1593 TEST(OptionalTest, EqValue_NotEmpty) {
1595 Optional<int> opt(0);
1596 EXPECT_FALSE(1 == opt);
1599 Optional<int> opt(1);
1600 EXPECT_TRUE(1 == opt);
1604 TEST(OptionalTest, EqValue_DifferentType) {
1605 Optional<int> opt(0);
1606 EXPECT_TRUE(0.0 == opt);
1609 TEST(OptionalTest, ValueNotEq_Empty) {
1611 EXPECT_TRUE(opt != 1);
1614 TEST(OptionalTest, ValueNotEq_NotEmpty) {
1616 Optional<int> opt(0);
1617 EXPECT_TRUE(opt != 1);
1620 Optional<int> opt(1);
1621 EXPECT_FALSE(opt != 1);
1625 TEST(OPtionalTest, ValueNotEq_DifferentType) {
1626 Optional<int> opt(0);
1627 EXPECT_FALSE(opt != 0.0);
1630 TEST(OptionalTest, NotEqValue_Empty) {
1632 EXPECT_TRUE(1 != opt);
1635 TEST(OptionalTest, NotEqValue_NotEmpty) {
1637 Optional<int> opt(0);
1638 EXPECT_TRUE(1 != opt);
1641 Optional<int> opt(1);
1642 EXPECT_FALSE(1 != opt);
1646 TEST(OptionalTest, NotEqValue_DifferentType) {
1647 Optional<int> opt(0);
1648 EXPECT_FALSE(0.0 != opt);
1651 TEST(OptionalTest, ValueLess_Empty) {
1653 EXPECT_TRUE(opt < 1);
1656 TEST(OptionalTest, ValueLess_NotEmpty) {
1658 Optional<int> opt(0);
1659 EXPECT_TRUE(opt < 1);
1662 Optional<int> opt(1);
1663 EXPECT_FALSE(opt < 1);
1666 Optional<int> opt(2);
1667 EXPECT_FALSE(opt < 1);
1671 TEST(OPtionalTest, ValueLess_DifferentType) {
1672 Optional<int> opt(0);
1673 EXPECT_TRUE(opt < 1.0);
1676 TEST(OptionalTest, LessValue_Empty) {
1678 EXPECT_FALSE(1 < opt);
1681 TEST(OptionalTest, LessValue_NotEmpty) {
1683 Optional<int> opt(0);
1684 EXPECT_FALSE(1 < opt);
1687 Optional<int> opt(1);
1688 EXPECT_FALSE(1 < opt);
1691 Optional<int> opt(2);
1692 EXPECT_TRUE(1 < opt);
1696 TEST(OptionalTest, LessValue_DifferentType) {
1697 Optional<int> opt(0);
1698 EXPECT_FALSE(0.0 < opt);
1701 TEST(OptionalTest, ValueLessEq_Empty) {
1703 EXPECT_TRUE(opt <= 1);
1706 TEST(OptionalTest, ValueLessEq_NotEmpty) {
1708 Optional<int> opt(0);
1709 EXPECT_TRUE(opt <= 1);
1712 Optional<int> opt(1);
1713 EXPECT_TRUE(opt <= 1);
1716 Optional<int> opt(2);
1717 EXPECT_FALSE(opt <= 1);
1721 TEST(OptionalTest, ValueLessEq_DifferentType) {
1722 Optional<int> opt(0);
1723 EXPECT_TRUE(opt <= 0.0);
1726 TEST(OptionalTest, LessEqValue_Empty) {
1728 EXPECT_FALSE(1 <= opt);
1731 TEST(OptionalTest, LessEqValue_NotEmpty) {
1733 Optional<int> opt(0);
1734 EXPECT_FALSE(1 <= opt);
1737 Optional<int> opt(1);
1738 EXPECT_TRUE(1 <= opt);
1741 Optional<int> opt(2);
1742 EXPECT_TRUE(1 <= opt);
1746 TEST(OptionalTest, LessEqValue_DifferentType) {
1747 Optional<int> opt(0);
1748 EXPECT_TRUE(0.0 <= opt);
1751 TEST(OptionalTest, ValueGreater_Empty) {
1753 EXPECT_FALSE(opt > 1);
1756 TEST(OptionalTest, ValueGreater_NotEmpty) {
1758 Optional<int> opt(0);
1759 EXPECT_FALSE(opt > 1);
1762 Optional<int> opt(1);
1763 EXPECT_FALSE(opt > 1);
1766 Optional<int> opt(2);
1767 EXPECT_TRUE(opt > 1);
1771 TEST(OptionalTest, ValueGreater_DifferentType) {
1772 Optional<int> opt(0);
1773 EXPECT_FALSE(opt > 0.0);
1776 TEST(OptionalTest, GreaterValue_Empty) {
1778 EXPECT_TRUE(1 > opt);
1781 TEST(OptionalTest, GreaterValue_NotEmpty) {
1783 Optional<int> opt(0);
1784 EXPECT_TRUE(1 > opt);
1787 Optional<int> opt(1);
1788 EXPECT_FALSE(1 > opt);
1791 Optional<int> opt(2);
1792 EXPECT_FALSE(1 > opt);
1796 TEST(OptionalTest, GreaterValue_DifferentType) {
1797 Optional<int> opt(0);
1798 EXPECT_FALSE(0.0 > opt);
1801 TEST(OptionalTest, ValueGreaterEq_Empty) {
1803 EXPECT_FALSE(opt >= 1);
1806 TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1808 Optional<int> opt(0);
1809 EXPECT_FALSE(opt >= 1);
1812 Optional<int> opt(1);
1813 EXPECT_TRUE(opt >= 1);
1816 Optional<int> opt(2);
1817 EXPECT_TRUE(opt >= 1);
1821 TEST(OptionalTest, ValueGreaterEq_DifferentType) {
1822 Optional<int> opt(0);
1823 EXPECT_TRUE(opt <= 0.0);
1826 TEST(OptionalTest, GreaterEqValue_Empty) {
1828 EXPECT_TRUE(1 >= opt);
1831 TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1833 Optional<int> opt(0);
1834 EXPECT_TRUE(1 >= opt);
1837 Optional<int> opt(1);
1838 EXPECT_TRUE(1 >= opt);
1841 Optional<int> opt(2);
1842 EXPECT_FALSE(1 >= opt);
1846 TEST(OptionalTest, GreaterEqValue_DifferentType) {
1847 Optional<int> opt(0);
1848 EXPECT_TRUE(0.0 >= opt);
1851 TEST(OptionalTest, NotEquals) {
1853 Optional<float> a(0.1f);
1854 Optional<float> b(0.2f);
1859 Optional<std::string> a("foo");
1860 Optional<std::string> b("bar");
1866 Optional<double> b(2);
1871 Optional<TestObject> a(TestObject(3, 0.1));
1872 Optional<TestObject> b(TestObject(4, 1.0));
1873 EXPECT_TRUE(a != b);
1877 TEST(OptionalTest, NotEqualsNull) {
1879 Optional<float> a(0.1f);
1880 Optional<float> b(0.1f);
1886 Optional<std::string> a("foo");
1887 Optional<std::string> b("foo");
1893 Optional<TestObject> a(TestObject(3, 0.1));
1894 Optional<TestObject> b(TestObject(3, 0.1));
1896 EXPECT_TRUE(a != b);
1900 TEST(OptionalTest, MakeOptional) {
1902 Optional<float> o = make_optional(32.f);
1904 EXPECT_EQ(32.f, *o);
1907 o = make_optional(std::move(value));
1913 Optional<std::string> o = make_optional(std::string("foo"));
1915 EXPECT_EQ("foo", *o);
1917 std::string value = "bar";
1918 o = make_optional(std::move(value));
1920 EXPECT_EQ(std::string("bar"), *o);
1924 Optional<TestObject> o = make_optional(TestObject(3, 0.1));
1926 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1928 TestObject value = TestObject(0, 0.42);
1929 o = make_optional(std::move(value));
1931 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1932 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
1933 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
1935 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1936 base::make_optional(std::move(value))->state());
1941 Test(int a, double b, bool c) : a(a), b(b), c(c) {}
1948 Optional<Test> o = make_optional<Test>(1, 2.0, true);
1951 EXPECT_EQ(2.0, o->b);
1956 auto str1 = make_optional<std::string>({'1', '2', '3'});
1957 EXPECT_EQ("123", *str1);
1960 make_optional<std::string>({'a', 'b', 'c'}, std::allocator<char>());
1961 EXPECT_EQ("abc", *str2);
1965 TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1966 Optional<TestObject> a, b;
1971 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1972 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1975 TEST(OptionalTest, NonMemberSwap_inHasValue) {
1976 Optional<TestObject> a(TestObject(1, 0.3));
1977 Optional<TestObject> b;
1982 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1983 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1986 TEST(OptionalTest, NonMemberSwap_outHasValue) {
1987 Optional<TestObject> a;
1988 Optional<TestObject> b(TestObject(1, 0.3));
1993 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1994 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1997 TEST(OptionalTest, NonMemberSwap_bothValue) {
1998 Optional<TestObject> a(TestObject(0, 0.1));
1999 Optional<TestObject> b(TestObject(1, 0.3));
2004 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2005 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
2006 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
2007 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
2010 TEST(OptionalTest, Hash_OptionalReflectsInternal) {
2012 std::hash<int> int_hash;
2013 std::hash<Optional<int>> opt_int_hash;
2015 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
2019 std::hash<std::string> str_hash;
2020 std::hash<Optional<std::string>> opt_str_hash;
2022 EXPECT_EQ(str_hash(std::string("foobar")),
2023 opt_str_hash(Optional<std::string>(std::string("foobar"))));
2027 TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
2028 std::hash<Optional<int>> opt_int_hash;
2029 std::hash<Optional<std::string>> opt_str_hash;
2031 EXPECT_EQ(opt_str_hash(Optional<std::string>()),
2032 opt_int_hash(Optional<int>()));
2035 TEST(OptionalTest, Hash_UseInSet) {
2036 std::set<Optional<int>> setOptInt;
2038 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2040 setOptInt.insert(Optional<int>(3));
2041 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2042 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
2045 TEST(OptionalTest, HasValue) {
2047 EXPECT_FALSE(a.has_value());
2050 EXPECT_TRUE(a.has_value());
2053 EXPECT_FALSE(a.has_value());
2056 EXPECT_TRUE(a.has_value());
2058 a = Optional<int>();
2059 EXPECT_FALSE(a.has_value());
2062 TEST(OptionalTest, Reset_int) {
2064 EXPECT_TRUE(a.has_value());
2065 EXPECT_EQ(0, a.value());
2068 EXPECT_FALSE(a.has_value());
2069 EXPECT_EQ(-1, a.value_or(-1));
2072 TEST(OptionalTest, Reset_Object) {
2073 Optional<TestObject> a(TestObject(0, 0.1));
2074 EXPECT_TRUE(a.has_value());
2075 EXPECT_EQ(TestObject(0, 0.1), a.value());
2078 EXPECT_FALSE(a.has_value());
2079 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
2082 TEST(OptionalTest, Reset_NoOp) {
2084 EXPECT_FALSE(a.has_value());
2087 EXPECT_FALSE(a.has_value());
2090 TEST(OptionalTest, AssignFromRValue) {
2091 Optional<TestObject> a;
2092 EXPECT_FALSE(a.has_value());
2096 EXPECT_TRUE(a.has_value());
2097 EXPECT_EQ(1, a->move_ctors_count());
2100 TEST(OptionalTest, DontCallDefaultCtor) {
2101 Optional<DeletedDefaultConstructor> a;
2102 EXPECT_FALSE(a.has_value());
2104 a = base::make_optional<DeletedDefaultConstructor>(42);
2105 EXPECT_TRUE(a.has_value());
2106 EXPECT_EQ(42, a->foo());
2109 TEST(OptionalTest, DontCallNewMemberFunction) {
2110 Optional<DeleteNewOperators> a;
2111 EXPECT_FALSE(a.has_value());
2113 a = DeleteNewOperators();
2114 EXPECT_TRUE(a.has_value());
2117 TEST(OptionalTest, Noexcept) {
2118 // Trivial copy ctor, non-trivial move ctor, nothrow move assign.
2120 Test1(const Test1&) = default;
2122 Test1& operator=(Test1&&) = default;
2124 // Non-trivial copy ctor, trivial move ctor, throw move assign.
2126 Test2(const Test2&) {}
2127 Test2(Test2&&) = default;
2128 Test2& operator=(Test2&&) { return *this; }
2130 // Trivial copy ctor, non-trivial nothrow move ctor.
2132 Test3(const Test3&) = default;
2133 Test3(Test3&&) noexcept {}
2135 // Non-trivial copy ctor, non-trivial nothrow move ctor.
2137 Test4(const Test4&) {}
2138 Test4(Test4&&) noexcept {}
2140 // Non-trivial copy ctor, non-trivial move ctor.
2142 Test5(const Test5&) {}
2147 noexcept(Optional<int>(std::declval<Optional<int>>())),
2148 "move constructor for noexcept move-constructible T must be noexcept "
2149 "(trivial copy, trivial move)");
2151 !noexcept(Optional<Test1>(std::declval<Optional<Test1>>())),
2152 "move constructor for non-noexcept move-constructible T must not be "
2153 "noexcept (trivial copy)");
2155 noexcept(Optional<Test2>(std::declval<Optional<Test2>>())),
2156 "move constructor for noexcept move-constructible T must be noexcept "
2157 "(non-trivial copy, trivial move)");
2159 noexcept(Optional<Test3>(std::declval<Optional<Test3>>())),
2160 "move constructor for noexcept move-constructible T must be noexcept "
2161 "(trivial copy, non-trivial move)");
2163 noexcept(Optional<Test4>(std::declval<Optional<Test4>>())),
2164 "move constructor for noexcept move-constructible T must be noexcept "
2165 "(non-trivial copy, non-trivial move)");
2167 !noexcept(Optional<Test5>(std::declval<Optional<Test5>>())),
2168 "move constructor for non-noexcept move-constructible T must not be "
2169 "noexcept (non-trivial copy)");
2172 noexcept(std::declval<Optional<int>>() = std::declval<Optional<int>>()),
2173 "move assign for noexcept move-constructible/move-assignable T "
2174 "must be noexcept");
2176 !noexcept(std::declval<Optional<Test1>>() =
2177 std::declval<Optional<Test1>>()),
2178 "move assign for non-noexcept move-constructible T must not be noexcept");
2180 !noexcept(std::declval<Optional<Test2>>() =
2181 std::declval<Optional<Test2>>()),
2182 "move assign for non-noexcept move-assignable T must not be noexcept");