blob: dbf1ce114a2bf53cf72a8e2c9542e7e18870851e [file] [log] [blame]
mlamouri53f6b252016-04-19 17:27:011// 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.
4
5#include "base/optional.h"
6
jdoerrieb6e6c752018-01-03 09:13:457#include <memory>
mlamouri53f6b252016-04-19 17:27:018#include <set>
jdoerrieb6e6c752018-01-03 09:13:459#include <string>
10#include <vector>
mlamouri53f6b252016-04-19 17:27:0111
Daniel Chengf24c9562019-04-09 20:40:0512#include "base/test/gtest_util.h"
jdoerrieb6e6c752018-01-03 09:13:4513#include "testing/gmock/include/gmock/gmock.h"
mlamouri53f6b252016-04-19 17:27:0114#include "testing/gtest/include/gtest/gtest.h"
15
jdoerrieb6e6c752018-01-03 09:13:4516using ::testing::ElementsAre;
17
mlamouri53f6b252016-04-19 17:27:0118namespace base {
19
20namespace {
21
22// Object used to test complex object with Optional<T> in addition of the move
23// semantics.
24class TestObject {
25 public:
26 enum class State {
27 DEFAULT_CONSTRUCTED,
28 VALUE_CONSTRUCTED,
29 COPY_CONSTRUCTED,
30 MOVE_CONSTRUCTED,
31 MOVED_FROM,
alshabalinf06b07df2016-05-27 08:01:3132 COPY_ASSIGNED,
33 MOVE_ASSIGNED,
34 SWAPPED,
mlamouri53f6b252016-04-19 17:27:0135 };
36
37 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
38
39 TestObject(int foo, double bar)
40 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
41
42 TestObject(const TestObject& other)
Andrey Kraynov976fbbd2017-09-13 17:15:4443 : foo_(other.foo_),
44 bar_(other.bar_),
45 state_(State::COPY_CONSTRUCTED),
46 move_ctors_count_(other.move_ctors_count_) {}
mlamouri53f6b252016-04-19 17:27:0147
48 TestObject(TestObject&& other)
49 : foo_(std::move(other.foo_)),
50 bar_(std::move(other.bar_)),
Andrey Kraynov976fbbd2017-09-13 17:15:4451 state_(State::MOVE_CONSTRUCTED),
52 move_ctors_count_(other.move_ctors_count_ + 1) {
mlamouri53f6b252016-04-19 17:27:0153 other.state_ = State::MOVED_FROM;
54 }
55
56 TestObject& operator=(const TestObject& other) {
57 foo_ = other.foo_;
58 bar_ = other.bar_;
alshabalinf06b07df2016-05-27 08:01:3159 state_ = State::COPY_ASSIGNED;
Andrey Kraynov976fbbd2017-09-13 17:15:4460 move_ctors_count_ = other.move_ctors_count_;
mlamouri53f6b252016-04-19 17:27:0161 return *this;
62 }
63
alshabalinf06b07df2016-05-27 08:01:3164 TestObject& operator=(TestObject&& other) {
65 foo_ = other.foo_;
66 bar_ = other.bar_;
67 state_ = State::MOVE_ASSIGNED;
Andrey Kraynov976fbbd2017-09-13 17:15:4468 move_ctors_count_ = other.move_ctors_count_;
alshabalinf06b07df2016-05-27 08:01:3169 other.state_ = State::MOVED_FROM;
70 return *this;
71 }
72
73 void Swap(TestObject* other) {
74 using std::swap;
75 swap(foo_, other->foo_);
76 swap(bar_, other->bar_);
Andrey Kraynov976fbbd2017-09-13 17:15:4477 swap(move_ctors_count_, other->move_ctors_count_);
alshabalinf06b07df2016-05-27 08:01:3178 state_ = State::SWAPPED;
79 other->state_ = State::SWAPPED;
80 }
81
mlamouri53f6b252016-04-19 17:27:0182 bool operator==(const TestObject& other) const {
Hidehiko Abe7a534c32017-12-20 10:56:2683 return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
mlamouri53f6b252016-04-19 17:27:0184 }
85
Hidehiko Abe7a534c32017-12-20 10:56:2686 bool operator!=(const TestObject& other) const { return !(*this == other); }
87
mlamouri53f6b252016-04-19 17:27:0188 int foo() const { return foo_; }
89 State state() const { return state_; }
Andrey Kraynov976fbbd2017-09-13 17:15:4490 int move_ctors_count() const { return move_ctors_count_; }
mlamouri53f6b252016-04-19 17:27:0191
92 private:
93 int foo_;
94 double bar_;
95 State state_;
Andrey Kraynov976fbbd2017-09-13 17:15:4496 int move_ctors_count_ = 0;
mlamouri53f6b252016-04-19 17:27:0197};
98
alshabalinf06b07df2016-05-27 08:01:3199// Implementing Swappable concept.
100void swap(TestObject& lhs, TestObject& rhs) {
101 lhs.Swap(&rhs);
102}
103
104class NonTriviallyDestructible {
Mounir Lamouri771d3e82019-06-04 00:47:31105 public:
alshabalinf06b07df2016-05-27 08:01:31106 ~NonTriviallyDestructible() {}
107};
108
Mounir Lamouri3f24be82018-01-03 16:39:45109class DeletedDefaultConstructor {
110 public:
111 DeletedDefaultConstructor() = delete;
112 DeletedDefaultConstructor(int foo) : foo_(foo) {}
113
114 int foo() const { return foo_; }
115
116 private:
117 int foo_;
118};
119
Hidehiko Abe5cae9642018-01-26 18:01:11120class DeletedCopy {
Hidehiko Abef1c87892018-01-19 23:50:24121 public:
Hidehiko Abe5cae9642018-01-26 18:01:11122 explicit DeletedCopy(int foo) : foo_(foo) {}
123 DeletedCopy(const DeletedCopy&) = delete;
124 DeletedCopy(DeletedCopy&&) = default;
125
126 DeletedCopy& operator=(const DeletedCopy&) = delete;
127 DeletedCopy& operator=(DeletedCopy&&) = default;
128
129 int foo() const { return foo_; }
130
131 private:
132 int foo_;
133};
134
135class DeletedMove {
136 public:
137 explicit DeletedMove(int foo) : foo_(foo) {}
138 DeletedMove(const DeletedMove&) = default;
139 DeletedMove(DeletedMove&&) = delete;
140
141 DeletedMove& operator=(const DeletedMove&) = default;
142 DeletedMove& operator=(DeletedMove&&) = delete;
Hidehiko Abef1c87892018-01-19 23:50:24143
144 int foo() const { return foo_; }
145
146 private:
147 int foo_;
148};
149
150class NonTriviallyDestructibleDeletedCopyConstructor {
151 public:
152 explicit NonTriviallyDestructibleDeletedCopyConstructor(int foo)
153 : foo_(foo) {}
154 NonTriviallyDestructibleDeletedCopyConstructor(
155 const NonTriviallyDestructibleDeletedCopyConstructor&) = delete;
156 NonTriviallyDestructibleDeletedCopyConstructor(
157 NonTriviallyDestructibleDeletedCopyConstructor&&) = default;
158
159 ~NonTriviallyDestructibleDeletedCopyConstructor() {}
160
161 int foo() const { return foo_; }
162
163 private:
164 int foo_;
165};
166
Mounir Lamouri3f24be82018-01-03 16:39:45167class DeleteNewOperators {
168 public:
169 void* operator new(size_t) = delete;
170 void* operator new(size_t, void*) = delete;
171 void* operator new[](size_t) = delete;
172 void* operator new[](size_t, void*) = delete;
173};
174
mlamouri53f6b252016-04-19 17:27:01175} // anonymous namespace
176
danakj90acaf8292017-04-05 17:59:27177static_assert(std::is_trivially_destructible<Optional<int>>::value,
alshabalinf06b07df2016-05-27 08:01:31178 "OptionalIsTriviallyDestructible");
179
180static_assert(
danakj90acaf8292017-04-05 17:59:27181 !std::is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
alshabalinf06b07df2016-05-27 08:01:31182 "OptionalIsTriviallyDestructible");
183
Hidehiko Abec4aa16b2018-03-07 03:45:37184static_assert(sizeof(Optional<int>) == sizeof(internal::OptionalBase<int>),
185 "internal::{Copy,Move}{Constructible,Assignable} structs "
186 "should be 0-sized");
187
mlamouri53f6b252016-04-19 17:27:01188TEST(OptionalTest, DefaultConstructor) {
189 {
alshabalin9494e4542016-10-25 09:56:41190 constexpr Optional<float> o;
mlamouri53f6b252016-04-19 17:27:01191 EXPECT_FALSE(o);
192 }
193
194 {
195 Optional<std::string> o;
196 EXPECT_FALSE(o);
197 }
198
199 {
200 Optional<TestObject> o;
201 EXPECT_FALSE(o);
202 }
203}
204
205TEST(OptionalTest, CopyConstructor) {
206 {
Hidehiko Abe5134ab382018-01-08 09:38:16207 constexpr Optional<float> first(0.1f);
208 constexpr Optional<float> other(first);
mlamouri53f6b252016-04-19 17:27:01209
210 EXPECT_TRUE(other);
211 EXPECT_EQ(other.value(), 0.1f);
212 EXPECT_EQ(first, other);
213 }
214
215 {
216 Optional<std::string> first("foo");
217 Optional<std::string> other(first);
218
219 EXPECT_TRUE(other);
220 EXPECT_EQ(other.value(), "foo");
221 EXPECT_EQ(first, other);
222 }
223
224 {
Hidehiko Abef1c87892018-01-19 23:50:24225 const Optional<std::string> first("foo");
226 Optional<std::string> other(first);
227
228 EXPECT_TRUE(other);
229 EXPECT_EQ(other.value(), "foo");
230 EXPECT_EQ(first, other);
231 }
232
233 {
mlamouri53f6b252016-04-19 17:27:01234 Optional<TestObject> first(TestObject(3, 0.1));
235 Optional<TestObject> other(first);
236
237 EXPECT_TRUE(!!other);
238 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
239 EXPECT_TRUE(first == other);
240 }
241}
242
243TEST(OptionalTest, ValueConstructor) {
244 {
alshabalin9494e4542016-10-25 09:56:41245 constexpr float value = 0.1f;
246 constexpr Optional<float> o(value);
247
mlamouri53f6b252016-04-19 17:27:01248 EXPECT_TRUE(o);
alshabalin9494e4542016-10-25 09:56:41249 EXPECT_EQ(value, o.value());
mlamouri53f6b252016-04-19 17:27:01250 }
251
252 {
alshabalin9494e4542016-10-25 09:56:41253 std::string value("foo");
254 Optional<std::string> o(value);
255
mlamouri53f6b252016-04-19 17:27:01256 EXPECT_TRUE(o);
alshabalin9494e4542016-10-25 09:56:41257 EXPECT_EQ(value, o.value());
mlamouri53f6b252016-04-19 17:27:01258 }
259
260 {
alshabalin9494e4542016-10-25 09:56:41261 TestObject value(3, 0.1);
262 Optional<TestObject> o(value);
263
264 EXPECT_TRUE(o);
265 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
266 EXPECT_EQ(value, o.value());
mlamouri53f6b252016-04-19 17:27:01267 }
268}
269
270TEST(OptionalTest, MoveConstructor) {
271 {
Hidehiko Abe5134ab382018-01-08 09:38:16272 constexpr Optional<float> first(0.1f);
273 constexpr Optional<float> second(std::move(first));
mlamouri53f6b252016-04-19 17:27:01274
Hidehiko Abef1c87892018-01-19 23:50:24275 EXPECT_TRUE(second.has_value());
mlamouri53f6b252016-04-19 17:27:01276 EXPECT_EQ(second.value(), 0.1f);
277
Hidehiko Abef1c87892018-01-19 23:50:24278 EXPECT_TRUE(first.has_value());
mlamouri53f6b252016-04-19 17:27:01279 }
280
281 {
282 Optional<std::string> first("foo");
283 Optional<std::string> second(std::move(first));
284
Hidehiko Abef1c87892018-01-19 23:50:24285 EXPECT_TRUE(second.has_value());
mlamouri53f6b252016-04-19 17:27:01286 EXPECT_EQ("foo", second.value());
287
Hidehiko Abef1c87892018-01-19 23:50:24288 EXPECT_TRUE(first.has_value());
mlamouri53f6b252016-04-19 17:27:01289 }
290
291 {
292 Optional<TestObject> first(TestObject(3, 0.1));
293 Optional<TestObject> second(std::move(first));
294
Hidehiko Abef1c87892018-01-19 23:50:24295 EXPECT_TRUE(second.has_value());
mlamouri53f6b252016-04-19 17:27:01296 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
297 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
298
Hidehiko Abef1c87892018-01-19 23:50:24299 EXPECT_TRUE(first.has_value());
mlamouri53f6b252016-04-19 17:27:01300 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
301 }
Hidehiko Abef1c87892018-01-19 23:50:24302
303 // Even if copy constructor is deleted, move constructor needs to work.
304 // Note that it couldn't be constexpr.
305 {
Hidehiko Abe5cae9642018-01-26 18:01:11306 Optional<DeletedCopy> first(in_place, 42);
307 Optional<DeletedCopy> second(std::move(first));
308
309 EXPECT_TRUE(second.has_value());
310 EXPECT_EQ(42, second->foo());
311
312 EXPECT_TRUE(first.has_value());
313 }
314
315 {
316 Optional<DeletedMove> first(in_place, 42);
317 Optional<DeletedMove> second(std::move(first));
Hidehiko Abef1c87892018-01-19 23:50:24318
319 EXPECT_TRUE(second.has_value());
320 EXPECT_EQ(42, second->foo());
321
322 EXPECT_TRUE(first.has_value());
323 }
324
325 {
326 Optional<NonTriviallyDestructibleDeletedCopyConstructor> first(in_place,
327 42);
328 Optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
329 std::move(first));
330
331 EXPECT_TRUE(second.has_value());
332 EXPECT_EQ(42, second->foo());
333
334 EXPECT_TRUE(first.has_value());
335 }
mlamouri53f6b252016-04-19 17:27:01336}
337
338TEST(OptionalTest, MoveValueConstructor) {
339 {
Daniel Cheng429dbdc52017-10-04 15:33:56340 constexpr float value = 0.1f;
341 constexpr Optional<float> o(std::move(value));
342
343 EXPECT_TRUE(o);
344 EXPECT_EQ(0.1f, o.value());
345 }
346
347 {
alshabalin9494e4542016-10-25 09:56:41348 float value = 0.1f;
349 Optional<float> o(std::move(value));
mlamouri53f6b252016-04-19 17:27:01350
alshabalin9494e4542016-10-25 09:56:41351 EXPECT_TRUE(o);
352 EXPECT_EQ(0.1f, o.value());
mlamouri53f6b252016-04-19 17:27:01353 }
354
355 {
alshabalin9494e4542016-10-25 09:56:41356 std::string value("foo");
357 Optional<std::string> o(std::move(value));
mlamouri53f6b252016-04-19 17:27:01358
alshabalin9494e4542016-10-25 09:56:41359 EXPECT_TRUE(o);
360 EXPECT_EQ("foo", o.value());
mlamouri53f6b252016-04-19 17:27:01361 }
362
363 {
alshabalin9494e4542016-10-25 09:56:41364 TestObject value(3, 0.1);
365 Optional<TestObject> o(std::move(value));
mlamouri53f6b252016-04-19 17:27:01366
alshabalin9494e4542016-10-25 09:56:41367 EXPECT_TRUE(o);
368 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
369 EXPECT_EQ(TestObject(3, 0.1), o.value());
mlamouri53f6b252016-04-19 17:27:01370 }
371}
372
Hidehiko Abed39417a52018-01-31 03:22:42373TEST(OptionalTest, ConvertingCopyConstructor) {
374 {
375 Optional<int> first(1);
376 Optional<double> second(first);
377 EXPECT_TRUE(second.has_value());
378 EXPECT_EQ(1.0, second.value());
379 }
380
381 // Make sure explicit is not marked for convertible case.
382 {
383 Optional<int> o(1);
384 ignore_result<Optional<double>>(o);
385 }
386}
387
388TEST(OptionalTest, ConvertingMoveConstructor) {
389 {
390 Optional<int> first(1);
391 Optional<double> second(std::move(first));
392 EXPECT_TRUE(second.has_value());
393 EXPECT_EQ(1.0, second.value());
394 }
395
396 // Make sure explicit is not marked for convertible case.
397 {
398 Optional<int> o(1);
399 ignore_result<Optional<double>>(std::move(o));
400 }
401
402 {
403 class Test1 {
404 public:
405 explicit Test1(int foo) : foo_(foo) {}
406
407 int foo() const { return foo_; }
408
409 private:
410 int foo_;
411 };
412
413 // Not copyable but convertible from Test1.
414 class Test2 {
415 public:
416 Test2(const Test2&) = delete;
417 explicit Test2(Test1&& other) : bar_(other.foo()) {}
418
419 double bar() const { return bar_; }
420
421 private:
422 double bar_;
423 };
424
425 Optional<Test1> first(in_place, 42);
426 Optional<Test2> second(std::move(first));
427 EXPECT_TRUE(second.has_value());
428 EXPECT_EQ(42.0, second->bar());
429 }
430}
431
mlamouri53f6b252016-04-19 17:27:01432TEST(OptionalTest, ConstructorForwardArguments) {
433 {
Daniel Cheng429dbdc52017-10-04 15:33:56434 constexpr Optional<float> a(base::in_place, 0.1f);
435 EXPECT_TRUE(a);
436 EXPECT_EQ(0.1f, a.value());
437 }
438
439 {
mlamouri53f6b252016-04-19 17:27:01440 Optional<float> a(base::in_place, 0.1f);
441 EXPECT_TRUE(a);
442 EXPECT_EQ(0.1f, a.value());
443 }
444
445 {
446 Optional<std::string> a(base::in_place, "foo");
447 EXPECT_TRUE(a);
448 EXPECT_EQ("foo", a.value());
449 }
450
451 {
452 Optional<TestObject> a(base::in_place, 0, 0.1);
453 EXPECT_TRUE(!!a);
454 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
455 }
456}
457
jdoerrieb6e6c752018-01-03 09:13:45458TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
459 {
460 Optional<std::vector<int>> opt(in_place, {3, 1});
461 EXPECT_TRUE(opt);
462 EXPECT_THAT(*opt, ElementsAre(3, 1));
463 EXPECT_EQ(2u, opt->size());
464 }
465
466 {
467 Optional<std::vector<int>> opt(in_place, {3, 1}, std::allocator<int>());
468 EXPECT_TRUE(opt);
469 EXPECT_THAT(*opt, ElementsAre(3, 1));
470 EXPECT_EQ(2u, opt->size());
471 }
472}
473
Hidehiko Abe14f92bee2018-02-21 06:01:28474TEST(OptionalTest, ForwardConstructor) {
475 {
476 Optional<double> a(1);
477 EXPECT_TRUE(a.has_value());
478 EXPECT_EQ(1.0, a.value());
479 }
480
481 // Test that default type of 'U' is value_type.
482 {
483 struct TestData {
484 int a;
485 double b;
486 bool c;
487 };
488
489 Optional<TestData> a({1, 2.0, true});
490 EXPECT_TRUE(a.has_value());
491 EXPECT_EQ(1, a->a);
492 EXPECT_EQ(2.0, a->b);
493 EXPECT_TRUE(a->c);
494 }
495
496 // If T has a constructor with a param Optional<U>, and another ctor with a
497 // param U, then T(Optional<U>) should be used for Optional<T>(Optional<U>)
498 // constructor.
499 {
500 enum class ParamType {
501 DEFAULT_CONSTRUCTED,
502 COPY_CONSTRUCTED,
503 MOVE_CONSTRUCTED,
504 INT,
505 IN_PLACE,
506 OPTIONAL_INT,
507 };
508 struct Test {
509 Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
510 Test(const Test& param) : param_type(ParamType::COPY_CONSTRUCTED) {}
511 Test(Test&& param) : param_type(ParamType::MOVE_CONSTRUCTED) {}
512 explicit Test(int param) : param_type(ParamType::INT) {}
513 explicit Test(in_place_t param) : param_type(ParamType::IN_PLACE) {}
514 explicit Test(Optional<int> param)
515 : param_type(ParamType::OPTIONAL_INT) {}
516
517 ParamType param_type;
518 };
519
520 // Overload resolution with copy-conversion constructor.
521 {
522 const Optional<int> arg(in_place, 1);
523 Optional<Test> testee(arg);
524 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
525 }
526
527 // Overload resolution with move conversion constructor.
528 {
529 Optional<Test> testee(Optional<int>(in_place, 1));
530 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
531 }
532
533 // Default constructor should be used.
534 {
535 Optional<Test> testee(in_place);
536 EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
537 }
538 }
539
540 {
541 struct Test {
542 Test(int a) {} // NOLINT(runtime/explicit)
543 };
544 // If T is convertible from U, it is not marked as explicit.
545 static_assert(std::is_convertible<int, Test>::value,
546 "Int should be convertible to Test.");
547 ([](Optional<Test> param) {})(1);
548 }
549}
550
alshabalinf06b07df2016-05-27 08:01:31551TEST(OptionalTest, NulloptConstructor) {
alshabalin9494e4542016-10-25 09:56:41552 constexpr Optional<int> a(base::nullopt);
alshabalinf06b07df2016-05-27 08:01:31553 EXPECT_FALSE(a);
554}
555
mlamouri53f6b252016-04-19 17:27:01556TEST(OptionalTest, AssignValue) {
557 {
558 Optional<float> a;
559 EXPECT_FALSE(a);
560 a = 0.1f;
561 EXPECT_TRUE(a);
562
563 Optional<float> b(0.1f);
564 EXPECT_TRUE(a == b);
565 }
566
567 {
568 Optional<std::string> a;
569 EXPECT_FALSE(a);
570 a = std::string("foo");
571 EXPECT_TRUE(a);
572
573 Optional<std::string> b(std::string("foo"));
574 EXPECT_EQ(a, b);
575 }
576
577 {
578 Optional<TestObject> a;
579 EXPECT_FALSE(!!a);
580 a = TestObject(3, 0.1);
581 EXPECT_TRUE(!!a);
582
583 Optional<TestObject> b(TestObject(3, 0.1));
584 EXPECT_TRUE(a == b);
585 }
alshabalinf06b07df2016-05-27 08:01:31586
587 {
588 Optional<TestObject> a = TestObject(4, 1.0);
589 EXPECT_TRUE(!!a);
590 a = TestObject(3, 0.1);
591 EXPECT_TRUE(!!a);
592
593 Optional<TestObject> b(TestObject(3, 0.1));
594 EXPECT_TRUE(a == b);
595 }
mlamouri53f6b252016-04-19 17:27:01596}
597
598TEST(OptionalTest, AssignObject) {
599 {
600 Optional<float> a;
601 Optional<float> b(0.1f);
602 a = b;
603
604 EXPECT_TRUE(a);
605 EXPECT_EQ(a.value(), 0.1f);
606 EXPECT_EQ(a, b);
607 }
608
609 {
610 Optional<std::string> a;
611 Optional<std::string> b("foo");
612 a = b;
613
614 EXPECT_TRUE(a);
615 EXPECT_EQ(a.value(), "foo");
616 EXPECT_EQ(a, b);
617 }
618
619 {
620 Optional<TestObject> a;
621 Optional<TestObject> b(TestObject(3, 0.1));
622 a = b;
623
624 EXPECT_TRUE(!!a);
625 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
626 EXPECT_TRUE(a == b);
627 }
alshabalinf06b07df2016-05-27 08:01:31628
629 {
630 Optional<TestObject> a(TestObject(4, 1.0));
631 Optional<TestObject> b(TestObject(3, 0.1));
632 a = b;
633
634 EXPECT_TRUE(!!a);
635 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
636 EXPECT_TRUE(a == b);
637 }
Hidehiko Abe5cae9642018-01-26 18:01:11638
639 {
640 Optional<DeletedMove> a(in_place, 42);
641 Optional<DeletedMove> b;
642 b = a;
643
644 EXPECT_TRUE(!!a);
645 EXPECT_TRUE(!!b);
646 EXPECT_EQ(a->foo(), b->foo());
647 }
648
649 {
650 Optional<DeletedMove> a(in_place, 42);
651 Optional<DeletedMove> b(in_place, 1);
652 b = a;
653
654 EXPECT_TRUE(!!a);
655 EXPECT_TRUE(!!b);
656 EXPECT_EQ(a->foo(), b->foo());
657 }
Hidehiko Abe40ee4ae2018-02-23 04:24:12658
659 // Converting assignment.
660 {
661 Optional<int> a(in_place, 1);
662 Optional<double> b;
663 b = a;
664
665 EXPECT_TRUE(!!a);
666 EXPECT_TRUE(!!b);
667 EXPECT_EQ(1, a.value());
668 EXPECT_EQ(1.0, b.value());
669 }
670
671 {
672 Optional<int> a(in_place, 42);
673 Optional<double> b(in_place, 1);
674 b = a;
675
676 EXPECT_TRUE(!!a);
677 EXPECT_TRUE(!!b);
678 EXPECT_EQ(42, a.value());
679 EXPECT_EQ(42.0, b.value());
680 }
681
682 {
683 Optional<int> a;
684 Optional<double> b(in_place, 1);
685 b = a;
686 EXPECT_FALSE(!!a);
687 EXPECT_FALSE(!!b);
688 }
mlamouri53f6b252016-04-19 17:27:01689}
690
691TEST(OptionalTest, AssignObject_rvalue) {
692 {
693 Optional<float> a;
694 Optional<float> b(0.1f);
695 a = std::move(b);
696
697 EXPECT_TRUE(a);
698 EXPECT_TRUE(b);
699 EXPECT_EQ(0.1f, a.value());
700 }
701
702 {
703 Optional<std::string> a;
704 Optional<std::string> b("foo");
705 a = std::move(b);
706
707 EXPECT_TRUE(a);
708 EXPECT_TRUE(b);
709 EXPECT_EQ("foo", a.value());
710 }
711
712 {
713 Optional<TestObject> a;
714 Optional<TestObject> b(TestObject(3, 0.1));
715 a = std::move(b);
716
717 EXPECT_TRUE(!!a);
718 EXPECT_TRUE(!!b);
719 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
720
721 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
722 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
723 }
alshabalinf06b07df2016-05-27 08:01:31724
725 {
726 Optional<TestObject> a(TestObject(4, 1.0));
727 Optional<TestObject> b(TestObject(3, 0.1));
728 a = std::move(b);
729
730 EXPECT_TRUE(!!a);
731 EXPECT_TRUE(!!b);
732 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
733
734 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
735 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
736 }
Hidehiko Abe5cae9642018-01-26 18:01:11737
738 {
739 Optional<DeletedMove> a(in_place, 42);
740 Optional<DeletedMove> b;
741 b = std::move(a);
742
743 EXPECT_TRUE(!!a);
744 EXPECT_TRUE(!!b);
745 EXPECT_EQ(42, b->foo());
746 }
747
748 {
749 Optional<DeletedMove> a(in_place, 42);
750 Optional<DeletedMove> b(in_place, 1);
751 b = std::move(a);
752
753 EXPECT_TRUE(!!a);
754 EXPECT_TRUE(!!b);
755 EXPECT_EQ(42, b->foo());
756 }
Hidehiko Abe40ee4ae2018-02-23 04:24:12757
758 // Converting assignment.
759 {
760 Optional<int> a(in_place, 1);
761 Optional<double> b;
762 b = std::move(a);
763
764 EXPECT_TRUE(!!a);
765 EXPECT_TRUE(!!b);
766 EXPECT_EQ(1.0, b.value());
767 }
768
769 {
770 Optional<int> a(in_place, 42);
771 Optional<double> b(in_place, 1);
772 b = std::move(a);
773
774 EXPECT_TRUE(!!a);
775 EXPECT_TRUE(!!b);
776 EXPECT_EQ(42.0, b.value());
777 }
778
779 {
780 Optional<int> a;
781 Optional<double> b(in_place, 1);
782 b = std::move(a);
783
784 EXPECT_FALSE(!!a);
785 EXPECT_FALSE(!!b);
786 }
mlamouri53f6b252016-04-19 17:27:01787}
788
789TEST(OptionalTest, AssignNull) {
790 {
791 Optional<float> a(0.1f);
792 Optional<float> b(0.2f);
793 a = base::nullopt;
794 b = base::nullopt;
795 EXPECT_EQ(a, b);
796 }
797
798 {
799 Optional<std::string> a("foo");
800 Optional<std::string> b("bar");
801 a = base::nullopt;
802 b = base::nullopt;
803 EXPECT_EQ(a, b);
804 }
805
806 {
807 Optional<TestObject> a(TestObject(3, 0.1));
808 Optional<TestObject> b(TestObject(4, 1.0));
809 a = base::nullopt;
810 b = base::nullopt;
811 EXPECT_TRUE(a == b);
812 }
813}
814
Hidehiko Abe40ee4ae2018-02-23 04:24:12815TEST(OptionalTest, AssignOverload) {
816 struct Test1 {
817 enum class State {
818 CONSTRUCTED,
819 MOVED,
820 };
821 State state = State::CONSTRUCTED;
822 };
823
824 // Here, Optional<Test2> can be assigned from Optioanl<Test1>.
825 // In case of move, marks MOVED to Test1 instance.
826 struct Test2 {
827 enum class State {
828 DEFAULT_CONSTRUCTED,
829 COPY_CONSTRUCTED_FROM_TEST1,
830 MOVE_CONSTRUCTED_FROM_TEST1,
831 COPY_ASSIGNED_FROM_TEST1,
832 MOVE_ASSIGNED_FROM_TEST1,
833 };
834
835 Test2() = default;
836 explicit Test2(const Test1& test1)
837 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
838 explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
839 test1.state = Test1::State::MOVED;
840 }
841 Test2& operator=(const Test1& test1) {
842 state = State::COPY_ASSIGNED_FROM_TEST1;
843 return *this;
844 }
845 Test2& operator=(Test1&& test1) {
846 state = State::MOVE_ASSIGNED_FROM_TEST1;
847 test1.state = Test1::State::MOVED;
848 return *this;
849 }
850
851 State state = State::DEFAULT_CONSTRUCTED;
852 };
853
854 {
855 Optional<Test1> a(in_place);
856 Optional<Test2> b;
857
858 b = a;
859 EXPECT_TRUE(!!a);
860 EXPECT_TRUE(!!b);
861 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
862 EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
863 }
864
865 {
866 Optional<Test1> a(in_place);
867 Optional<Test2> b(in_place);
868
869 b = a;
870 EXPECT_TRUE(!!a);
871 EXPECT_TRUE(!!b);
872 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
873 EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
874 }
875
876 {
877 Optional<Test1> a(in_place);
878 Optional<Test2> b;
879
880 b = std::move(a);
881 EXPECT_TRUE(!!a);
882 EXPECT_TRUE(!!b);
883 EXPECT_EQ(Test1::State::MOVED, a->state);
884 EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
885 }
886
887 {
888 Optional<Test1> a(in_place);
889 Optional<Test2> b(in_place);
890
891 b = std::move(a);
892 EXPECT_TRUE(!!a);
893 EXPECT_TRUE(!!b);
894 EXPECT_EQ(Test1::State::MOVED, a->state);
895 EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
896 }
897
898 // Similar to Test2, but Test3 also has copy/move ctor and assign operators
899 // from Optional<Test1>, too. In this case, for a = b where a is
900 // Optional<Test3> and b is Optional<Test1>,
901 // Optional<T>::operator=(U&&) where U is Optional<Test1> should be used
902 // rather than Optional<T>::operator=(Optional<U>&&) where U is Test1.
903 struct Test3 {
904 enum class State {
905 DEFAULT_CONSTRUCTED,
906 COPY_CONSTRUCTED_FROM_TEST1,
907 MOVE_CONSTRUCTED_FROM_TEST1,
908 COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
909 MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
910 COPY_ASSIGNED_FROM_TEST1,
911 MOVE_ASSIGNED_FROM_TEST1,
912 COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
913 MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
914 };
915
916 Test3() = default;
917 explicit Test3(const Test1& test1)
918 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
919 explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
920 test1.state = Test1::State::MOVED;
921 }
922 explicit Test3(const Optional<Test1>& test1)
923 : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
924 explicit Test3(Optional<Test1>&& test1)
925 : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
926 // In the following senarios, given |test1| should always have value.
927 DCHECK(test1.has_value());
928 test1->state = Test1::State::MOVED;
929 }
930 Test3& operator=(const Test1& test1) {
931 state = State::COPY_ASSIGNED_FROM_TEST1;
932 return *this;
933 }
934 Test3& operator=(Test1&& test1) {
935 state = State::MOVE_ASSIGNED_FROM_TEST1;
936 test1.state = Test1::State::MOVED;
937 return *this;
938 }
939 Test3& operator=(const Optional<Test1>& test1) {
940 state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
941 return *this;
942 }
943 Test3& operator=(Optional<Test1>&& test1) {
944 state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
945 // In the following senarios, given |test1| should always have value.
946 DCHECK(test1.has_value());
947 test1->state = Test1::State::MOVED;
948 return *this;
949 }
950
951 State state = State::DEFAULT_CONSTRUCTED;
952 };
953
954 {
955 Optional<Test1> a(in_place);
956 Optional<Test3> b;
957
958 b = a;
959 EXPECT_TRUE(!!a);
960 EXPECT_TRUE(!!b);
961 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
962 EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
963 }
964
965 {
966 Optional<Test1> a(in_place);
967 Optional<Test3> b(in_place);
968
969 b = a;
970 EXPECT_TRUE(!!a);
971 EXPECT_TRUE(!!b);
972 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
973 EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
974 }
975
976 {
977 Optional<Test1> a(in_place);
978 Optional<Test3> b;
979
980 b = std::move(a);
981 EXPECT_TRUE(!!a);
982 EXPECT_TRUE(!!b);
983 EXPECT_EQ(Test1::State::MOVED, a->state);
984 EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
985 }
986
987 {
988 Optional<Test1> a(in_place);
989 Optional<Test3> b(in_place);
990
991 b = std::move(a);
992 EXPECT_TRUE(!!a);
993 EXPECT_TRUE(!!b);
994 EXPECT_EQ(Test1::State::MOVED, a->state);
995 EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
996 }
997}
998
mlamouri53f6b252016-04-19 17:27:01999TEST(OptionalTest, OperatorStar) {
1000 {
1001 Optional<float> a(0.1f);
1002 EXPECT_EQ(a.value(), *a);
1003 }
1004
1005 {
1006 Optional<std::string> a("foo");
1007 EXPECT_EQ(a.value(), *a);
1008 }
1009
1010 {
1011 Optional<TestObject> a(TestObject(3, 0.1));
1012 EXPECT_EQ(a.value(), *a);
1013 }
1014}
1015
1016TEST(OptionalTest, OperatorStar_rvalue) {
1017 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
1018 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
1019 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
1020}
1021
1022TEST(OptionalTest, OperatorArrow) {
1023 Optional<TestObject> a(TestObject(3, 0.1));
1024 EXPECT_EQ(a->foo(), 3);
1025}
1026
1027TEST(OptionalTest, Value_rvalue) {
1028 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
1029 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
1030 EXPECT_TRUE(TestObject(3, 0.1) ==
1031 Optional<TestObject>(TestObject(3, 0.1)).value());
1032}
1033
1034TEST(OptionalTest, ValueOr) {
1035 {
1036 Optional<float> a;
1037 EXPECT_EQ(0.0f, a.value_or(0.0f));
1038
1039 a = 0.1f;
1040 EXPECT_EQ(0.1f, a.value_or(0.0f));
1041
1042 a = base::nullopt;
1043 EXPECT_EQ(0.0f, a.value_or(0.0f));
1044 }
1045
Hidehiko Abeb467afe2018-02-23 07:01:301046 // value_or() can be constexpr.
1047 {
1048 constexpr Optional<int> a(in_place, 1);
1049 constexpr int value = a.value_or(10);
1050 EXPECT_EQ(1, value);
1051 }
1052 {
1053 constexpr Optional<int> a;
1054 constexpr int value = a.value_or(10);
1055 EXPECT_EQ(10, value);
1056 }
1057
mlamouri53f6b252016-04-19 17:27:011058 {
1059 Optional<std::string> a;
1060 EXPECT_EQ("bar", a.value_or("bar"));
1061
1062 a = std::string("foo");
1063 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
1064
1065 a = base::nullopt;
1066 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
1067 }
1068
1069 {
1070 Optional<TestObject> a;
1071 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1072
1073 a = TestObject(3, 0.1);
1074 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
1075
1076 a = base::nullopt;
1077 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1078 }
1079}
1080
1081TEST(OptionalTest, Swap_bothNoValue) {
1082 Optional<TestObject> a, b;
1083 a.swap(b);
1084
1085 EXPECT_FALSE(a);
1086 EXPECT_FALSE(b);
1087 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1088 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1089}
1090
1091TEST(OptionalTest, Swap_inHasValue) {
1092 Optional<TestObject> a(TestObject(1, 0.3));
1093 Optional<TestObject> b;
1094 a.swap(b);
1095
1096 EXPECT_FALSE(a);
1097
1098 EXPECT_TRUE(!!b);
1099 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1100 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1101}
1102
1103TEST(OptionalTest, Swap_outHasValue) {
1104 Optional<TestObject> a;
1105 Optional<TestObject> b(TestObject(1, 0.3));
1106 a.swap(b);
1107
1108 EXPECT_TRUE(!!a);
1109 EXPECT_FALSE(!!b);
1110 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1111 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1112}
1113
1114TEST(OptionalTest, Swap_bothValue) {
1115 Optional<TestObject> a(TestObject(0, 0.1));
1116 Optional<TestObject> b(TestObject(1, 0.3));
1117 a.swap(b);
1118
1119 EXPECT_TRUE(!!a);
1120 EXPECT_TRUE(!!b);
1121 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1122 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
alshabalinf06b07df2016-05-27 08:01:311123 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1124 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
mlamouri53f6b252016-04-19 17:27:011125}
1126
1127TEST(OptionalTest, Emplace) {
1128 {
1129 Optional<float> a(0.1f);
Hidehiko Abeb467afe2018-02-23 07:01:301130 EXPECT_EQ(0.3f, a.emplace(0.3f));
mlamouri53f6b252016-04-19 17:27:011131
1132 EXPECT_TRUE(a);
1133 EXPECT_EQ(0.3f, a.value());
1134 }
1135
1136 {
1137 Optional<std::string> a("foo");
Hidehiko Abeb467afe2018-02-23 07:01:301138 EXPECT_EQ("bar", a.emplace("bar"));
mlamouri53f6b252016-04-19 17:27:011139
1140 EXPECT_TRUE(a);
1141 EXPECT_EQ("bar", a.value());
1142 }
1143
1144 {
1145 Optional<TestObject> a(TestObject(0, 0.1));
Hidehiko Abeb467afe2018-02-23 07:01:301146 EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
mlamouri53f6b252016-04-19 17:27:011147
1148 EXPECT_TRUE(!!a);
1149 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
1150 }
jdoerrieb6e6c752018-01-03 09:13:451151
1152 {
1153 Optional<std::vector<int>> a;
1154 auto& ref = a.emplace({2, 3});
1155 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1156 EXPECT_TRUE(a);
1157 EXPECT_THAT(*a, ElementsAre(2, 3));
1158 EXPECT_EQ(&ref, &*a);
1159 }
1160
1161 {
1162 Optional<std::vector<int>> a;
1163 auto& ref = a.emplace({4, 5}, std::allocator<int>());
1164 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1165 EXPECT_TRUE(a);
1166 EXPECT_THAT(*a, ElementsAre(4, 5));
1167 EXPECT_EQ(&ref, &*a);
1168 }
mlamouri53f6b252016-04-19 17:27:011169}
1170
1171TEST(OptionalTest, Equals_TwoEmpty) {
1172 Optional<int> a;
1173 Optional<int> b;
1174
1175 EXPECT_TRUE(a == b);
1176}
1177
1178TEST(OptionalTest, Equals_TwoEquals) {
1179 Optional<int> a(1);
1180 Optional<int> b(1);
1181
1182 EXPECT_TRUE(a == b);
1183}
1184
1185TEST(OptionalTest, Equals_OneEmpty) {
1186 Optional<int> a;
1187 Optional<int> b(1);
1188
1189 EXPECT_FALSE(a == b);
1190}
1191
1192TEST(OptionalTest, Equals_TwoDifferent) {
1193 Optional<int> a(0);
1194 Optional<int> b(1);
1195
1196 EXPECT_FALSE(a == b);
1197}
1198
Hidehiko Abe7a534c32017-12-20 10:56:261199TEST(OptionalTest, Equals_DifferentType) {
1200 Optional<int> a(0);
1201 Optional<double> b(0);
1202
1203 EXPECT_TRUE(a == b);
1204}
1205
mlamouri53f6b252016-04-19 17:27:011206TEST(OptionalTest, NotEquals_TwoEmpty) {
1207 Optional<int> a;
1208 Optional<int> b;
1209
1210 EXPECT_FALSE(a != b);
1211}
1212
1213TEST(OptionalTest, NotEquals_TwoEquals) {
1214 Optional<int> a(1);
1215 Optional<int> b(1);
1216
1217 EXPECT_FALSE(a != b);
1218}
1219
1220TEST(OptionalTest, NotEquals_OneEmpty) {
1221 Optional<int> a;
1222 Optional<int> b(1);
1223
1224 EXPECT_TRUE(a != b);
1225}
1226
1227TEST(OptionalTest, NotEquals_TwoDifferent) {
1228 Optional<int> a(0);
1229 Optional<int> b(1);
1230
1231 EXPECT_TRUE(a != b);
1232}
1233
Hidehiko Abe7a534c32017-12-20 10:56:261234TEST(OptionalTest, NotEquals_DifferentType) {
1235 Optional<int> a(0);
1236 Optional<double> b(0.0);
1237
1238 EXPECT_FALSE(a != b);
1239}
1240
mlamouri53f6b252016-04-19 17:27:011241TEST(OptionalTest, Less_LeftEmpty) {
1242 Optional<int> l;
1243 Optional<int> r(1);
1244
1245 EXPECT_TRUE(l < r);
1246}
1247
1248TEST(OptionalTest, Less_RightEmpty) {
1249 Optional<int> l(1);
1250 Optional<int> r;
1251
1252 EXPECT_FALSE(l < r);
1253}
1254
1255TEST(OptionalTest, Less_BothEmpty) {
1256 Optional<int> l;
1257 Optional<int> r;
1258
1259 EXPECT_FALSE(l < r);
1260}
1261
1262TEST(OptionalTest, Less_BothValues) {
1263 {
1264 Optional<int> l(1);
1265 Optional<int> r(2);
1266
1267 EXPECT_TRUE(l < r);
1268 }
1269 {
1270 Optional<int> l(2);
1271 Optional<int> r(1);
1272
1273 EXPECT_FALSE(l < r);
1274 }
1275 {
1276 Optional<int> l(1);
1277 Optional<int> r(1);
1278
1279 EXPECT_FALSE(l < r);
1280 }
1281}
1282
Hidehiko Abe7a534c32017-12-20 10:56:261283TEST(OptionalTest, Less_DifferentType) {
1284 Optional<int> l(1);
1285 Optional<double> r(2.0);
1286
1287 EXPECT_TRUE(l < r);
1288}
1289
mlamouri53f6b252016-04-19 17:27:011290TEST(OptionalTest, LessEq_LeftEmpty) {
1291 Optional<int> l;
1292 Optional<int> r(1);
1293
1294 EXPECT_TRUE(l <= r);
1295}
1296
1297TEST(OptionalTest, LessEq_RightEmpty) {
1298 Optional<int> l(1);
1299 Optional<int> r;
1300
1301 EXPECT_FALSE(l <= r);
1302}
1303
1304TEST(OptionalTest, LessEq_BothEmpty) {
1305 Optional<int> l;
1306 Optional<int> r;
1307
1308 EXPECT_TRUE(l <= r);
1309}
1310
1311TEST(OptionalTest, LessEq_BothValues) {
1312 {
1313 Optional<int> l(1);
1314 Optional<int> r(2);
1315
1316 EXPECT_TRUE(l <= r);
1317 }
1318 {
1319 Optional<int> l(2);
1320 Optional<int> r(1);
1321
1322 EXPECT_FALSE(l <= r);
1323 }
1324 {
1325 Optional<int> l(1);
1326 Optional<int> r(1);
1327
1328 EXPECT_TRUE(l <= r);
1329 }
1330}
1331
Hidehiko Abe7a534c32017-12-20 10:56:261332TEST(OptionalTest, LessEq_DifferentType) {
1333 Optional<int> l(1);
1334 Optional<double> r(2.0);
1335
1336 EXPECT_TRUE(l <= r);
1337}
1338
mlamouri53f6b252016-04-19 17:27:011339TEST(OptionalTest, Greater_BothEmpty) {
1340 Optional<int> l;
1341 Optional<int> r;
1342
1343 EXPECT_FALSE(l > r);
1344}
1345
1346TEST(OptionalTest, Greater_LeftEmpty) {
1347 Optional<int> l;
1348 Optional<int> r(1);
1349
1350 EXPECT_FALSE(l > r);
1351}
1352
1353TEST(OptionalTest, Greater_RightEmpty) {
1354 Optional<int> l(1);
1355 Optional<int> r;
1356
1357 EXPECT_TRUE(l > r);
1358}
1359
1360TEST(OptionalTest, Greater_BothValue) {
1361 {
1362 Optional<int> l(1);
1363 Optional<int> r(2);
1364
1365 EXPECT_FALSE(l > r);
1366 }
1367 {
1368 Optional<int> l(2);
1369 Optional<int> r(1);
1370
1371 EXPECT_TRUE(l > r);
1372 }
1373 {
1374 Optional<int> l(1);
1375 Optional<int> r(1);
1376
1377 EXPECT_FALSE(l > r);
1378 }
1379}
1380
Hidehiko Abe7a534c32017-12-20 10:56:261381TEST(OptionalTest, Greater_DifferentType) {
1382 Optional<int> l(1);
1383 Optional<double> r(2.0);
1384
1385 EXPECT_FALSE(l > r);
1386}
1387
mlamouri53f6b252016-04-19 17:27:011388TEST(OptionalTest, GreaterEq_BothEmpty) {
1389 Optional<int> l;
1390 Optional<int> r;
1391
1392 EXPECT_TRUE(l >= r);
1393}
1394
1395TEST(OptionalTest, GreaterEq_LeftEmpty) {
1396 Optional<int> l;
1397 Optional<int> r(1);
1398
1399 EXPECT_FALSE(l >= r);
1400}
1401
1402TEST(OptionalTest, GreaterEq_RightEmpty) {
1403 Optional<int> l(1);
1404 Optional<int> r;
1405
1406 EXPECT_TRUE(l >= r);
1407}
1408
1409TEST(OptionalTest, GreaterEq_BothValue) {
1410 {
1411 Optional<int> l(1);
1412 Optional<int> r(2);
1413
1414 EXPECT_FALSE(l >= r);
1415 }
1416 {
1417 Optional<int> l(2);
1418 Optional<int> r(1);
1419
1420 EXPECT_TRUE(l >= r);
1421 }
1422 {
1423 Optional<int> l(1);
1424 Optional<int> r(1);
1425
1426 EXPECT_TRUE(l >= r);
1427 }
1428}
1429
Hidehiko Abe7a534c32017-12-20 10:56:261430TEST(OptionalTest, GreaterEq_DifferentType) {
1431 Optional<int> l(1);
1432 Optional<double> r(2.0);
1433
1434 EXPECT_FALSE(l >= r);
1435}
1436
mlamouri53f6b252016-04-19 17:27:011437TEST(OptionalTest, OptNullEq) {
1438 {
1439 Optional<int> opt;
1440 EXPECT_TRUE(opt == base::nullopt);
1441 }
1442 {
1443 Optional<int> opt(1);
1444 EXPECT_FALSE(opt == base::nullopt);
1445 }
1446}
1447
1448TEST(OptionalTest, NullOptEq) {
1449 {
1450 Optional<int> opt;
1451 EXPECT_TRUE(base::nullopt == opt);
1452 }
1453 {
1454 Optional<int> opt(1);
1455 EXPECT_FALSE(base::nullopt == opt);
1456 }
1457}
1458
1459TEST(OptionalTest, OptNullNotEq) {
1460 {
1461 Optional<int> opt;
1462 EXPECT_FALSE(opt != base::nullopt);
1463 }
1464 {
1465 Optional<int> opt(1);
1466 EXPECT_TRUE(opt != base::nullopt);
1467 }
1468}
1469
1470TEST(OptionalTest, NullOptNotEq) {
1471 {
1472 Optional<int> opt;
1473 EXPECT_FALSE(base::nullopt != opt);
1474 }
1475 {
1476 Optional<int> opt(1);
1477 EXPECT_TRUE(base::nullopt != opt);
1478 }
1479}
1480
1481TEST(OptionalTest, OptNullLower) {
1482 {
1483 Optional<int> opt;
1484 EXPECT_FALSE(opt < base::nullopt);
1485 }
1486 {
1487 Optional<int> opt(1);
1488 EXPECT_FALSE(opt < base::nullopt);
1489 }
1490}
1491
1492TEST(OptionalTest, NullOptLower) {
1493 {
1494 Optional<int> opt;
1495 EXPECT_FALSE(base::nullopt < opt);
1496 }
1497 {
1498 Optional<int> opt(1);
1499 EXPECT_TRUE(base::nullopt < opt);
1500 }
1501}
1502
1503TEST(OptionalTest, OptNullLowerEq) {
1504 {
1505 Optional<int> opt;
1506 EXPECT_TRUE(opt <= base::nullopt);
1507 }
1508 {
1509 Optional<int> opt(1);
1510 EXPECT_FALSE(opt <= base::nullopt);
1511 }
1512}
1513
1514TEST(OptionalTest, NullOptLowerEq) {
1515 {
1516 Optional<int> opt;
1517 EXPECT_TRUE(base::nullopt <= opt);
1518 }
1519 {
1520 Optional<int> opt(1);
1521 EXPECT_TRUE(base::nullopt <= opt);
1522 }
1523}
1524
1525TEST(OptionalTest, OptNullGreater) {
1526 {
1527 Optional<int> opt;
1528 EXPECT_FALSE(opt > base::nullopt);
1529 }
1530 {
1531 Optional<int> opt(1);
1532 EXPECT_TRUE(opt > base::nullopt);
1533 }
1534}
1535
1536TEST(OptionalTest, NullOptGreater) {
1537 {
1538 Optional<int> opt;
1539 EXPECT_FALSE(base::nullopt > opt);
1540 }
1541 {
1542 Optional<int> opt(1);
1543 EXPECT_FALSE(base::nullopt > opt);
1544 }
1545}
1546
1547TEST(OptionalTest, OptNullGreaterEq) {
1548 {
1549 Optional<int> opt;
1550 EXPECT_TRUE(opt >= base::nullopt);
1551 }
1552 {
1553 Optional<int> opt(1);
1554 EXPECT_TRUE(opt >= base::nullopt);
1555 }
1556}
1557
1558TEST(OptionalTest, NullOptGreaterEq) {
1559 {
1560 Optional<int> opt;
1561 EXPECT_TRUE(base::nullopt >= opt);
1562 }
1563 {
1564 Optional<int> opt(1);
1565 EXPECT_FALSE(base::nullopt >= opt);
1566 }
1567}
1568
1569TEST(OptionalTest, ValueEq_Empty) {
1570 Optional<int> opt;
1571 EXPECT_FALSE(opt == 1);
1572}
1573
1574TEST(OptionalTest, ValueEq_NotEmpty) {
1575 {
1576 Optional<int> opt(0);
1577 EXPECT_FALSE(opt == 1);
1578 }
1579 {
1580 Optional<int> opt(1);
1581 EXPECT_TRUE(opt == 1);
1582 }
1583}
1584
Hidehiko Abe7a534c32017-12-20 10:56:261585TEST(OptionalTest, ValueEq_DifferentType) {
1586 Optional<int> opt(0);
1587 EXPECT_TRUE(opt == 0.0);
1588}
1589
mlamouri53f6b252016-04-19 17:27:011590TEST(OptionalTest, EqValue_Empty) {
1591 Optional<int> opt;
1592 EXPECT_FALSE(1 == opt);
1593}
1594
1595TEST(OptionalTest, EqValue_NotEmpty) {
1596 {
1597 Optional<int> opt(0);
1598 EXPECT_FALSE(1 == opt);
1599 }
1600 {
1601 Optional<int> opt(1);
1602 EXPECT_TRUE(1 == opt);
1603 }
1604}
1605
Hidehiko Abe7a534c32017-12-20 10:56:261606TEST(OptionalTest, EqValue_DifferentType) {
1607 Optional<int> opt(0);
1608 EXPECT_TRUE(0.0 == opt);
1609}
1610
mlamouri53f6b252016-04-19 17:27:011611TEST(OptionalTest, ValueNotEq_Empty) {
1612 Optional<int> opt;
1613 EXPECT_TRUE(opt != 1);
1614}
1615
1616TEST(OptionalTest, ValueNotEq_NotEmpty) {
1617 {
1618 Optional<int> opt(0);
1619 EXPECT_TRUE(opt != 1);
1620 }
1621 {
1622 Optional<int> opt(1);
1623 EXPECT_FALSE(opt != 1);
1624 }
1625}
1626
Hidehiko Abe7a534c32017-12-20 10:56:261627TEST(OPtionalTest, ValueNotEq_DifferentType) {
1628 Optional<int> opt(0);
1629 EXPECT_FALSE(opt != 0.0);
1630}
1631
mlamouri53f6b252016-04-19 17:27:011632TEST(OptionalTest, NotEqValue_Empty) {
1633 Optional<int> opt;
1634 EXPECT_TRUE(1 != opt);
1635}
1636
1637TEST(OptionalTest, NotEqValue_NotEmpty) {
1638 {
1639 Optional<int> opt(0);
1640 EXPECT_TRUE(1 != opt);
1641 }
1642 {
1643 Optional<int> opt(1);
1644 EXPECT_FALSE(1 != opt);
1645 }
1646}
1647
Hidehiko Abe7a534c32017-12-20 10:56:261648TEST(OptionalTest, NotEqValue_DifferentType) {
1649 Optional<int> opt(0);
1650 EXPECT_FALSE(0.0 != opt);
1651}
1652
mlamouri53f6b252016-04-19 17:27:011653TEST(OptionalTest, ValueLess_Empty) {
1654 Optional<int> opt;
1655 EXPECT_TRUE(opt < 1);
1656}
1657
1658TEST(OptionalTest, ValueLess_NotEmpty) {
1659 {
1660 Optional<int> opt(0);
1661 EXPECT_TRUE(opt < 1);
1662 }
1663 {
1664 Optional<int> opt(1);
1665 EXPECT_FALSE(opt < 1);
1666 }
1667 {
1668 Optional<int> opt(2);
1669 EXPECT_FALSE(opt < 1);
1670 }
1671}
1672
Hidehiko Abe7a534c32017-12-20 10:56:261673TEST(OPtionalTest, ValueLess_DifferentType) {
1674 Optional<int> opt(0);
1675 EXPECT_TRUE(opt < 1.0);
1676}
1677
mlamouri53f6b252016-04-19 17:27:011678TEST(OptionalTest, LessValue_Empty) {
1679 Optional<int> opt;
1680 EXPECT_FALSE(1 < opt);
1681}
1682
1683TEST(OptionalTest, LessValue_NotEmpty) {
1684 {
1685 Optional<int> opt(0);
1686 EXPECT_FALSE(1 < opt);
1687 }
1688 {
1689 Optional<int> opt(1);
1690 EXPECT_FALSE(1 < opt);
1691 }
1692 {
1693 Optional<int> opt(2);
1694 EXPECT_TRUE(1 < opt);
1695 }
1696}
1697
Hidehiko Abe7a534c32017-12-20 10:56:261698TEST(OptionalTest, LessValue_DifferentType) {
1699 Optional<int> opt(0);
1700 EXPECT_FALSE(0.0 < opt);
1701}
1702
mlamouri53f6b252016-04-19 17:27:011703TEST(OptionalTest, ValueLessEq_Empty) {
1704 Optional<int> opt;
1705 EXPECT_TRUE(opt <= 1);
1706}
1707
1708TEST(OptionalTest, ValueLessEq_NotEmpty) {
1709 {
1710 Optional<int> opt(0);
1711 EXPECT_TRUE(opt <= 1);
1712 }
1713 {
1714 Optional<int> opt(1);
1715 EXPECT_TRUE(opt <= 1);
1716 }
1717 {
1718 Optional<int> opt(2);
1719 EXPECT_FALSE(opt <= 1);
1720 }
1721}
1722
Hidehiko Abe7a534c32017-12-20 10:56:261723TEST(OptionalTest, ValueLessEq_DifferentType) {
1724 Optional<int> opt(0);
1725 EXPECT_TRUE(opt <= 0.0);
1726}
1727
mlamouri53f6b252016-04-19 17:27:011728TEST(OptionalTest, LessEqValue_Empty) {
1729 Optional<int> opt;
1730 EXPECT_FALSE(1 <= opt);
1731}
1732
1733TEST(OptionalTest, LessEqValue_NotEmpty) {
1734 {
1735 Optional<int> opt(0);
1736 EXPECT_FALSE(1 <= opt);
1737 }
1738 {
1739 Optional<int> opt(1);
1740 EXPECT_TRUE(1 <= opt);
1741 }
1742 {
1743 Optional<int> opt(2);
1744 EXPECT_TRUE(1 <= opt);
1745 }
1746}
1747
Hidehiko Abe7a534c32017-12-20 10:56:261748TEST(OptionalTest, LessEqValue_DifferentType) {
1749 Optional<int> opt(0);
1750 EXPECT_TRUE(0.0 <= opt);
1751}
1752
mlamouri53f6b252016-04-19 17:27:011753TEST(OptionalTest, ValueGreater_Empty) {
1754 Optional<int> opt;
1755 EXPECT_FALSE(opt > 1);
1756}
1757
1758TEST(OptionalTest, ValueGreater_NotEmpty) {
1759 {
1760 Optional<int> opt(0);
1761 EXPECT_FALSE(opt > 1);
1762 }
1763 {
1764 Optional<int> opt(1);
1765 EXPECT_FALSE(opt > 1);
1766 }
1767 {
1768 Optional<int> opt(2);
1769 EXPECT_TRUE(opt > 1);
1770 }
1771}
1772
Hidehiko Abe7a534c32017-12-20 10:56:261773TEST(OptionalTest, ValueGreater_DifferentType) {
1774 Optional<int> opt(0);
1775 EXPECT_FALSE(opt > 0.0);
1776}
1777
mlamouri53f6b252016-04-19 17:27:011778TEST(OptionalTest, GreaterValue_Empty) {
1779 Optional<int> opt;
1780 EXPECT_TRUE(1 > opt);
1781}
1782
1783TEST(OptionalTest, GreaterValue_NotEmpty) {
1784 {
1785 Optional<int> opt(0);
1786 EXPECT_TRUE(1 > opt);
1787 }
1788 {
1789 Optional<int> opt(1);
1790 EXPECT_FALSE(1 > opt);
1791 }
1792 {
1793 Optional<int> opt(2);
1794 EXPECT_FALSE(1 > opt);
1795 }
1796}
1797
Hidehiko Abe7a534c32017-12-20 10:56:261798TEST(OptionalTest, GreaterValue_DifferentType) {
1799 Optional<int> opt(0);
1800 EXPECT_FALSE(0.0 > opt);
1801}
1802
mlamouri53f6b252016-04-19 17:27:011803TEST(OptionalTest, ValueGreaterEq_Empty) {
1804 Optional<int> opt;
1805 EXPECT_FALSE(opt >= 1);
1806}
1807
1808TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1809 {
1810 Optional<int> opt(0);
1811 EXPECT_FALSE(opt >= 1);
1812 }
1813 {
1814 Optional<int> opt(1);
1815 EXPECT_TRUE(opt >= 1);
1816 }
1817 {
1818 Optional<int> opt(2);
1819 EXPECT_TRUE(opt >= 1);
1820 }
1821}
1822
Hidehiko Abe7a534c32017-12-20 10:56:261823TEST(OptionalTest, ValueGreaterEq_DifferentType) {
1824 Optional<int> opt(0);
1825 EXPECT_TRUE(opt <= 0.0);
1826}
1827
mlamouri53f6b252016-04-19 17:27:011828TEST(OptionalTest, GreaterEqValue_Empty) {
1829 Optional<int> opt;
1830 EXPECT_TRUE(1 >= opt);
1831}
1832
1833TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1834 {
1835 Optional<int> opt(0);
1836 EXPECT_TRUE(1 >= opt);
1837 }
1838 {
1839 Optional<int> opt(1);
1840 EXPECT_TRUE(1 >= opt);
1841 }
1842 {
1843 Optional<int> opt(2);
1844 EXPECT_FALSE(1 >= opt);
1845 }
1846}
1847
Hidehiko Abe7a534c32017-12-20 10:56:261848TEST(OptionalTest, GreaterEqValue_DifferentType) {
1849 Optional<int> opt(0);
1850 EXPECT_TRUE(0.0 >= opt);
1851}
1852
mlamouri53f6b252016-04-19 17:27:011853TEST(OptionalTest, NotEquals) {
1854 {
1855 Optional<float> a(0.1f);
1856 Optional<float> b(0.2f);
1857 EXPECT_NE(a, b);
1858 }
1859
1860 {
1861 Optional<std::string> a("foo");
1862 Optional<std::string> b("bar");
1863 EXPECT_NE(a, b);
1864 }
1865
1866 {
Hidehiko Abe7a534c32017-12-20 10:56:261867 Optional<int> a(1);
1868 Optional<double> b(2);
1869 EXPECT_NE(a, b);
1870 }
1871
1872 {
mlamouri53f6b252016-04-19 17:27:011873 Optional<TestObject> a(TestObject(3, 0.1));
1874 Optional<TestObject> b(TestObject(4, 1.0));
1875 EXPECT_TRUE(a != b);
1876 }
1877}
1878
1879TEST(OptionalTest, NotEqualsNull) {
1880 {
1881 Optional<float> a(0.1f);
1882 Optional<float> b(0.1f);
1883 b = base::nullopt;
1884 EXPECT_NE(a, b);
1885 }
1886
1887 {
1888 Optional<std::string> a("foo");
1889 Optional<std::string> b("foo");
1890 b = base::nullopt;
1891 EXPECT_NE(a, b);
1892 }
1893
1894 {
1895 Optional<TestObject> a(TestObject(3, 0.1));
1896 Optional<TestObject> b(TestObject(3, 0.1));
1897 b = base::nullopt;
1898 EXPECT_TRUE(a != b);
1899 }
1900}
1901
1902TEST(OptionalTest, MakeOptional) {
1903 {
tzikd2e73f112018-10-17 12:38:461904 // Use qualified base::make_optional here and elsewhere to avoid the name
1905 // confliction to std::make_optional.
1906 // The name conflict happens only for types in std namespace, such as
1907 // std::string. The other qualified base::make_optional usages are just for
1908 // consistency.
1909 Optional<float> o = base::make_optional(32.f);
mlamouri53f6b252016-04-19 17:27:011910 EXPECT_TRUE(o);
1911 EXPECT_EQ(32.f, *o);
1912
1913 float value = 3.f;
tzikd2e73f112018-10-17 12:38:461914 o = base::make_optional(std::move(value));
mlamouri53f6b252016-04-19 17:27:011915 EXPECT_TRUE(o);
1916 EXPECT_EQ(3.f, *o);
1917 }
1918
1919 {
tzikd2e73f112018-10-17 12:38:461920 Optional<std::string> o = base::make_optional(std::string("foo"));
mlamouri53f6b252016-04-19 17:27:011921 EXPECT_TRUE(o);
1922 EXPECT_EQ("foo", *o);
1923
1924 std::string value = "bar";
tzikd2e73f112018-10-17 12:38:461925 o = base::make_optional(std::move(value));
mlamouri53f6b252016-04-19 17:27:011926 EXPECT_TRUE(o);
1927 EXPECT_EQ(std::string("bar"), *o);
1928 }
1929
1930 {
tzikd2e73f112018-10-17 12:38:461931 Optional<TestObject> o = base::make_optional(TestObject(3, 0.1));
mlamouri53f6b252016-04-19 17:27:011932 EXPECT_TRUE(!!o);
1933 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1934
1935 TestObject value = TestObject(0, 0.42);
tzikd2e73f112018-10-17 12:38:461936 o = base::make_optional(std::move(value));
mlamouri53f6b252016-04-19 17:27:011937 EXPECT_TRUE(!!o);
1938 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1939 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
alshabalinf06b07df2016-05-27 08:01:311940 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
mlamouri53f6b252016-04-19 17:27:011941
1942 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1943 base::make_optional(std::move(value))->state());
1944 }
jdoerrieb6e6c752018-01-03 09:13:451945
1946 {
Hidehiko Abeb467afe2018-02-23 07:01:301947 struct Test {
1948 Test(int a, double b, bool c) : a(a), b(b), c(c) {}
1949
1950 int a;
1951 double b;
1952 bool c;
1953 };
1954
tzikd2e73f112018-10-17 12:38:461955 Optional<Test> o = base::make_optional<Test>(1, 2.0, true);
Hidehiko Abeb467afe2018-02-23 07:01:301956 EXPECT_TRUE(!!o);
1957 EXPECT_EQ(1, o->a);
1958 EXPECT_EQ(2.0, o->b);
1959 EXPECT_TRUE(o->c);
1960 }
1961
1962 {
tzikd2e73f112018-10-17 12:38:461963 auto str1 = base::make_optional<std::string>({'1', '2', '3'});
jdoerrieb6e6c752018-01-03 09:13:451964 EXPECT_EQ("123", *str1);
1965
tzikd2e73f112018-10-17 12:38:461966 auto str2 = base::make_optional<std::string>({'a', 'b', 'c'},
1967 std::allocator<char>());
jdoerrieb6e6c752018-01-03 09:13:451968 EXPECT_EQ("abc", *str2);
1969 }
mlamouri53f6b252016-04-19 17:27:011970}
1971
1972TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1973 Optional<TestObject> a, b;
1974 base::swap(a, b);
1975
1976 EXPECT_FALSE(!!a);
1977 EXPECT_FALSE(!!b);
1978 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1979 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1980}
1981
1982TEST(OptionalTest, NonMemberSwap_inHasValue) {
1983 Optional<TestObject> a(TestObject(1, 0.3));
1984 Optional<TestObject> b;
1985 base::swap(a, b);
1986
1987 EXPECT_FALSE(!!a);
1988 EXPECT_TRUE(!!b);
1989 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1990 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1991}
1992
1993TEST(OptionalTest, NonMemberSwap_outHasValue) {
1994 Optional<TestObject> a;
1995 Optional<TestObject> b(TestObject(1, 0.3));
1996 base::swap(a, b);
1997
1998 EXPECT_TRUE(!!a);
1999 EXPECT_FALSE(!!b);
2000 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2001 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
2002}
2003
2004TEST(OptionalTest, NonMemberSwap_bothValue) {
2005 Optional<TestObject> a(TestObject(0, 0.1));
2006 Optional<TestObject> b(TestObject(1, 0.3));
2007 base::swap(a, b);
2008
2009 EXPECT_TRUE(!!a);
2010 EXPECT_TRUE(!!b);
2011 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2012 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
alshabalinf06b07df2016-05-27 08:01:312013 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
2014 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
mlamouri53f6b252016-04-19 17:27:012015}
2016
2017TEST(OptionalTest, Hash_OptionalReflectsInternal) {
2018 {
2019 std::hash<int> int_hash;
2020 std::hash<Optional<int>> opt_int_hash;
2021
2022 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
2023 }
2024
2025 {
2026 std::hash<std::string> str_hash;
2027 std::hash<Optional<std::string>> opt_str_hash;
2028
2029 EXPECT_EQ(str_hash(std::string("foobar")),
2030 opt_str_hash(Optional<std::string>(std::string("foobar"))));
2031 }
2032}
2033
2034TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
2035 std::hash<Optional<int>> opt_int_hash;
2036 std::hash<Optional<std::string>> opt_str_hash;
2037
2038 EXPECT_EQ(opt_str_hash(Optional<std::string>()),
2039 opt_int_hash(Optional<int>()));
2040}
2041
2042TEST(OptionalTest, Hash_UseInSet) {
2043 std::set<Optional<int>> setOptInt;
2044
2045 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2046
2047 setOptInt.insert(Optional<int>(3));
2048 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2049 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
2050}
2051
mlamouri26204572016-08-10 12:24:152052TEST(OptionalTest, HasValue) {
2053 Optional<int> a;
2054 EXPECT_FALSE(a.has_value());
2055
2056 a = 42;
2057 EXPECT_TRUE(a.has_value());
2058
2059 a = nullopt;
2060 EXPECT_FALSE(a.has_value());
2061
2062 a = 0;
2063 EXPECT_TRUE(a.has_value());
2064
2065 a = Optional<int>();
2066 EXPECT_FALSE(a.has_value());
2067}
2068
2069TEST(OptionalTest, Reset_int) {
2070 Optional<int> a(0);
2071 EXPECT_TRUE(a.has_value());
2072 EXPECT_EQ(0, a.value());
2073
2074 a.reset();
2075 EXPECT_FALSE(a.has_value());
2076 EXPECT_EQ(-1, a.value_or(-1));
2077}
2078
2079TEST(OptionalTest, Reset_Object) {
2080 Optional<TestObject> a(TestObject(0, 0.1));
2081 EXPECT_TRUE(a.has_value());
2082 EXPECT_EQ(TestObject(0, 0.1), a.value());
2083
2084 a.reset();
2085 EXPECT_FALSE(a.has_value());
2086 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
2087}
2088
2089TEST(OptionalTest, Reset_NoOp) {
2090 Optional<int> a;
2091 EXPECT_FALSE(a.has_value());
2092
2093 a.reset();
2094 EXPECT_FALSE(a.has_value());
2095}
2096
Andrey Kraynov976fbbd2017-09-13 17:15:442097TEST(OptionalTest, AssignFromRValue) {
2098 Optional<TestObject> a;
2099 EXPECT_FALSE(a.has_value());
2100
2101 TestObject obj;
2102 a = std::move(obj);
2103 EXPECT_TRUE(a.has_value());
2104 EXPECT_EQ(1, a->move_ctors_count());
2105}
2106
Mounir Lamouri3f24be82018-01-03 16:39:452107TEST(OptionalTest, DontCallDefaultCtor) {
2108 Optional<DeletedDefaultConstructor> a;
2109 EXPECT_FALSE(a.has_value());
2110
2111 a = base::make_optional<DeletedDefaultConstructor>(42);
2112 EXPECT_TRUE(a.has_value());
2113 EXPECT_EQ(42, a->foo());
2114}
2115
2116TEST(OptionalTest, DontCallNewMemberFunction) {
2117 Optional<DeleteNewOperators> a;
2118 EXPECT_FALSE(a.has_value());
2119
2120 a = DeleteNewOperators();
2121 EXPECT_TRUE(a.has_value());
2122}
2123
Daniel Chengf24c9562019-04-09 20:40:052124TEST(OptionalTest, DereferencingNoValueCrashes) {
2125 class C {
2126 public:
2127 void Method() const {}
2128 };
2129
2130 {
2131 const Optional<C> const_optional;
2132 EXPECT_CHECK_DEATH(const_optional.value());
2133 EXPECT_CHECK_DEATH(const_optional->Method());
2134 EXPECT_CHECK_DEATH(*const_optional);
2135 EXPECT_CHECK_DEATH(*std::move(const_optional));
2136 }
2137
2138 {
2139 Optional<C> non_const_optional;
2140 EXPECT_CHECK_DEATH(non_const_optional.value());
2141 EXPECT_CHECK_DEATH(non_const_optional->Method());
2142 EXPECT_CHECK_DEATH(*non_const_optional);
2143 EXPECT_CHECK_DEATH(*std::move(non_const_optional));
2144 }
2145}
2146
Hidehiko Abe3aa61df2018-02-24 12:47:072147TEST(OptionalTest, Noexcept) {
Fyodor Gayokho65eb2ba2018-03-22 18:09:212148 // Trivial copy ctor, non-trivial move ctor, nothrow move assign.
Hidehiko Abe3aa61df2018-02-24 12:47:072149 struct Test1 {
Fyodor Gayokho65eb2ba2018-03-22 18:09:212150 Test1(const Test1&) = default;
Hidehiko Abe3aa61df2018-02-24 12:47:072151 Test1(Test1&&) {}
2152 Test1& operator=(Test1&&) = default;
2153 };
Fyodor Gayokho65eb2ba2018-03-22 18:09:212154 // Non-trivial copy ctor, trivial move ctor, throw move assign.
Hidehiko Abe3aa61df2018-02-24 12:47:072155 struct Test2 {
Fyodor Gayokho65eb2ba2018-03-22 18:09:212156 Test2(const Test2&) {}
Hidehiko Abe3aa61df2018-02-24 12:47:072157 Test2(Test2&&) = default;
2158 Test2& operator=(Test2&&) { return *this; }
2159 };
Fyodor Gayokho65eb2ba2018-03-22 18:09:212160 // Trivial copy ctor, non-trivial nothrow move ctor.
2161 struct Test3 {
2162 Test3(const Test3&) = default;
2163 Test3(Test3&&) noexcept {}
2164 };
2165 // Non-trivial copy ctor, non-trivial nothrow move ctor.
2166 struct Test4 {
2167 Test4(const Test4&) {}
2168 Test4(Test4&&) noexcept {}
2169 };
2170 // Non-trivial copy ctor, non-trivial move ctor.
2171 struct Test5 {
2172 Test5(const Test5&) {}
2173 Test5(Test5&&) {}
2174 };
Hidehiko Abe3aa61df2018-02-24 12:47:072175
2176 static_assert(
2177 noexcept(Optional<int>(std::declval<Optional<int>>())),
Fyodor Gayokho65eb2ba2018-03-22 18:09:212178 "move constructor for noexcept move-constructible T must be noexcept "
2179 "(trivial copy, trivial move)");
Hidehiko Abe3aa61df2018-02-24 12:47:072180 static_assert(
2181 !noexcept(Optional<Test1>(std::declval<Optional<Test1>>())),
2182 "move constructor for non-noexcept move-constructible T must not be "
Fyodor Gayokho65eb2ba2018-03-22 18:09:212183 "noexcept (trivial copy)");
Hidehiko Abe3aa61df2018-02-24 12:47:072184 static_assert(
2185 noexcept(Optional<Test2>(std::declval<Optional<Test2>>())),
Fyodor Gayokho65eb2ba2018-03-22 18:09:212186 "move constructor for noexcept move-constructible T must be noexcept "
2187 "(non-trivial copy, trivial move)");
2188 static_assert(
2189 noexcept(Optional<Test3>(std::declval<Optional<Test3>>())),
2190 "move constructor for noexcept move-constructible T must be noexcept "
2191 "(trivial copy, non-trivial move)");
2192 static_assert(
2193 noexcept(Optional<Test4>(std::declval<Optional<Test4>>())),
2194 "move constructor for noexcept move-constructible T must be noexcept "
2195 "(non-trivial copy, non-trivial move)");
2196 static_assert(
2197 !noexcept(Optional<Test5>(std::declval<Optional<Test5>>())),
2198 "move constructor for non-noexcept move-constructible T must not be "
2199 "noexcept (non-trivial copy)");
Hidehiko Abe3aa61df2018-02-24 12:47:072200
2201 static_assert(
2202 noexcept(std::declval<Optional<int>>() = std::declval<Optional<int>>()),
2203 "move assign for noexcept move-constructible/move-assignable T "
2204 "must be noexcept");
2205 static_assert(
2206 !noexcept(std::declval<Optional<Test1>>() =
2207 std::declval<Optional<Test1>>()),
2208 "move assign for non-noexcept move-constructible T must not be noexcept");
2209 static_assert(
2210 !noexcept(std::declval<Optional<Test2>>() =
2211 std::declval<Optional<Test2>>()),
2212 "move assign for non-noexcept move-assignable T must not be noexcept");
2213}
2214
mlamouri53f6b252016-04-19 17:27:012215} // namespace base