blob: d33ef62d2d7c82350b5c208ad57fa39fbf9036eb [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
jdoerrieb6e6c752018-01-03 09:13:4512#include "testing/gmock/include/gmock/gmock.h"
mlamouri53f6b252016-04-19 17:27:0113#include "testing/gtest/include/gtest/gtest.h"
14
jdoerrieb6e6c752018-01-03 09:13:4515using ::testing::ElementsAre;
16
mlamouri53f6b252016-04-19 17:27:0117namespace base {
18
19namespace {
20
21// Object used to test complex object with Optional<T> in addition of the move
22// semantics.
23class TestObject {
24 public:
25 enum class State {
26 DEFAULT_CONSTRUCTED,
27 VALUE_CONSTRUCTED,
28 COPY_CONSTRUCTED,
29 MOVE_CONSTRUCTED,
30 MOVED_FROM,
alshabalinf06b07df2016-05-27 08:01:3131 COPY_ASSIGNED,
32 MOVE_ASSIGNED,
33 SWAPPED,
mlamouri53f6b252016-04-19 17:27:0134 };
35
36 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
37
38 TestObject(int foo, double bar)
39 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
40
41 TestObject(const TestObject& other)
Andrey Kraynov976fbbd2017-09-13 17:15:4442 : foo_(other.foo_),
43 bar_(other.bar_),
44 state_(State::COPY_CONSTRUCTED),
45 move_ctors_count_(other.move_ctors_count_) {}
mlamouri53f6b252016-04-19 17:27:0146
47 TestObject(TestObject&& other)
48 : foo_(std::move(other.foo_)),
49 bar_(std::move(other.bar_)),
Andrey Kraynov976fbbd2017-09-13 17:15:4450 state_(State::MOVE_CONSTRUCTED),
51 move_ctors_count_(other.move_ctors_count_ + 1) {
mlamouri53f6b252016-04-19 17:27:0152 other.state_ = State::MOVED_FROM;
53 }
54
55 TestObject& operator=(const TestObject& other) {
56 foo_ = other.foo_;
57 bar_ = other.bar_;
alshabalinf06b07df2016-05-27 08:01:3158 state_ = State::COPY_ASSIGNED;
Andrey Kraynov976fbbd2017-09-13 17:15:4459 move_ctors_count_ = other.move_ctors_count_;
mlamouri53f6b252016-04-19 17:27:0160 return *this;
61 }
62
alshabalinf06b07df2016-05-27 08:01:3163 TestObject& operator=(TestObject&& other) {
64 foo_ = other.foo_;
65 bar_ = other.bar_;
66 state_ = State::MOVE_ASSIGNED;
Andrey Kraynov976fbbd2017-09-13 17:15:4467 move_ctors_count_ = other.move_ctors_count_;
alshabalinf06b07df2016-05-27 08:01:3168 other.state_ = State::MOVED_FROM;
69 return *this;
70 }
71
72 void Swap(TestObject* other) {
73 using std::swap;
74 swap(foo_, other->foo_);
75 swap(bar_, other->bar_);
Andrey Kraynov976fbbd2017-09-13 17:15:4476 swap(move_ctors_count_, other->move_ctors_count_);
alshabalinf06b07df2016-05-27 08:01:3177 state_ = State::SWAPPED;
78 other->state_ = State::SWAPPED;
79 }
80
mlamouri53f6b252016-04-19 17:27:0181 bool operator==(const TestObject& other) const {
Hidehiko Abe7a534c32017-12-20 10:56:2682 return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
mlamouri53f6b252016-04-19 17:27:0183 }
84
Hidehiko Abe7a534c32017-12-20 10:56:2685 bool operator!=(const TestObject& other) const { return !(*this == other); }
86
mlamouri53f6b252016-04-19 17:27:0187 int foo() const { return foo_; }
88 State state() const { return state_; }
Andrey Kraynov976fbbd2017-09-13 17:15:4489 int move_ctors_count() const { return move_ctors_count_; }
mlamouri53f6b252016-04-19 17:27:0190
91 private:
92 int foo_;
93 double bar_;
94 State state_;
Andrey Kraynov976fbbd2017-09-13 17:15:4495 int move_ctors_count_ = 0;
mlamouri53f6b252016-04-19 17:27:0196};
97
alshabalinf06b07df2016-05-27 08:01:3198// Implementing Swappable concept.
99void swap(TestObject& lhs, TestObject& rhs) {
100 lhs.Swap(&rhs);
101}
102
103class NonTriviallyDestructible {
104 ~NonTriviallyDestructible() {}
105};
106
Mounir Lamouri3f24be82018-01-03 16:39:45107class DeletedDefaultConstructor {
108 public:
109 DeletedDefaultConstructor() = delete;
110 DeletedDefaultConstructor(int foo) : foo_(foo) {}
111
112 int foo() const { return foo_; }
113
114 private:
115 int foo_;
116};
117
Hidehiko Abe5cae9642018-01-26 18:01:11118class DeletedCopy {
Hidehiko Abef1c87892018-01-19 23:50:24119 public:
Hidehiko Abe5cae9642018-01-26 18:01:11120 explicit DeletedCopy(int foo) : foo_(foo) {}
121 DeletedCopy(const DeletedCopy&) = delete;
122 DeletedCopy(DeletedCopy&&) = default;
123
124 DeletedCopy& operator=(const DeletedCopy&) = delete;
125 DeletedCopy& operator=(DeletedCopy&&) = default;
126
127 int foo() const { return foo_; }
128
129 private:
130 int foo_;
131};
132
133class DeletedMove {
134 public:
135 explicit DeletedMove(int foo) : foo_(foo) {}
136 DeletedMove(const DeletedMove&) = default;
137 DeletedMove(DeletedMove&&) = delete;
138
139 DeletedMove& operator=(const DeletedMove&) = default;
140 DeletedMove& operator=(DeletedMove&&) = delete;
Hidehiko Abef1c87892018-01-19 23:50:24141
142 int foo() const { return foo_; }
143
144 private:
145 int foo_;
146};
147
148class NonTriviallyDestructibleDeletedCopyConstructor {
149 public:
150 explicit NonTriviallyDestructibleDeletedCopyConstructor(int foo)
151 : foo_(foo) {}
152 NonTriviallyDestructibleDeletedCopyConstructor(
153 const NonTriviallyDestructibleDeletedCopyConstructor&) = delete;
154 NonTriviallyDestructibleDeletedCopyConstructor(
155 NonTriviallyDestructibleDeletedCopyConstructor&&) = default;
156
157 ~NonTriviallyDestructibleDeletedCopyConstructor() {}
158
159 int foo() const { return foo_; }
160
161 private:
162 int foo_;
163};
164
Mounir Lamouri3f24be82018-01-03 16:39:45165class DeleteNewOperators {
166 public:
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;
171};
172
mlamouri53f6b252016-04-19 17:27:01173} // anonymous namespace
174
danakj90acaf8292017-04-05 17:59:27175static_assert(std::is_trivially_destructible<Optional<int>>::value,
alshabalinf06b07df2016-05-27 08:01:31176 "OptionalIsTriviallyDestructible");
177
178static_assert(
danakj90acaf8292017-04-05 17:59:27179 !std::is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
alshabalinf06b07df2016-05-27 08:01:31180 "OptionalIsTriviallyDestructible");
181
mlamouri53f6b252016-04-19 17:27:01182TEST(OptionalTest, DefaultConstructor) {
183 {
alshabalin9494e4542016-10-25 09:56:41184 constexpr Optional<float> o;
mlamouri53f6b252016-04-19 17:27:01185 EXPECT_FALSE(o);
186 }
187
188 {
189 Optional<std::string> o;
190 EXPECT_FALSE(o);
191 }
192
193 {
194 Optional<TestObject> o;
195 EXPECT_FALSE(o);
196 }
197}
198
199TEST(OptionalTest, CopyConstructor) {
200 {
Hidehiko Abe5134ab382018-01-08 09:38:16201 constexpr Optional<float> first(0.1f);
202 constexpr Optional<float> other(first);
mlamouri53f6b252016-04-19 17:27:01203
204 EXPECT_TRUE(other);
205 EXPECT_EQ(other.value(), 0.1f);
206 EXPECT_EQ(first, other);
207 }
208
209 {
210 Optional<std::string> first("foo");
211 Optional<std::string> other(first);
212
213 EXPECT_TRUE(other);
214 EXPECT_EQ(other.value(), "foo");
215 EXPECT_EQ(first, other);
216 }
217
218 {
Hidehiko Abef1c87892018-01-19 23:50:24219 const Optional<std::string> first("foo");
220 Optional<std::string> other(first);
221
222 EXPECT_TRUE(other);
223 EXPECT_EQ(other.value(), "foo");
224 EXPECT_EQ(first, other);
225 }
226
227 {
mlamouri53f6b252016-04-19 17:27:01228 Optional<TestObject> first(TestObject(3, 0.1));
229 Optional<TestObject> other(first);
230
231 EXPECT_TRUE(!!other);
232 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
233 EXPECT_TRUE(first == other);
234 }
235}
236
237TEST(OptionalTest, ValueConstructor) {
238 {
alshabalin9494e4542016-10-25 09:56:41239 constexpr float value = 0.1f;
240 constexpr Optional<float> o(value);
241
mlamouri53f6b252016-04-19 17:27:01242 EXPECT_TRUE(o);
alshabalin9494e4542016-10-25 09:56:41243 EXPECT_EQ(value, o.value());
mlamouri53f6b252016-04-19 17:27:01244 }
245
246 {
alshabalin9494e4542016-10-25 09:56:41247 std::string value("foo");
248 Optional<std::string> o(value);
249
mlamouri53f6b252016-04-19 17:27:01250 EXPECT_TRUE(o);
alshabalin9494e4542016-10-25 09:56:41251 EXPECT_EQ(value, o.value());
mlamouri53f6b252016-04-19 17:27:01252 }
253
254 {
alshabalin9494e4542016-10-25 09:56:41255 TestObject value(3, 0.1);
256 Optional<TestObject> o(value);
257
258 EXPECT_TRUE(o);
259 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
260 EXPECT_EQ(value, o.value());
mlamouri53f6b252016-04-19 17:27:01261 }
262}
263
264TEST(OptionalTest, MoveConstructor) {
265 {
Hidehiko Abe5134ab382018-01-08 09:38:16266 constexpr Optional<float> first(0.1f);
267 constexpr Optional<float> second(std::move(first));
mlamouri53f6b252016-04-19 17:27:01268
Hidehiko Abef1c87892018-01-19 23:50:24269 EXPECT_TRUE(second.has_value());
mlamouri53f6b252016-04-19 17:27:01270 EXPECT_EQ(second.value(), 0.1f);
271
Hidehiko Abef1c87892018-01-19 23:50:24272 EXPECT_TRUE(first.has_value());
mlamouri53f6b252016-04-19 17:27:01273 }
274
275 {
276 Optional<std::string> first("foo");
277 Optional<std::string> second(std::move(first));
278
Hidehiko Abef1c87892018-01-19 23:50:24279 EXPECT_TRUE(second.has_value());
mlamouri53f6b252016-04-19 17:27:01280 EXPECT_EQ("foo", second.value());
281
Hidehiko Abef1c87892018-01-19 23:50:24282 EXPECT_TRUE(first.has_value());
mlamouri53f6b252016-04-19 17:27:01283 }
284
285 {
286 Optional<TestObject> first(TestObject(3, 0.1));
287 Optional<TestObject> second(std::move(first));
288
Hidehiko Abef1c87892018-01-19 23:50:24289 EXPECT_TRUE(second.has_value());
mlamouri53f6b252016-04-19 17:27:01290 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
291 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
292
Hidehiko Abef1c87892018-01-19 23:50:24293 EXPECT_TRUE(first.has_value());
mlamouri53f6b252016-04-19 17:27:01294 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
295 }
Hidehiko Abef1c87892018-01-19 23:50:24296
297 // Even if copy constructor is deleted, move constructor needs to work.
298 // Note that it couldn't be constexpr.
299 {
Hidehiko Abe5cae9642018-01-26 18:01:11300 Optional<DeletedCopy> first(in_place, 42);
301 Optional<DeletedCopy> second(std::move(first));
302
303 EXPECT_TRUE(second.has_value());
304 EXPECT_EQ(42, second->foo());
305
306 EXPECT_TRUE(first.has_value());
307 }
308
309 {
310 Optional<DeletedMove> first(in_place, 42);
311 Optional<DeletedMove> second(std::move(first));
Hidehiko Abef1c87892018-01-19 23:50:24312
313 EXPECT_TRUE(second.has_value());
314 EXPECT_EQ(42, second->foo());
315
316 EXPECT_TRUE(first.has_value());
317 }
318
319 {
320 Optional<NonTriviallyDestructibleDeletedCopyConstructor> first(in_place,
321 42);
322 Optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
323 std::move(first));
324
325 EXPECT_TRUE(second.has_value());
326 EXPECT_EQ(42, second->foo());
327
328 EXPECT_TRUE(first.has_value());
329 }
mlamouri53f6b252016-04-19 17:27:01330}
331
332TEST(OptionalTest, MoveValueConstructor) {
333 {
Daniel Cheng429dbdc52017-10-04 15:33:56334 constexpr float value = 0.1f;
335 constexpr Optional<float> o(std::move(value));
336
337 EXPECT_TRUE(o);
338 EXPECT_EQ(0.1f, o.value());
339 }
340
341 {
alshabalin9494e4542016-10-25 09:56:41342 float value = 0.1f;
343 Optional<float> o(std::move(value));
mlamouri53f6b252016-04-19 17:27:01344
alshabalin9494e4542016-10-25 09:56:41345 EXPECT_TRUE(o);
346 EXPECT_EQ(0.1f, o.value());
mlamouri53f6b252016-04-19 17:27:01347 }
348
349 {
alshabalin9494e4542016-10-25 09:56:41350 std::string value("foo");
351 Optional<std::string> o(std::move(value));
mlamouri53f6b252016-04-19 17:27:01352
alshabalin9494e4542016-10-25 09:56:41353 EXPECT_TRUE(o);
354 EXPECT_EQ("foo", o.value());
mlamouri53f6b252016-04-19 17:27:01355 }
356
357 {
alshabalin9494e4542016-10-25 09:56:41358 TestObject value(3, 0.1);
359 Optional<TestObject> o(std::move(value));
mlamouri53f6b252016-04-19 17:27:01360
alshabalin9494e4542016-10-25 09:56:41361 EXPECT_TRUE(o);
362 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
363 EXPECT_EQ(TestObject(3, 0.1), o.value());
mlamouri53f6b252016-04-19 17:27:01364 }
365}
366
Hidehiko Abed39417a52018-01-31 03:22:42367TEST(OptionalTest, ConvertingCopyConstructor) {
368 {
369 Optional<int> first(1);
370 Optional<double> second(first);
371 EXPECT_TRUE(second.has_value());
372 EXPECT_EQ(1.0, second.value());
373 }
374
375 // Make sure explicit is not marked for convertible case.
376 {
377 Optional<int> o(1);
378 ignore_result<Optional<double>>(o);
379 }
380}
381
382TEST(OptionalTest, ConvertingMoveConstructor) {
383 {
384 Optional<int> first(1);
385 Optional<double> second(std::move(first));
386 EXPECT_TRUE(second.has_value());
387 EXPECT_EQ(1.0, second.value());
388 }
389
390 // Make sure explicit is not marked for convertible case.
391 {
392 Optional<int> o(1);
393 ignore_result<Optional<double>>(std::move(o));
394 }
395
396 {
397 class Test1 {
398 public:
399 explicit Test1(int foo) : foo_(foo) {}
400
401 int foo() const { return foo_; }
402
403 private:
404 int foo_;
405 };
406
407 // Not copyable but convertible from Test1.
408 class Test2 {
409 public:
410 Test2(const Test2&) = delete;
411 explicit Test2(Test1&& other) : bar_(other.foo()) {}
412
413 double bar() const { return bar_; }
414
415 private:
416 double bar_;
417 };
418
419 Optional<Test1> first(in_place, 42);
420 Optional<Test2> second(std::move(first));
421 EXPECT_TRUE(second.has_value());
422 EXPECT_EQ(42.0, second->bar());
423 }
424}
425
mlamouri53f6b252016-04-19 17:27:01426TEST(OptionalTest, ConstructorForwardArguments) {
427 {
Daniel Cheng429dbdc52017-10-04 15:33:56428 constexpr Optional<float> a(base::in_place, 0.1f);
429 EXPECT_TRUE(a);
430 EXPECT_EQ(0.1f, a.value());
431 }
432
433 {
mlamouri53f6b252016-04-19 17:27:01434 Optional<float> a(base::in_place, 0.1f);
435 EXPECT_TRUE(a);
436 EXPECT_EQ(0.1f, a.value());
437 }
438
439 {
440 Optional<std::string> a(base::in_place, "foo");
441 EXPECT_TRUE(a);
442 EXPECT_EQ("foo", a.value());
443 }
444
445 {
446 Optional<TestObject> a(base::in_place, 0, 0.1);
447 EXPECT_TRUE(!!a);
448 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
449 }
450}
451
jdoerrieb6e6c752018-01-03 09:13:45452TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
453 {
454 Optional<std::vector<int>> opt(in_place, {3, 1});
455 EXPECT_TRUE(opt);
456 EXPECT_THAT(*opt, ElementsAre(3, 1));
457 EXPECT_EQ(2u, opt->size());
458 }
459
460 {
461 Optional<std::vector<int>> opt(in_place, {3, 1}, std::allocator<int>());
462 EXPECT_TRUE(opt);
463 EXPECT_THAT(*opt, ElementsAre(3, 1));
464 EXPECT_EQ(2u, opt->size());
465 }
466}
467
Hidehiko Abe14f92bee2018-02-21 06:01:28468TEST(OptionalTest, ForwardConstructor) {
469 {
470 Optional<double> a(1);
471 EXPECT_TRUE(a.has_value());
472 EXPECT_EQ(1.0, a.value());
473 }
474
475 // Test that default type of 'U' is value_type.
476 {
477 struct TestData {
478 int a;
479 double b;
480 bool c;
481 };
482
483 Optional<TestData> a({1, 2.0, true});
484 EXPECT_TRUE(a.has_value());
485 EXPECT_EQ(1, a->a);
486 EXPECT_EQ(2.0, a->b);
487 EXPECT_TRUE(a->c);
488 }
489
490 // If T has a constructor with a param Optional<U>, and another ctor with a
491 // param U, then T(Optional<U>) should be used for Optional<T>(Optional<U>)
492 // constructor.
493 {
494 enum class ParamType {
495 DEFAULT_CONSTRUCTED,
496 COPY_CONSTRUCTED,
497 MOVE_CONSTRUCTED,
498 INT,
499 IN_PLACE,
500 OPTIONAL_INT,
501 };
502 struct Test {
503 Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
504 Test(const Test& param) : param_type(ParamType::COPY_CONSTRUCTED) {}
505 Test(Test&& param) : param_type(ParamType::MOVE_CONSTRUCTED) {}
506 explicit Test(int param) : param_type(ParamType::INT) {}
507 explicit Test(in_place_t param) : param_type(ParamType::IN_PLACE) {}
508 explicit Test(Optional<int> param)
509 : param_type(ParamType::OPTIONAL_INT) {}
510
511 ParamType param_type;
512 };
513
514 // Overload resolution with copy-conversion constructor.
515 {
516 const Optional<int> arg(in_place, 1);
517 Optional<Test> testee(arg);
518 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
519 }
520
521 // Overload resolution with move conversion constructor.
522 {
523 Optional<Test> testee(Optional<int>(in_place, 1));
524 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
525 }
526
527 // Default constructor should be used.
528 {
529 Optional<Test> testee(in_place);
530 EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
531 }
532 }
533
534 {
535 struct Test {
536 Test(int a) {} // NOLINT(runtime/explicit)
537 };
538 // If T is convertible from U, it is not marked as explicit.
539 static_assert(std::is_convertible<int, Test>::value,
540 "Int should be convertible to Test.");
541 ([](Optional<Test> param) {})(1);
542 }
543}
544
alshabalinf06b07df2016-05-27 08:01:31545TEST(OptionalTest, NulloptConstructor) {
alshabalin9494e4542016-10-25 09:56:41546 constexpr Optional<int> a(base::nullopt);
alshabalinf06b07df2016-05-27 08:01:31547 EXPECT_FALSE(a);
548}
549
mlamouri53f6b252016-04-19 17:27:01550TEST(OptionalTest, AssignValue) {
551 {
552 Optional<float> a;
553 EXPECT_FALSE(a);
554 a = 0.1f;
555 EXPECT_TRUE(a);
556
557 Optional<float> b(0.1f);
558 EXPECT_TRUE(a == b);
559 }
560
561 {
562 Optional<std::string> a;
563 EXPECT_FALSE(a);
564 a = std::string("foo");
565 EXPECT_TRUE(a);
566
567 Optional<std::string> b(std::string("foo"));
568 EXPECT_EQ(a, b);
569 }
570
571 {
572 Optional<TestObject> a;
573 EXPECT_FALSE(!!a);
574 a = TestObject(3, 0.1);
575 EXPECT_TRUE(!!a);
576
577 Optional<TestObject> b(TestObject(3, 0.1));
578 EXPECT_TRUE(a == b);
579 }
alshabalinf06b07df2016-05-27 08:01:31580
581 {
582 Optional<TestObject> a = TestObject(4, 1.0);
583 EXPECT_TRUE(!!a);
584 a = TestObject(3, 0.1);
585 EXPECT_TRUE(!!a);
586
587 Optional<TestObject> b(TestObject(3, 0.1));
588 EXPECT_TRUE(a == b);
589 }
mlamouri53f6b252016-04-19 17:27:01590}
591
592TEST(OptionalTest, AssignObject) {
593 {
594 Optional<float> a;
595 Optional<float> b(0.1f);
596 a = b;
597
598 EXPECT_TRUE(a);
599 EXPECT_EQ(a.value(), 0.1f);
600 EXPECT_EQ(a, b);
601 }
602
603 {
604 Optional<std::string> a;
605 Optional<std::string> b("foo");
606 a = b;
607
608 EXPECT_TRUE(a);
609 EXPECT_EQ(a.value(), "foo");
610 EXPECT_EQ(a, b);
611 }
612
613 {
614 Optional<TestObject> a;
615 Optional<TestObject> b(TestObject(3, 0.1));
616 a = b;
617
618 EXPECT_TRUE(!!a);
619 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
620 EXPECT_TRUE(a == b);
621 }
alshabalinf06b07df2016-05-27 08:01:31622
623 {
624 Optional<TestObject> a(TestObject(4, 1.0));
625 Optional<TestObject> b(TestObject(3, 0.1));
626 a = b;
627
628 EXPECT_TRUE(!!a);
629 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
630 EXPECT_TRUE(a == b);
631 }
Hidehiko Abe5cae9642018-01-26 18:01:11632
633 {
634 Optional<DeletedMove> a(in_place, 42);
635 Optional<DeletedMove> b;
636 b = a;
637
638 EXPECT_TRUE(!!a);
639 EXPECT_TRUE(!!b);
640 EXPECT_EQ(a->foo(), b->foo());
641 }
642
643 {
644 Optional<DeletedMove> a(in_place, 42);
645 Optional<DeletedMove> b(in_place, 1);
646 b = a;
647
648 EXPECT_TRUE(!!a);
649 EXPECT_TRUE(!!b);
650 EXPECT_EQ(a->foo(), b->foo());
651 }
Hidehiko Abe40ee4ae2018-02-23 04:24:12652
653 // Converting assignment.
654 {
655 Optional<int> a(in_place, 1);
656 Optional<double> b;
657 b = a;
658
659 EXPECT_TRUE(!!a);
660 EXPECT_TRUE(!!b);
661 EXPECT_EQ(1, a.value());
662 EXPECT_EQ(1.0, b.value());
663 }
664
665 {
666 Optional<int> a(in_place, 42);
667 Optional<double> b(in_place, 1);
668 b = a;
669
670 EXPECT_TRUE(!!a);
671 EXPECT_TRUE(!!b);
672 EXPECT_EQ(42, a.value());
673 EXPECT_EQ(42.0, b.value());
674 }
675
676 {
677 Optional<int> a;
678 Optional<double> b(in_place, 1);
679 b = a;
680 EXPECT_FALSE(!!a);
681 EXPECT_FALSE(!!b);
682 }
mlamouri53f6b252016-04-19 17:27:01683}
684
685TEST(OptionalTest, AssignObject_rvalue) {
686 {
687 Optional<float> a;
688 Optional<float> b(0.1f);
689 a = std::move(b);
690
691 EXPECT_TRUE(a);
692 EXPECT_TRUE(b);
693 EXPECT_EQ(0.1f, a.value());
694 }
695
696 {
697 Optional<std::string> a;
698 Optional<std::string> b("foo");
699 a = std::move(b);
700
701 EXPECT_TRUE(a);
702 EXPECT_TRUE(b);
703 EXPECT_EQ("foo", a.value());
704 }
705
706 {
707 Optional<TestObject> a;
708 Optional<TestObject> b(TestObject(3, 0.1));
709 a = std::move(b);
710
711 EXPECT_TRUE(!!a);
712 EXPECT_TRUE(!!b);
713 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
714
715 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
716 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
717 }
alshabalinf06b07df2016-05-27 08:01:31718
719 {
720 Optional<TestObject> a(TestObject(4, 1.0));
721 Optional<TestObject> b(TestObject(3, 0.1));
722 a = std::move(b);
723
724 EXPECT_TRUE(!!a);
725 EXPECT_TRUE(!!b);
726 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
727
728 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
729 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
730 }
Hidehiko Abe5cae9642018-01-26 18:01:11731
732 {
733 Optional<DeletedMove> a(in_place, 42);
734 Optional<DeletedMove> b;
735 b = std::move(a);
736
737 EXPECT_TRUE(!!a);
738 EXPECT_TRUE(!!b);
739 EXPECT_EQ(42, b->foo());
740 }
741
742 {
743 Optional<DeletedMove> a(in_place, 42);
744 Optional<DeletedMove> b(in_place, 1);
745 b = std::move(a);
746
747 EXPECT_TRUE(!!a);
748 EXPECT_TRUE(!!b);
749 EXPECT_EQ(42, b->foo());
750 }
Hidehiko Abe40ee4ae2018-02-23 04:24:12751
752 // Converting assignment.
753 {
754 Optional<int> a(in_place, 1);
755 Optional<double> b;
756 b = std::move(a);
757
758 EXPECT_TRUE(!!a);
759 EXPECT_TRUE(!!b);
760 EXPECT_EQ(1.0, b.value());
761 }
762
763 {
764 Optional<int> a(in_place, 42);
765 Optional<double> b(in_place, 1);
766 b = std::move(a);
767
768 EXPECT_TRUE(!!a);
769 EXPECT_TRUE(!!b);
770 EXPECT_EQ(42.0, b.value());
771 }
772
773 {
774 Optional<int> a;
775 Optional<double> b(in_place, 1);
776 b = std::move(a);
777
778 EXPECT_FALSE(!!a);
779 EXPECT_FALSE(!!b);
780 }
mlamouri53f6b252016-04-19 17:27:01781}
782
783TEST(OptionalTest, AssignNull) {
784 {
785 Optional<float> a(0.1f);
786 Optional<float> b(0.2f);
787 a = base::nullopt;
788 b = base::nullopt;
789 EXPECT_EQ(a, b);
790 }
791
792 {
793 Optional<std::string> a("foo");
794 Optional<std::string> b("bar");
795 a = base::nullopt;
796 b = base::nullopt;
797 EXPECT_EQ(a, b);
798 }
799
800 {
801 Optional<TestObject> a(TestObject(3, 0.1));
802 Optional<TestObject> b(TestObject(4, 1.0));
803 a = base::nullopt;
804 b = base::nullopt;
805 EXPECT_TRUE(a == b);
806 }
807}
808
Hidehiko Abe40ee4ae2018-02-23 04:24:12809TEST(OptionalTest, AssignOverload) {
810 struct Test1 {
811 enum class State {
812 CONSTRUCTED,
813 MOVED,
814 };
815 State state = State::CONSTRUCTED;
816 };
817
818 // Here, Optional<Test2> can be assigned from Optioanl<Test1>.
819 // In case of move, marks MOVED to Test1 instance.
820 struct Test2 {
821 enum class State {
822 DEFAULT_CONSTRUCTED,
823 COPY_CONSTRUCTED_FROM_TEST1,
824 MOVE_CONSTRUCTED_FROM_TEST1,
825 COPY_ASSIGNED_FROM_TEST1,
826 MOVE_ASSIGNED_FROM_TEST1,
827 };
828
829 Test2() = default;
830 explicit Test2(const Test1& test1)
831 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
832 explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
833 test1.state = Test1::State::MOVED;
834 }
835 Test2& operator=(const Test1& test1) {
836 state = State::COPY_ASSIGNED_FROM_TEST1;
837 return *this;
838 }
839 Test2& operator=(Test1&& test1) {
840 state = State::MOVE_ASSIGNED_FROM_TEST1;
841 test1.state = Test1::State::MOVED;
842 return *this;
843 }
844
845 State state = State::DEFAULT_CONSTRUCTED;
846 };
847
848 {
849 Optional<Test1> a(in_place);
850 Optional<Test2> b;
851
852 b = a;
853 EXPECT_TRUE(!!a);
854 EXPECT_TRUE(!!b);
855 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
856 EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
857 }
858
859 {
860 Optional<Test1> a(in_place);
861 Optional<Test2> b(in_place);
862
863 b = a;
864 EXPECT_TRUE(!!a);
865 EXPECT_TRUE(!!b);
866 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
867 EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
868 }
869
870 {
871 Optional<Test1> a(in_place);
872 Optional<Test2> b;
873
874 b = std::move(a);
875 EXPECT_TRUE(!!a);
876 EXPECT_TRUE(!!b);
877 EXPECT_EQ(Test1::State::MOVED, a->state);
878 EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
879 }
880
881 {
882 Optional<Test1> a(in_place);
883 Optional<Test2> b(in_place);
884
885 b = std::move(a);
886 EXPECT_TRUE(!!a);
887 EXPECT_TRUE(!!b);
888 EXPECT_EQ(Test1::State::MOVED, a->state);
889 EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
890 }
891
892 // Similar to Test2, but Test3 also has copy/move ctor and assign operators
893 // from Optional<Test1>, too. In this case, for a = b where a is
894 // Optional<Test3> and b is Optional<Test1>,
895 // Optional<T>::operator=(U&&) where U is Optional<Test1> should be used
896 // rather than Optional<T>::operator=(Optional<U>&&) where U is Test1.
897 struct Test3 {
898 enum class State {
899 DEFAULT_CONSTRUCTED,
900 COPY_CONSTRUCTED_FROM_TEST1,
901 MOVE_CONSTRUCTED_FROM_TEST1,
902 COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
903 MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
904 COPY_ASSIGNED_FROM_TEST1,
905 MOVE_ASSIGNED_FROM_TEST1,
906 COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
907 MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
908 };
909
910 Test3() = default;
911 explicit Test3(const Test1& test1)
912 : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
913 explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
914 test1.state = Test1::State::MOVED;
915 }
916 explicit Test3(const Optional<Test1>& test1)
917 : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
918 explicit Test3(Optional<Test1>&& test1)
919 : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
920 // In the following senarios, given |test1| should always have value.
921 DCHECK(test1.has_value());
922 test1->state = Test1::State::MOVED;
923 }
924 Test3& operator=(const Test1& test1) {
925 state = State::COPY_ASSIGNED_FROM_TEST1;
926 return *this;
927 }
928 Test3& operator=(Test1&& test1) {
929 state = State::MOVE_ASSIGNED_FROM_TEST1;
930 test1.state = Test1::State::MOVED;
931 return *this;
932 }
933 Test3& operator=(const Optional<Test1>& test1) {
934 state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
935 return *this;
936 }
937 Test3& operator=(Optional<Test1>&& test1) {
938 state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
939 // In the following senarios, given |test1| should always have value.
940 DCHECK(test1.has_value());
941 test1->state = Test1::State::MOVED;
942 return *this;
943 }
944
945 State state = State::DEFAULT_CONSTRUCTED;
946 };
947
948 {
949 Optional<Test1> a(in_place);
950 Optional<Test3> b;
951
952 b = a;
953 EXPECT_TRUE(!!a);
954 EXPECT_TRUE(!!b);
955 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
956 EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
957 }
958
959 {
960 Optional<Test1> a(in_place);
961 Optional<Test3> b(in_place);
962
963 b = a;
964 EXPECT_TRUE(!!a);
965 EXPECT_TRUE(!!b);
966 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
967 EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
968 }
969
970 {
971 Optional<Test1> a(in_place);
972 Optional<Test3> b;
973
974 b = std::move(a);
975 EXPECT_TRUE(!!a);
976 EXPECT_TRUE(!!b);
977 EXPECT_EQ(Test1::State::MOVED, a->state);
978 EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
979 }
980
981 {
982 Optional<Test1> a(in_place);
983 Optional<Test3> b(in_place);
984
985 b = std::move(a);
986 EXPECT_TRUE(!!a);
987 EXPECT_TRUE(!!b);
988 EXPECT_EQ(Test1::State::MOVED, a->state);
989 EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
990 }
991}
992
mlamouri53f6b252016-04-19 17:27:01993TEST(OptionalTest, OperatorStar) {
994 {
995 Optional<float> a(0.1f);
996 EXPECT_EQ(a.value(), *a);
997 }
998
999 {
1000 Optional<std::string> a("foo");
1001 EXPECT_EQ(a.value(), *a);
1002 }
1003
1004 {
1005 Optional<TestObject> a(TestObject(3, 0.1));
1006 EXPECT_EQ(a.value(), *a);
1007 }
1008}
1009
1010TEST(OptionalTest, OperatorStar_rvalue) {
1011 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
1012 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
1013 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
1014}
1015
1016TEST(OptionalTest, OperatorArrow) {
1017 Optional<TestObject> a(TestObject(3, 0.1));
1018 EXPECT_EQ(a->foo(), 3);
1019}
1020
1021TEST(OptionalTest, Value_rvalue) {
1022 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
1023 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
1024 EXPECT_TRUE(TestObject(3, 0.1) ==
1025 Optional<TestObject>(TestObject(3, 0.1)).value());
1026}
1027
1028TEST(OptionalTest, ValueOr) {
1029 {
1030 Optional<float> a;
1031 EXPECT_EQ(0.0f, a.value_or(0.0f));
1032
1033 a = 0.1f;
1034 EXPECT_EQ(0.1f, a.value_or(0.0f));
1035
1036 a = base::nullopt;
1037 EXPECT_EQ(0.0f, a.value_or(0.0f));
1038 }
1039
Hidehiko Abeb467afe2018-02-23 07:01:301040 // value_or() can be constexpr.
1041 {
1042 constexpr Optional<int> a(in_place, 1);
1043 constexpr int value = a.value_or(10);
1044 EXPECT_EQ(1, value);
1045 }
1046 {
1047 constexpr Optional<int> a;
1048 constexpr int value = a.value_or(10);
1049 EXPECT_EQ(10, value);
1050 }
1051
mlamouri53f6b252016-04-19 17:27:011052 {
1053 Optional<std::string> a;
1054 EXPECT_EQ("bar", a.value_or("bar"));
1055
1056 a = std::string("foo");
1057 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
1058
1059 a = base::nullopt;
1060 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
1061 }
1062
1063 {
1064 Optional<TestObject> a;
1065 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1066
1067 a = TestObject(3, 0.1);
1068 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
1069
1070 a = base::nullopt;
1071 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1072 }
1073}
1074
1075TEST(OptionalTest, Swap_bothNoValue) {
1076 Optional<TestObject> a, b;
1077 a.swap(b);
1078
1079 EXPECT_FALSE(a);
1080 EXPECT_FALSE(b);
1081 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1082 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1083}
1084
1085TEST(OptionalTest, Swap_inHasValue) {
1086 Optional<TestObject> a(TestObject(1, 0.3));
1087 Optional<TestObject> b;
1088 a.swap(b);
1089
1090 EXPECT_FALSE(a);
1091
1092 EXPECT_TRUE(!!b);
1093 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1094 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1095}
1096
1097TEST(OptionalTest, Swap_outHasValue) {
1098 Optional<TestObject> a;
1099 Optional<TestObject> b(TestObject(1, 0.3));
1100 a.swap(b);
1101
1102 EXPECT_TRUE(!!a);
1103 EXPECT_FALSE(!!b);
1104 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1105 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1106}
1107
1108TEST(OptionalTest, Swap_bothValue) {
1109 Optional<TestObject> a(TestObject(0, 0.1));
1110 Optional<TestObject> b(TestObject(1, 0.3));
1111 a.swap(b);
1112
1113 EXPECT_TRUE(!!a);
1114 EXPECT_TRUE(!!b);
1115 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1116 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
alshabalinf06b07df2016-05-27 08:01:311117 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1118 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
mlamouri53f6b252016-04-19 17:27:011119}
1120
1121TEST(OptionalTest, Emplace) {
1122 {
1123 Optional<float> a(0.1f);
Hidehiko Abeb467afe2018-02-23 07:01:301124 EXPECT_EQ(0.3f, a.emplace(0.3f));
mlamouri53f6b252016-04-19 17:27:011125
1126 EXPECT_TRUE(a);
1127 EXPECT_EQ(0.3f, a.value());
1128 }
1129
1130 {
1131 Optional<std::string> a("foo");
Hidehiko Abeb467afe2018-02-23 07:01:301132 EXPECT_EQ("bar", a.emplace("bar"));
mlamouri53f6b252016-04-19 17:27:011133
1134 EXPECT_TRUE(a);
1135 EXPECT_EQ("bar", a.value());
1136 }
1137
1138 {
1139 Optional<TestObject> a(TestObject(0, 0.1));
Hidehiko Abeb467afe2018-02-23 07:01:301140 EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
mlamouri53f6b252016-04-19 17:27:011141
1142 EXPECT_TRUE(!!a);
1143 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
1144 }
jdoerrieb6e6c752018-01-03 09:13:451145
1146 {
1147 Optional<std::vector<int>> a;
1148 auto& ref = a.emplace({2, 3});
1149 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1150 EXPECT_TRUE(a);
1151 EXPECT_THAT(*a, ElementsAre(2, 3));
1152 EXPECT_EQ(&ref, &*a);
1153 }
1154
1155 {
1156 Optional<std::vector<int>> a;
1157 auto& ref = a.emplace({4, 5}, std::allocator<int>());
1158 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1159 EXPECT_TRUE(a);
1160 EXPECT_THAT(*a, ElementsAre(4, 5));
1161 EXPECT_EQ(&ref, &*a);
1162 }
mlamouri53f6b252016-04-19 17:27:011163}
1164
1165TEST(OptionalTest, Equals_TwoEmpty) {
1166 Optional<int> a;
1167 Optional<int> b;
1168
1169 EXPECT_TRUE(a == b);
1170}
1171
1172TEST(OptionalTest, Equals_TwoEquals) {
1173 Optional<int> a(1);
1174 Optional<int> b(1);
1175
1176 EXPECT_TRUE(a == b);
1177}
1178
1179TEST(OptionalTest, Equals_OneEmpty) {
1180 Optional<int> a;
1181 Optional<int> b(1);
1182
1183 EXPECT_FALSE(a == b);
1184}
1185
1186TEST(OptionalTest, Equals_TwoDifferent) {
1187 Optional<int> a(0);
1188 Optional<int> b(1);
1189
1190 EXPECT_FALSE(a == b);
1191}
1192
Hidehiko Abe7a534c32017-12-20 10:56:261193TEST(OptionalTest, Equals_DifferentType) {
1194 Optional<int> a(0);
1195 Optional<double> b(0);
1196
1197 EXPECT_TRUE(a == b);
1198}
1199
mlamouri53f6b252016-04-19 17:27:011200TEST(OptionalTest, NotEquals_TwoEmpty) {
1201 Optional<int> a;
1202 Optional<int> b;
1203
1204 EXPECT_FALSE(a != b);
1205}
1206
1207TEST(OptionalTest, NotEquals_TwoEquals) {
1208 Optional<int> a(1);
1209 Optional<int> b(1);
1210
1211 EXPECT_FALSE(a != b);
1212}
1213
1214TEST(OptionalTest, NotEquals_OneEmpty) {
1215 Optional<int> a;
1216 Optional<int> b(1);
1217
1218 EXPECT_TRUE(a != b);
1219}
1220
1221TEST(OptionalTest, NotEquals_TwoDifferent) {
1222 Optional<int> a(0);
1223 Optional<int> b(1);
1224
1225 EXPECT_TRUE(a != b);
1226}
1227
Hidehiko Abe7a534c32017-12-20 10:56:261228TEST(OptionalTest, NotEquals_DifferentType) {
1229 Optional<int> a(0);
1230 Optional<double> b(0.0);
1231
1232 EXPECT_FALSE(a != b);
1233}
1234
mlamouri53f6b252016-04-19 17:27:011235TEST(OptionalTest, Less_LeftEmpty) {
1236 Optional<int> l;
1237 Optional<int> r(1);
1238
1239 EXPECT_TRUE(l < r);
1240}
1241
1242TEST(OptionalTest, Less_RightEmpty) {
1243 Optional<int> l(1);
1244 Optional<int> r;
1245
1246 EXPECT_FALSE(l < r);
1247}
1248
1249TEST(OptionalTest, Less_BothEmpty) {
1250 Optional<int> l;
1251 Optional<int> r;
1252
1253 EXPECT_FALSE(l < r);
1254}
1255
1256TEST(OptionalTest, Less_BothValues) {
1257 {
1258 Optional<int> l(1);
1259 Optional<int> r(2);
1260
1261 EXPECT_TRUE(l < r);
1262 }
1263 {
1264 Optional<int> l(2);
1265 Optional<int> r(1);
1266
1267 EXPECT_FALSE(l < r);
1268 }
1269 {
1270 Optional<int> l(1);
1271 Optional<int> r(1);
1272
1273 EXPECT_FALSE(l < r);
1274 }
1275}
1276
Hidehiko Abe7a534c32017-12-20 10:56:261277TEST(OptionalTest, Less_DifferentType) {
1278 Optional<int> l(1);
1279 Optional<double> r(2.0);
1280
1281 EXPECT_TRUE(l < r);
1282}
1283
mlamouri53f6b252016-04-19 17:27:011284TEST(OptionalTest, LessEq_LeftEmpty) {
1285 Optional<int> l;
1286 Optional<int> r(1);
1287
1288 EXPECT_TRUE(l <= r);
1289}
1290
1291TEST(OptionalTest, LessEq_RightEmpty) {
1292 Optional<int> l(1);
1293 Optional<int> r;
1294
1295 EXPECT_FALSE(l <= r);
1296}
1297
1298TEST(OptionalTest, LessEq_BothEmpty) {
1299 Optional<int> l;
1300 Optional<int> r;
1301
1302 EXPECT_TRUE(l <= r);
1303}
1304
1305TEST(OptionalTest, LessEq_BothValues) {
1306 {
1307 Optional<int> l(1);
1308 Optional<int> r(2);
1309
1310 EXPECT_TRUE(l <= r);
1311 }
1312 {
1313 Optional<int> l(2);
1314 Optional<int> r(1);
1315
1316 EXPECT_FALSE(l <= r);
1317 }
1318 {
1319 Optional<int> l(1);
1320 Optional<int> r(1);
1321
1322 EXPECT_TRUE(l <= r);
1323 }
1324}
1325
Hidehiko Abe7a534c32017-12-20 10:56:261326TEST(OptionalTest, LessEq_DifferentType) {
1327 Optional<int> l(1);
1328 Optional<double> r(2.0);
1329
1330 EXPECT_TRUE(l <= r);
1331}
1332
mlamouri53f6b252016-04-19 17:27:011333TEST(OptionalTest, Greater_BothEmpty) {
1334 Optional<int> l;
1335 Optional<int> r;
1336
1337 EXPECT_FALSE(l > r);
1338}
1339
1340TEST(OptionalTest, Greater_LeftEmpty) {
1341 Optional<int> l;
1342 Optional<int> r(1);
1343
1344 EXPECT_FALSE(l > r);
1345}
1346
1347TEST(OptionalTest, Greater_RightEmpty) {
1348 Optional<int> l(1);
1349 Optional<int> r;
1350
1351 EXPECT_TRUE(l > r);
1352}
1353
1354TEST(OptionalTest, Greater_BothValue) {
1355 {
1356 Optional<int> l(1);
1357 Optional<int> r(2);
1358
1359 EXPECT_FALSE(l > r);
1360 }
1361 {
1362 Optional<int> l(2);
1363 Optional<int> r(1);
1364
1365 EXPECT_TRUE(l > r);
1366 }
1367 {
1368 Optional<int> l(1);
1369 Optional<int> r(1);
1370
1371 EXPECT_FALSE(l > r);
1372 }
1373}
1374
Hidehiko Abe7a534c32017-12-20 10:56:261375TEST(OptionalTest, Greater_DifferentType) {
1376 Optional<int> l(1);
1377 Optional<double> r(2.0);
1378
1379 EXPECT_FALSE(l > r);
1380}
1381
mlamouri53f6b252016-04-19 17:27:011382TEST(OptionalTest, GreaterEq_BothEmpty) {
1383 Optional<int> l;
1384 Optional<int> r;
1385
1386 EXPECT_TRUE(l >= r);
1387}
1388
1389TEST(OptionalTest, GreaterEq_LeftEmpty) {
1390 Optional<int> l;
1391 Optional<int> r(1);
1392
1393 EXPECT_FALSE(l >= r);
1394}
1395
1396TEST(OptionalTest, GreaterEq_RightEmpty) {
1397 Optional<int> l(1);
1398 Optional<int> r;
1399
1400 EXPECT_TRUE(l >= r);
1401}
1402
1403TEST(OptionalTest, GreaterEq_BothValue) {
1404 {
1405 Optional<int> l(1);
1406 Optional<int> r(2);
1407
1408 EXPECT_FALSE(l >= r);
1409 }
1410 {
1411 Optional<int> l(2);
1412 Optional<int> r(1);
1413
1414 EXPECT_TRUE(l >= r);
1415 }
1416 {
1417 Optional<int> l(1);
1418 Optional<int> r(1);
1419
1420 EXPECT_TRUE(l >= r);
1421 }
1422}
1423
Hidehiko Abe7a534c32017-12-20 10:56:261424TEST(OptionalTest, GreaterEq_DifferentType) {
1425 Optional<int> l(1);
1426 Optional<double> r(2.0);
1427
1428 EXPECT_FALSE(l >= r);
1429}
1430
mlamouri53f6b252016-04-19 17:27:011431TEST(OptionalTest, OptNullEq) {
1432 {
1433 Optional<int> opt;
1434 EXPECT_TRUE(opt == base::nullopt);
1435 }
1436 {
1437 Optional<int> opt(1);
1438 EXPECT_FALSE(opt == base::nullopt);
1439 }
1440}
1441
1442TEST(OptionalTest, NullOptEq) {
1443 {
1444 Optional<int> opt;
1445 EXPECT_TRUE(base::nullopt == opt);
1446 }
1447 {
1448 Optional<int> opt(1);
1449 EXPECT_FALSE(base::nullopt == opt);
1450 }
1451}
1452
1453TEST(OptionalTest, OptNullNotEq) {
1454 {
1455 Optional<int> opt;
1456 EXPECT_FALSE(opt != base::nullopt);
1457 }
1458 {
1459 Optional<int> opt(1);
1460 EXPECT_TRUE(opt != base::nullopt);
1461 }
1462}
1463
1464TEST(OptionalTest, NullOptNotEq) {
1465 {
1466 Optional<int> opt;
1467 EXPECT_FALSE(base::nullopt != opt);
1468 }
1469 {
1470 Optional<int> opt(1);
1471 EXPECT_TRUE(base::nullopt != opt);
1472 }
1473}
1474
1475TEST(OptionalTest, OptNullLower) {
1476 {
1477 Optional<int> opt;
1478 EXPECT_FALSE(opt < base::nullopt);
1479 }
1480 {
1481 Optional<int> opt(1);
1482 EXPECT_FALSE(opt < base::nullopt);
1483 }
1484}
1485
1486TEST(OptionalTest, NullOptLower) {
1487 {
1488 Optional<int> opt;
1489 EXPECT_FALSE(base::nullopt < opt);
1490 }
1491 {
1492 Optional<int> opt(1);
1493 EXPECT_TRUE(base::nullopt < opt);
1494 }
1495}
1496
1497TEST(OptionalTest, OptNullLowerEq) {
1498 {
1499 Optional<int> opt;
1500 EXPECT_TRUE(opt <= base::nullopt);
1501 }
1502 {
1503 Optional<int> opt(1);
1504 EXPECT_FALSE(opt <= base::nullopt);
1505 }
1506}
1507
1508TEST(OptionalTest, NullOptLowerEq) {
1509 {
1510 Optional<int> opt;
1511 EXPECT_TRUE(base::nullopt <= opt);
1512 }
1513 {
1514 Optional<int> opt(1);
1515 EXPECT_TRUE(base::nullopt <= opt);
1516 }
1517}
1518
1519TEST(OptionalTest, OptNullGreater) {
1520 {
1521 Optional<int> opt;
1522 EXPECT_FALSE(opt > base::nullopt);
1523 }
1524 {
1525 Optional<int> opt(1);
1526 EXPECT_TRUE(opt > base::nullopt);
1527 }
1528}
1529
1530TEST(OptionalTest, NullOptGreater) {
1531 {
1532 Optional<int> opt;
1533 EXPECT_FALSE(base::nullopt > opt);
1534 }
1535 {
1536 Optional<int> opt(1);
1537 EXPECT_FALSE(base::nullopt > opt);
1538 }
1539}
1540
1541TEST(OptionalTest, OptNullGreaterEq) {
1542 {
1543 Optional<int> opt;
1544 EXPECT_TRUE(opt >= base::nullopt);
1545 }
1546 {
1547 Optional<int> opt(1);
1548 EXPECT_TRUE(opt >= base::nullopt);
1549 }
1550}
1551
1552TEST(OptionalTest, NullOptGreaterEq) {
1553 {
1554 Optional<int> opt;
1555 EXPECT_TRUE(base::nullopt >= opt);
1556 }
1557 {
1558 Optional<int> opt(1);
1559 EXPECT_FALSE(base::nullopt >= opt);
1560 }
1561}
1562
1563TEST(OptionalTest, ValueEq_Empty) {
1564 Optional<int> opt;
1565 EXPECT_FALSE(opt == 1);
1566}
1567
1568TEST(OptionalTest, ValueEq_NotEmpty) {
1569 {
1570 Optional<int> opt(0);
1571 EXPECT_FALSE(opt == 1);
1572 }
1573 {
1574 Optional<int> opt(1);
1575 EXPECT_TRUE(opt == 1);
1576 }
1577}
1578
Hidehiko Abe7a534c32017-12-20 10:56:261579TEST(OptionalTest, ValueEq_DifferentType) {
1580 Optional<int> opt(0);
1581 EXPECT_TRUE(opt == 0.0);
1582}
1583
mlamouri53f6b252016-04-19 17:27:011584TEST(OptionalTest, EqValue_Empty) {
1585 Optional<int> opt;
1586 EXPECT_FALSE(1 == opt);
1587}
1588
1589TEST(OptionalTest, EqValue_NotEmpty) {
1590 {
1591 Optional<int> opt(0);
1592 EXPECT_FALSE(1 == opt);
1593 }
1594 {
1595 Optional<int> opt(1);
1596 EXPECT_TRUE(1 == opt);
1597 }
1598}
1599
Hidehiko Abe7a534c32017-12-20 10:56:261600TEST(OptionalTest, EqValue_DifferentType) {
1601 Optional<int> opt(0);
1602 EXPECT_TRUE(0.0 == opt);
1603}
1604
mlamouri53f6b252016-04-19 17:27:011605TEST(OptionalTest, ValueNotEq_Empty) {
1606 Optional<int> opt;
1607 EXPECT_TRUE(opt != 1);
1608}
1609
1610TEST(OptionalTest, ValueNotEq_NotEmpty) {
1611 {
1612 Optional<int> opt(0);
1613 EXPECT_TRUE(opt != 1);
1614 }
1615 {
1616 Optional<int> opt(1);
1617 EXPECT_FALSE(opt != 1);
1618 }
1619}
1620
Hidehiko Abe7a534c32017-12-20 10:56:261621TEST(OPtionalTest, ValueNotEq_DifferentType) {
1622 Optional<int> opt(0);
1623 EXPECT_FALSE(opt != 0.0);
1624}
1625
mlamouri53f6b252016-04-19 17:27:011626TEST(OptionalTest, NotEqValue_Empty) {
1627 Optional<int> opt;
1628 EXPECT_TRUE(1 != opt);
1629}
1630
1631TEST(OptionalTest, NotEqValue_NotEmpty) {
1632 {
1633 Optional<int> opt(0);
1634 EXPECT_TRUE(1 != opt);
1635 }
1636 {
1637 Optional<int> opt(1);
1638 EXPECT_FALSE(1 != opt);
1639 }
1640}
1641
Hidehiko Abe7a534c32017-12-20 10:56:261642TEST(OptionalTest, NotEqValue_DifferentType) {
1643 Optional<int> opt(0);
1644 EXPECT_FALSE(0.0 != opt);
1645}
1646
mlamouri53f6b252016-04-19 17:27:011647TEST(OptionalTest, ValueLess_Empty) {
1648 Optional<int> opt;
1649 EXPECT_TRUE(opt < 1);
1650}
1651
1652TEST(OptionalTest, ValueLess_NotEmpty) {
1653 {
1654 Optional<int> opt(0);
1655 EXPECT_TRUE(opt < 1);
1656 }
1657 {
1658 Optional<int> opt(1);
1659 EXPECT_FALSE(opt < 1);
1660 }
1661 {
1662 Optional<int> opt(2);
1663 EXPECT_FALSE(opt < 1);
1664 }
1665}
1666
Hidehiko Abe7a534c32017-12-20 10:56:261667TEST(OPtionalTest, ValueLess_DifferentType) {
1668 Optional<int> opt(0);
1669 EXPECT_TRUE(opt < 1.0);
1670}
1671
mlamouri53f6b252016-04-19 17:27:011672TEST(OptionalTest, LessValue_Empty) {
1673 Optional<int> opt;
1674 EXPECT_FALSE(1 < opt);
1675}
1676
1677TEST(OptionalTest, LessValue_NotEmpty) {
1678 {
1679 Optional<int> opt(0);
1680 EXPECT_FALSE(1 < opt);
1681 }
1682 {
1683 Optional<int> opt(1);
1684 EXPECT_FALSE(1 < opt);
1685 }
1686 {
1687 Optional<int> opt(2);
1688 EXPECT_TRUE(1 < opt);
1689 }
1690}
1691
Hidehiko Abe7a534c32017-12-20 10:56:261692TEST(OptionalTest, LessValue_DifferentType) {
1693 Optional<int> opt(0);
1694 EXPECT_FALSE(0.0 < opt);
1695}
1696
mlamouri53f6b252016-04-19 17:27:011697TEST(OptionalTest, ValueLessEq_Empty) {
1698 Optional<int> opt;
1699 EXPECT_TRUE(opt <= 1);
1700}
1701
1702TEST(OptionalTest, ValueLessEq_NotEmpty) {
1703 {
1704 Optional<int> opt(0);
1705 EXPECT_TRUE(opt <= 1);
1706 }
1707 {
1708 Optional<int> opt(1);
1709 EXPECT_TRUE(opt <= 1);
1710 }
1711 {
1712 Optional<int> opt(2);
1713 EXPECT_FALSE(opt <= 1);
1714 }
1715}
1716
Hidehiko Abe7a534c32017-12-20 10:56:261717TEST(OptionalTest, ValueLessEq_DifferentType) {
1718 Optional<int> opt(0);
1719 EXPECT_TRUE(opt <= 0.0);
1720}
1721
mlamouri53f6b252016-04-19 17:27:011722TEST(OptionalTest, LessEqValue_Empty) {
1723 Optional<int> opt;
1724 EXPECT_FALSE(1 <= opt);
1725}
1726
1727TEST(OptionalTest, LessEqValue_NotEmpty) {
1728 {
1729 Optional<int> opt(0);
1730 EXPECT_FALSE(1 <= opt);
1731 }
1732 {
1733 Optional<int> opt(1);
1734 EXPECT_TRUE(1 <= opt);
1735 }
1736 {
1737 Optional<int> opt(2);
1738 EXPECT_TRUE(1 <= opt);
1739 }
1740}
1741
Hidehiko Abe7a534c32017-12-20 10:56:261742TEST(OptionalTest, LessEqValue_DifferentType) {
1743 Optional<int> opt(0);
1744 EXPECT_TRUE(0.0 <= opt);
1745}
1746
mlamouri53f6b252016-04-19 17:27:011747TEST(OptionalTest, ValueGreater_Empty) {
1748 Optional<int> opt;
1749 EXPECT_FALSE(opt > 1);
1750}
1751
1752TEST(OptionalTest, ValueGreater_NotEmpty) {
1753 {
1754 Optional<int> opt(0);
1755 EXPECT_FALSE(opt > 1);
1756 }
1757 {
1758 Optional<int> opt(1);
1759 EXPECT_FALSE(opt > 1);
1760 }
1761 {
1762 Optional<int> opt(2);
1763 EXPECT_TRUE(opt > 1);
1764 }
1765}
1766
Hidehiko Abe7a534c32017-12-20 10:56:261767TEST(OptionalTest, ValueGreater_DifferentType) {
1768 Optional<int> opt(0);
1769 EXPECT_FALSE(opt > 0.0);
1770}
1771
mlamouri53f6b252016-04-19 17:27:011772TEST(OptionalTest, GreaterValue_Empty) {
1773 Optional<int> opt;
1774 EXPECT_TRUE(1 > opt);
1775}
1776
1777TEST(OptionalTest, GreaterValue_NotEmpty) {
1778 {
1779 Optional<int> opt(0);
1780 EXPECT_TRUE(1 > opt);
1781 }
1782 {
1783 Optional<int> opt(1);
1784 EXPECT_FALSE(1 > opt);
1785 }
1786 {
1787 Optional<int> opt(2);
1788 EXPECT_FALSE(1 > opt);
1789 }
1790}
1791
Hidehiko Abe7a534c32017-12-20 10:56:261792TEST(OptionalTest, GreaterValue_DifferentType) {
1793 Optional<int> opt(0);
1794 EXPECT_FALSE(0.0 > opt);
1795}
1796
mlamouri53f6b252016-04-19 17:27:011797TEST(OptionalTest, ValueGreaterEq_Empty) {
1798 Optional<int> opt;
1799 EXPECT_FALSE(opt >= 1);
1800}
1801
1802TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1803 {
1804 Optional<int> opt(0);
1805 EXPECT_FALSE(opt >= 1);
1806 }
1807 {
1808 Optional<int> opt(1);
1809 EXPECT_TRUE(opt >= 1);
1810 }
1811 {
1812 Optional<int> opt(2);
1813 EXPECT_TRUE(opt >= 1);
1814 }
1815}
1816
Hidehiko Abe7a534c32017-12-20 10:56:261817TEST(OptionalTest, ValueGreaterEq_DifferentType) {
1818 Optional<int> opt(0);
1819 EXPECT_TRUE(opt <= 0.0);
1820}
1821
mlamouri53f6b252016-04-19 17:27:011822TEST(OptionalTest, GreaterEqValue_Empty) {
1823 Optional<int> opt;
1824 EXPECT_TRUE(1 >= opt);
1825}
1826
1827TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1828 {
1829 Optional<int> opt(0);
1830 EXPECT_TRUE(1 >= opt);
1831 }
1832 {
1833 Optional<int> opt(1);
1834 EXPECT_TRUE(1 >= opt);
1835 }
1836 {
1837 Optional<int> opt(2);
1838 EXPECT_FALSE(1 >= opt);
1839 }
1840}
1841
Hidehiko Abe7a534c32017-12-20 10:56:261842TEST(OptionalTest, GreaterEqValue_DifferentType) {
1843 Optional<int> opt(0);
1844 EXPECT_TRUE(0.0 >= opt);
1845}
1846
mlamouri53f6b252016-04-19 17:27:011847TEST(OptionalTest, NotEquals) {
1848 {
1849 Optional<float> a(0.1f);
1850 Optional<float> b(0.2f);
1851 EXPECT_NE(a, b);
1852 }
1853
1854 {
1855 Optional<std::string> a("foo");
1856 Optional<std::string> b("bar");
1857 EXPECT_NE(a, b);
1858 }
1859
1860 {
Hidehiko Abe7a534c32017-12-20 10:56:261861 Optional<int> a(1);
1862 Optional<double> b(2);
1863 EXPECT_NE(a, b);
1864 }
1865
1866 {
mlamouri53f6b252016-04-19 17:27:011867 Optional<TestObject> a(TestObject(3, 0.1));
1868 Optional<TestObject> b(TestObject(4, 1.0));
1869 EXPECT_TRUE(a != b);
1870 }
1871}
1872
1873TEST(OptionalTest, NotEqualsNull) {
1874 {
1875 Optional<float> a(0.1f);
1876 Optional<float> b(0.1f);
1877 b = base::nullopt;
1878 EXPECT_NE(a, b);
1879 }
1880
1881 {
1882 Optional<std::string> a("foo");
1883 Optional<std::string> b("foo");
1884 b = base::nullopt;
1885 EXPECT_NE(a, b);
1886 }
1887
1888 {
1889 Optional<TestObject> a(TestObject(3, 0.1));
1890 Optional<TestObject> b(TestObject(3, 0.1));
1891 b = base::nullopt;
1892 EXPECT_TRUE(a != b);
1893 }
1894}
1895
1896TEST(OptionalTest, MakeOptional) {
1897 {
Hidehiko Abeb467afe2018-02-23 07:01:301898 Optional<float> o = make_optional(32.f);
mlamouri53f6b252016-04-19 17:27:011899 EXPECT_TRUE(o);
1900 EXPECT_EQ(32.f, *o);
1901
1902 float value = 3.f;
Hidehiko Abeb467afe2018-02-23 07:01:301903 o = make_optional(std::move(value));
mlamouri53f6b252016-04-19 17:27:011904 EXPECT_TRUE(o);
1905 EXPECT_EQ(3.f, *o);
1906 }
1907
1908 {
Hidehiko Abeb467afe2018-02-23 07:01:301909 Optional<std::string> o = make_optional(std::string("foo"));
mlamouri53f6b252016-04-19 17:27:011910 EXPECT_TRUE(o);
1911 EXPECT_EQ("foo", *o);
1912
1913 std::string value = "bar";
Hidehiko Abeb467afe2018-02-23 07:01:301914 o = make_optional(std::move(value));
mlamouri53f6b252016-04-19 17:27:011915 EXPECT_TRUE(o);
1916 EXPECT_EQ(std::string("bar"), *o);
1917 }
1918
1919 {
Hidehiko Abeb467afe2018-02-23 07:01:301920 Optional<TestObject> o = make_optional(TestObject(3, 0.1));
mlamouri53f6b252016-04-19 17:27:011921 EXPECT_TRUE(!!o);
1922 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1923
1924 TestObject value = TestObject(0, 0.42);
Hidehiko Abeb467afe2018-02-23 07:01:301925 o = make_optional(std::move(value));
mlamouri53f6b252016-04-19 17:27:011926 EXPECT_TRUE(!!o);
1927 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1928 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
alshabalinf06b07df2016-05-27 08:01:311929 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
mlamouri53f6b252016-04-19 17:27:011930
1931 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1932 base::make_optional(std::move(value))->state());
1933 }
jdoerrieb6e6c752018-01-03 09:13:451934
1935 {
Hidehiko Abeb467afe2018-02-23 07:01:301936 struct Test {
1937 Test(int a, double b, bool c) : a(a), b(b), c(c) {}
1938
1939 int a;
1940 double b;
1941 bool c;
1942 };
1943
1944 Optional<Test> o = make_optional<Test>(1, 2.0, true);
1945 EXPECT_TRUE(!!o);
1946 EXPECT_EQ(1, o->a);
1947 EXPECT_EQ(2.0, o->b);
1948 EXPECT_TRUE(o->c);
1949 }
1950
1951 {
jdoerrieb6e6c752018-01-03 09:13:451952 auto str1 = make_optional<std::string>({'1', '2', '3'});
1953 EXPECT_EQ("123", *str1);
1954
1955 auto str2 =
1956 make_optional<std::string>({'a', 'b', 'c'}, std::allocator<char>());
1957 EXPECT_EQ("abc", *str2);
1958 }
mlamouri53f6b252016-04-19 17:27:011959}
1960
1961TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1962 Optional<TestObject> a, b;
1963 base::swap(a, b);
1964
1965 EXPECT_FALSE(!!a);
1966 EXPECT_FALSE(!!b);
1967 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1968 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1969}
1970
1971TEST(OptionalTest, NonMemberSwap_inHasValue) {
1972 Optional<TestObject> a(TestObject(1, 0.3));
1973 Optional<TestObject> b;
1974 base::swap(a, b);
1975
1976 EXPECT_FALSE(!!a);
1977 EXPECT_TRUE(!!b);
1978 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1979 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1980}
1981
1982TEST(OptionalTest, NonMemberSwap_outHasValue) {
1983 Optional<TestObject> a;
1984 Optional<TestObject> b(TestObject(1, 0.3));
1985 base::swap(a, b);
1986
1987 EXPECT_TRUE(!!a);
1988 EXPECT_FALSE(!!b);
1989 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1990 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1991}
1992
1993TEST(OptionalTest, NonMemberSwap_bothValue) {
1994 Optional<TestObject> a(TestObject(0, 0.1));
1995 Optional<TestObject> b(TestObject(1, 0.3));
1996 base::swap(a, b);
1997
1998 EXPECT_TRUE(!!a);
1999 EXPECT_TRUE(!!b);
2000 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2001 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
alshabalinf06b07df2016-05-27 08:01:312002 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
2003 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
mlamouri53f6b252016-04-19 17:27:012004}
2005
2006TEST(OptionalTest, Hash_OptionalReflectsInternal) {
2007 {
2008 std::hash<int> int_hash;
2009 std::hash<Optional<int>> opt_int_hash;
2010
2011 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
2012 }
2013
2014 {
2015 std::hash<std::string> str_hash;
2016 std::hash<Optional<std::string>> opt_str_hash;
2017
2018 EXPECT_EQ(str_hash(std::string("foobar")),
2019 opt_str_hash(Optional<std::string>(std::string("foobar"))));
2020 }
2021}
2022
2023TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
2024 std::hash<Optional<int>> opt_int_hash;
2025 std::hash<Optional<std::string>> opt_str_hash;
2026
2027 EXPECT_EQ(opt_str_hash(Optional<std::string>()),
2028 opt_int_hash(Optional<int>()));
2029}
2030
2031TEST(OptionalTest, Hash_UseInSet) {
2032 std::set<Optional<int>> setOptInt;
2033
2034 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2035
2036 setOptInt.insert(Optional<int>(3));
2037 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2038 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
2039}
2040
mlamouri26204572016-08-10 12:24:152041TEST(OptionalTest, HasValue) {
2042 Optional<int> a;
2043 EXPECT_FALSE(a.has_value());
2044
2045 a = 42;
2046 EXPECT_TRUE(a.has_value());
2047
2048 a = nullopt;
2049 EXPECT_FALSE(a.has_value());
2050
2051 a = 0;
2052 EXPECT_TRUE(a.has_value());
2053
2054 a = Optional<int>();
2055 EXPECT_FALSE(a.has_value());
2056}
2057
2058TEST(OptionalTest, Reset_int) {
2059 Optional<int> a(0);
2060 EXPECT_TRUE(a.has_value());
2061 EXPECT_EQ(0, a.value());
2062
2063 a.reset();
2064 EXPECT_FALSE(a.has_value());
2065 EXPECT_EQ(-1, a.value_or(-1));
2066}
2067
2068TEST(OptionalTest, Reset_Object) {
2069 Optional<TestObject> a(TestObject(0, 0.1));
2070 EXPECT_TRUE(a.has_value());
2071 EXPECT_EQ(TestObject(0, 0.1), a.value());
2072
2073 a.reset();
2074 EXPECT_FALSE(a.has_value());
2075 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
2076}
2077
2078TEST(OptionalTest, Reset_NoOp) {
2079 Optional<int> a;
2080 EXPECT_FALSE(a.has_value());
2081
2082 a.reset();
2083 EXPECT_FALSE(a.has_value());
2084}
2085
Andrey Kraynov976fbbd2017-09-13 17:15:442086TEST(OptionalTest, AssignFromRValue) {
2087 Optional<TestObject> a;
2088 EXPECT_FALSE(a.has_value());
2089
2090 TestObject obj;
2091 a = std::move(obj);
2092 EXPECT_TRUE(a.has_value());
2093 EXPECT_EQ(1, a->move_ctors_count());
2094}
2095
Mounir Lamouri3f24be82018-01-03 16:39:452096TEST(OptionalTest, DontCallDefaultCtor) {
2097 Optional<DeletedDefaultConstructor> a;
2098 EXPECT_FALSE(a.has_value());
2099
2100 a = base::make_optional<DeletedDefaultConstructor>(42);
2101 EXPECT_TRUE(a.has_value());
2102 EXPECT_EQ(42, a->foo());
2103}
2104
2105TEST(OptionalTest, DontCallNewMemberFunction) {
2106 Optional<DeleteNewOperators> a;
2107 EXPECT_FALSE(a.has_value());
2108
2109 a = DeleteNewOperators();
2110 EXPECT_TRUE(a.has_value());
2111}
2112
Hidehiko Abe3aa61df2018-02-24 12:47:072113TEST(OptionalTest, Noexcept) {
2114 // non-noexcept move-constructible.
2115 struct Test1 {
2116 Test1(Test1&&) {}
2117 Test1& operator=(Test1&&) = default;
2118 };
2119 // non-noexcept move-assignable.
2120 struct Test2 {
2121 Test2(Test2&&) = default;
2122 Test2& operator=(Test2&&) { return *this; }
2123 };
2124
2125 static_assert(
2126 noexcept(Optional<int>(std::declval<Optional<int>>())),
2127 "move constructor for noexcept move-constructible T must be noexcept");
2128 static_assert(
2129 !noexcept(Optional<Test1>(std::declval<Optional<Test1>>())),
2130 "move constructor for non-noexcept move-constructible T must not be "
2131 "noexcept");
2132 static_assert(
2133 noexcept(Optional<Test2>(std::declval<Optional<Test2>>())),
2134 "move constructor for noexcept move-constructible T must be noexcept");
2135
2136 static_assert(
2137 noexcept(std::declval<Optional<int>>() = std::declval<Optional<int>>()),
2138 "move assign for noexcept move-constructible/move-assignable T "
2139 "must be noexcept");
2140 static_assert(
2141 !noexcept(std::declval<Optional<Test1>>() =
2142 std::declval<Optional<Test1>>()),
2143 "move assign for non-noexcept move-constructible T must not be noexcept");
2144 static_assert(
2145 !noexcept(std::declval<Optional<Test2>>() =
2146 std::declval<Optional<Test2>>()),
2147 "move assign for non-noexcept move-assignable T must not be noexcept");
2148}
2149
mlamouri53f6b252016-04-19 17:27:012150} // namespace base