1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/optional.h"
6
7 #include <set>
8
9 #include "testing/gtest/include/gtest/gtest.h"
10
11 namespace base {
12
13 namespace {
14
15 // Object used to test complex object with Optional<T> in addition of the move
16 // semantics.
17 class TestObject {
18 public:
19 enum class State {
20 DEFAULT_CONSTRUCTED,
21 VALUE_CONSTRUCTED,
22 COPY_CONSTRUCTED,
23 MOVE_CONSTRUCTED,
24 MOVED_FROM,
25 COPY_ASSIGNED,
26 MOVE_ASSIGNED,
27 SWAPPED,
28 };
29
TestObject()30 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
31
TestObject(int foo,double bar)32 TestObject(int foo, double bar)
33 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
34
TestObject(const TestObject & other)35 TestObject(const TestObject& other)
36 : foo_(other.foo_), bar_(other.bar_), state_(State::COPY_CONSTRUCTED) {}
37
TestObject(TestObject && other)38 TestObject(TestObject&& other)
39 : foo_(std::move(other.foo_)),
40 bar_(std::move(other.bar_)),
41 state_(State::MOVE_CONSTRUCTED) {
42 other.state_ = State::MOVED_FROM;
43 }
44
operator =(const TestObject & other)45 TestObject& operator=(const TestObject& other) {
46 foo_ = other.foo_;
47 bar_ = other.bar_;
48 state_ = State::COPY_ASSIGNED;
49 return *this;
50 }
51
operator =(TestObject && other)52 TestObject& operator=(TestObject&& other) {
53 foo_ = other.foo_;
54 bar_ = other.bar_;
55 state_ = State::MOVE_ASSIGNED;
56 other.state_ = State::MOVED_FROM;
57 return *this;
58 }
59
Swap(TestObject * other)60 void Swap(TestObject* other) {
61 using std::swap;
62 swap(foo_, other->foo_);
63 swap(bar_, other->bar_);
64 state_ = State::SWAPPED;
65 other->state_ = State::SWAPPED;
66 }
67
operator ==(const TestObject & other) const68 bool operator==(const TestObject& other) const {
69 return foo_ == other.foo_ && bar_ == other.bar_;
70 }
71
foo() const72 int foo() const { return foo_; }
state() const73 State state() const { return state_; }
74
75 private:
76 int foo_;
77 double bar_;
78 State state_;
79 };
80
81 // Implementing Swappable concept.
swap(TestObject & lhs,TestObject & rhs)82 void swap(TestObject& lhs, TestObject& rhs) {
83 lhs.Swap(&rhs);
84 }
85
86 class NonTriviallyDestructible {
~NonTriviallyDestructible()87 ~NonTriviallyDestructible() {}
88 };
89
90 } // anonymous namespace
91
92 static_assert(is_trivially_destructible<Optional<int>>::value,
93 "OptionalIsTriviallyDestructible");
94
95 static_assert(
96 !is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
97 "OptionalIsTriviallyDestructible");
98
TEST(OptionalTest,DefaultConstructor)99 TEST(OptionalTest, DefaultConstructor) {
100 {
101 constexpr Optional<float> o;
102 EXPECT_FALSE(o);
103 }
104
105 {
106 Optional<std::string> o;
107 EXPECT_FALSE(o);
108 }
109
110 {
111 Optional<TestObject> o;
112 EXPECT_FALSE(o);
113 }
114 }
115
TEST(OptionalTest,CopyConstructor)116 TEST(OptionalTest, CopyConstructor) {
117 {
118 Optional<float> first(0.1f);
119 Optional<float> other(first);
120
121 EXPECT_TRUE(other);
122 EXPECT_EQ(other.value(), 0.1f);
123 EXPECT_EQ(first, other);
124 }
125
126 {
127 Optional<std::string> first("foo");
128 Optional<std::string> other(first);
129
130 EXPECT_TRUE(other);
131 EXPECT_EQ(other.value(), "foo");
132 EXPECT_EQ(first, other);
133 }
134
135 {
136 Optional<TestObject> first(TestObject(3, 0.1));
137 Optional<TestObject> other(first);
138
139 EXPECT_TRUE(!!other);
140 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
141 EXPECT_TRUE(first == other);
142 }
143 }
144
TEST(OptionalTest,ValueConstructor)145 TEST(OptionalTest, ValueConstructor) {
146 {
147 constexpr float value = 0.1f;
148 constexpr Optional<float> o(value);
149
150 EXPECT_TRUE(o);
151 EXPECT_EQ(value, o.value());
152 }
153
154 {
155 std::string value("foo");
156 Optional<std::string> o(value);
157
158 EXPECT_TRUE(o);
159 EXPECT_EQ(value, o.value());
160 }
161
162 {
163 TestObject value(3, 0.1);
164 Optional<TestObject> o(value);
165
166 EXPECT_TRUE(o);
167 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
168 EXPECT_EQ(value, o.value());
169 }
170 }
171
TEST(OptionalTest,MoveConstructor)172 TEST(OptionalTest, MoveConstructor) {
173 {
174 Optional<float> first(0.1f);
175 Optional<float> second(std::move(first));
176
177 EXPECT_TRUE(second);
178 EXPECT_EQ(second.value(), 0.1f);
179
180 EXPECT_TRUE(first);
181 }
182
183 {
184 Optional<std::string> first("foo");
185 Optional<std::string> second(std::move(first));
186
187 EXPECT_TRUE(second);
188 EXPECT_EQ("foo", second.value());
189
190 EXPECT_TRUE(first);
191 }
192
193 {
194 Optional<TestObject> first(TestObject(3, 0.1));
195 Optional<TestObject> second(std::move(first));
196
197 EXPECT_TRUE(!!second);
198 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
199 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
200
201 EXPECT_TRUE(!!first);
202 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
203 }
204 }
205
TEST(OptionalTest,MoveValueConstructor)206 TEST(OptionalTest, MoveValueConstructor) {
207 {
208 float value = 0.1f;
209 Optional<float> o(std::move(value));
210
211 EXPECT_TRUE(o);
212 EXPECT_EQ(0.1f, o.value());
213 }
214
215 {
216 std::string value("foo");
217 Optional<std::string> o(std::move(value));
218
219 EXPECT_TRUE(o);
220 EXPECT_EQ("foo", o.value());
221 }
222
223 {
224 TestObject value(3, 0.1);
225 Optional<TestObject> o(std::move(value));
226
227 EXPECT_TRUE(o);
228 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
229 EXPECT_EQ(TestObject(3, 0.1), o.value());
230 }
231 }
232
TEST(OptionalTest,ConstructorForwardArguments)233 TEST(OptionalTest, ConstructorForwardArguments) {
234 {
235 Optional<float> a(base::in_place, 0.1f);
236 EXPECT_TRUE(a);
237 EXPECT_EQ(0.1f, a.value());
238 }
239
240 {
241 Optional<std::string> a(base::in_place, "foo");
242 EXPECT_TRUE(a);
243 EXPECT_EQ("foo", a.value());
244 }
245
246 {
247 Optional<TestObject> a(base::in_place, 0, 0.1);
248 EXPECT_TRUE(!!a);
249 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
250 }
251 }
252
TEST(OptionalTest,NulloptConstructor)253 TEST(OptionalTest, NulloptConstructor) {
254 constexpr Optional<int> a(base::nullopt);
255 EXPECT_FALSE(a);
256 }
257
TEST(OptionalTest,AssignValue)258 TEST(OptionalTest, AssignValue) {
259 {
260 Optional<float> a;
261 EXPECT_FALSE(a);
262 a = 0.1f;
263 EXPECT_TRUE(a);
264
265 Optional<float> b(0.1f);
266 EXPECT_TRUE(a == b);
267 }
268
269 {
270 Optional<std::string> a;
271 EXPECT_FALSE(a);
272 a = std::string("foo");
273 EXPECT_TRUE(a);
274
275 Optional<std::string> b(std::string("foo"));
276 EXPECT_EQ(a, b);
277 }
278
279 {
280 Optional<TestObject> a;
281 EXPECT_FALSE(!!a);
282 a = TestObject(3, 0.1);
283 EXPECT_TRUE(!!a);
284
285 Optional<TestObject> b(TestObject(3, 0.1));
286 EXPECT_TRUE(a == b);
287 }
288
289 {
290 Optional<TestObject> a = TestObject(4, 1.0);
291 EXPECT_TRUE(!!a);
292 a = TestObject(3, 0.1);
293 EXPECT_TRUE(!!a);
294
295 Optional<TestObject> b(TestObject(3, 0.1));
296 EXPECT_TRUE(a == b);
297 }
298 }
299
TEST(OptionalTest,AssignObject)300 TEST(OptionalTest, AssignObject) {
301 {
302 Optional<float> a;
303 Optional<float> b(0.1f);
304 a = b;
305
306 EXPECT_TRUE(a);
307 EXPECT_EQ(a.value(), 0.1f);
308 EXPECT_EQ(a, b);
309 }
310
311 {
312 Optional<std::string> a;
313 Optional<std::string> b("foo");
314 a = b;
315
316 EXPECT_TRUE(a);
317 EXPECT_EQ(a.value(), "foo");
318 EXPECT_EQ(a, b);
319 }
320
321 {
322 Optional<TestObject> a;
323 Optional<TestObject> b(TestObject(3, 0.1));
324 a = b;
325
326 EXPECT_TRUE(!!a);
327 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
328 EXPECT_TRUE(a == b);
329 }
330
331 {
332 Optional<TestObject> a(TestObject(4, 1.0));
333 Optional<TestObject> b(TestObject(3, 0.1));
334 a = b;
335
336 EXPECT_TRUE(!!a);
337 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
338 EXPECT_TRUE(a == b);
339 }
340 }
341
TEST(OptionalTest,AssignObject_rvalue)342 TEST(OptionalTest, AssignObject_rvalue) {
343 {
344 Optional<float> a;
345 Optional<float> b(0.1f);
346 a = std::move(b);
347
348 EXPECT_TRUE(a);
349 EXPECT_TRUE(b);
350 EXPECT_EQ(0.1f, a.value());
351 }
352
353 {
354 Optional<std::string> a;
355 Optional<std::string> b("foo");
356 a = std::move(b);
357
358 EXPECT_TRUE(a);
359 EXPECT_TRUE(b);
360 EXPECT_EQ("foo", a.value());
361 }
362
363 {
364 Optional<TestObject> a;
365 Optional<TestObject> b(TestObject(3, 0.1));
366 a = std::move(b);
367
368 EXPECT_TRUE(!!a);
369 EXPECT_TRUE(!!b);
370 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
371
372 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
373 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
374 }
375
376 {
377 Optional<TestObject> a(TestObject(4, 1.0));
378 Optional<TestObject> b(TestObject(3, 0.1));
379 a = std::move(b);
380
381 EXPECT_TRUE(!!a);
382 EXPECT_TRUE(!!b);
383 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
384
385 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
386 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
387 }
388 }
389
TEST(OptionalTest,AssignNull)390 TEST(OptionalTest, AssignNull) {
391 {
392 Optional<float> a(0.1f);
393 Optional<float> b(0.2f);
394 a = base::nullopt;
395 b = base::nullopt;
396 EXPECT_EQ(a, b);
397 }
398
399 {
400 Optional<std::string> a("foo");
401 Optional<std::string> b("bar");
402 a = base::nullopt;
403 b = base::nullopt;
404 EXPECT_EQ(a, b);
405 }
406
407 {
408 Optional<TestObject> a(TestObject(3, 0.1));
409 Optional<TestObject> b(TestObject(4, 1.0));
410 a = base::nullopt;
411 b = base::nullopt;
412 EXPECT_TRUE(a == b);
413 }
414 }
415
TEST(OptionalTest,OperatorStar)416 TEST(OptionalTest, OperatorStar) {
417 {
418 Optional<float> a(0.1f);
419 EXPECT_EQ(a.value(), *a);
420 }
421
422 {
423 Optional<std::string> a("foo");
424 EXPECT_EQ(a.value(), *a);
425 }
426
427 {
428 Optional<TestObject> a(TestObject(3, 0.1));
429 EXPECT_EQ(a.value(), *a);
430 }
431 }
432
TEST(OptionalTest,OperatorStar_rvalue)433 TEST(OptionalTest, OperatorStar_rvalue) {
434 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
435 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
436 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
437 }
438
TEST(OptionalTest,OperatorArrow)439 TEST(OptionalTest, OperatorArrow) {
440 Optional<TestObject> a(TestObject(3, 0.1));
441 EXPECT_EQ(a->foo(), 3);
442 }
443
TEST(OptionalTest,Value_rvalue)444 TEST(OptionalTest, Value_rvalue) {
445 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
446 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
447 EXPECT_TRUE(TestObject(3, 0.1) ==
448 Optional<TestObject>(TestObject(3, 0.1)).value());
449 }
450
TEST(OptionalTest,ValueOr)451 TEST(OptionalTest, ValueOr) {
452 {
453 Optional<float> a;
454 EXPECT_EQ(0.0f, a.value_or(0.0f));
455
456 a = 0.1f;
457 EXPECT_EQ(0.1f, a.value_or(0.0f));
458
459 a = base::nullopt;
460 EXPECT_EQ(0.0f, a.value_or(0.0f));
461 }
462
463 {
464 Optional<std::string> a;
465 EXPECT_EQ("bar", a.value_or("bar"));
466
467 a = std::string("foo");
468 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
469
470 a = base::nullopt;
471 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
472 }
473
474 {
475 Optional<TestObject> a;
476 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
477
478 a = TestObject(3, 0.1);
479 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
480
481 a = base::nullopt;
482 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
483 }
484 }
485
TEST(OptionalTest,Swap_bothNoValue)486 TEST(OptionalTest, Swap_bothNoValue) {
487 Optional<TestObject> a, b;
488 a.swap(b);
489
490 EXPECT_FALSE(a);
491 EXPECT_FALSE(b);
492 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
493 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
494 }
495
TEST(OptionalTest,Swap_inHasValue)496 TEST(OptionalTest, Swap_inHasValue) {
497 Optional<TestObject> a(TestObject(1, 0.3));
498 Optional<TestObject> b;
499 a.swap(b);
500
501 EXPECT_FALSE(a);
502
503 EXPECT_TRUE(!!b);
504 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
505 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
506 }
507
TEST(OptionalTest,Swap_outHasValue)508 TEST(OptionalTest, Swap_outHasValue) {
509 Optional<TestObject> a;
510 Optional<TestObject> b(TestObject(1, 0.3));
511 a.swap(b);
512
513 EXPECT_TRUE(!!a);
514 EXPECT_FALSE(!!b);
515 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
516 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
517 }
518
TEST(OptionalTest,Swap_bothValue)519 TEST(OptionalTest, Swap_bothValue) {
520 Optional<TestObject> a(TestObject(0, 0.1));
521 Optional<TestObject> b(TestObject(1, 0.3));
522 a.swap(b);
523
524 EXPECT_TRUE(!!a);
525 EXPECT_TRUE(!!b);
526 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
527 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
528 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
529 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
530 }
531
TEST(OptionalTest,Emplace)532 TEST(OptionalTest, Emplace) {
533 {
534 Optional<float> a(0.1f);
535 a.emplace(0.3f);
536
537 EXPECT_TRUE(a);
538 EXPECT_EQ(0.3f, a.value());
539 }
540
541 {
542 Optional<std::string> a("foo");
543 a.emplace("bar");
544
545 EXPECT_TRUE(a);
546 EXPECT_EQ("bar", a.value());
547 }
548
549 {
550 Optional<TestObject> a(TestObject(0, 0.1));
551 a.emplace(TestObject(1, 0.2));
552
553 EXPECT_TRUE(!!a);
554 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
555 }
556 }
557
TEST(OptionalTest,Equals_TwoEmpty)558 TEST(OptionalTest, Equals_TwoEmpty) {
559 Optional<int> a;
560 Optional<int> b;
561
562 EXPECT_TRUE(a == b);
563 }
564
TEST(OptionalTest,Equals_TwoEquals)565 TEST(OptionalTest, Equals_TwoEquals) {
566 Optional<int> a(1);
567 Optional<int> b(1);
568
569 EXPECT_TRUE(a == b);
570 }
571
TEST(OptionalTest,Equals_OneEmpty)572 TEST(OptionalTest, Equals_OneEmpty) {
573 Optional<int> a;
574 Optional<int> b(1);
575
576 EXPECT_FALSE(a == b);
577 }
578
TEST(OptionalTest,Equals_TwoDifferent)579 TEST(OptionalTest, Equals_TwoDifferent) {
580 Optional<int> a(0);
581 Optional<int> b(1);
582
583 EXPECT_FALSE(a == b);
584 }
585
TEST(OptionalTest,NotEquals_TwoEmpty)586 TEST(OptionalTest, NotEquals_TwoEmpty) {
587 Optional<int> a;
588 Optional<int> b;
589
590 EXPECT_FALSE(a != b);
591 }
592
TEST(OptionalTest,NotEquals_TwoEquals)593 TEST(OptionalTest, NotEquals_TwoEquals) {
594 Optional<int> a(1);
595 Optional<int> b(1);
596
597 EXPECT_FALSE(a != b);
598 }
599
TEST(OptionalTest,NotEquals_OneEmpty)600 TEST(OptionalTest, NotEquals_OneEmpty) {
601 Optional<int> a;
602 Optional<int> b(1);
603
604 EXPECT_TRUE(a != b);
605 }
606
TEST(OptionalTest,NotEquals_TwoDifferent)607 TEST(OptionalTest, NotEquals_TwoDifferent) {
608 Optional<int> a(0);
609 Optional<int> b(1);
610
611 EXPECT_TRUE(a != b);
612 }
613
TEST(OptionalTest,Less_LeftEmpty)614 TEST(OptionalTest, Less_LeftEmpty) {
615 Optional<int> l;
616 Optional<int> r(1);
617
618 EXPECT_TRUE(l < r);
619 }
620
TEST(OptionalTest,Less_RightEmpty)621 TEST(OptionalTest, Less_RightEmpty) {
622 Optional<int> l(1);
623 Optional<int> r;
624
625 EXPECT_FALSE(l < r);
626 }
627
TEST(OptionalTest,Less_BothEmpty)628 TEST(OptionalTest, Less_BothEmpty) {
629 Optional<int> l;
630 Optional<int> r;
631
632 EXPECT_FALSE(l < r);
633 }
634
TEST(OptionalTest,Less_BothValues)635 TEST(OptionalTest, Less_BothValues) {
636 {
637 Optional<int> l(1);
638 Optional<int> r(2);
639
640 EXPECT_TRUE(l < r);
641 }
642 {
643 Optional<int> l(2);
644 Optional<int> r(1);
645
646 EXPECT_FALSE(l < r);
647 }
648 {
649 Optional<int> l(1);
650 Optional<int> r(1);
651
652 EXPECT_FALSE(l < r);
653 }
654 }
655
TEST(OptionalTest,LessEq_LeftEmpty)656 TEST(OptionalTest, LessEq_LeftEmpty) {
657 Optional<int> l;
658 Optional<int> r(1);
659
660 EXPECT_TRUE(l <= r);
661 }
662
TEST(OptionalTest,LessEq_RightEmpty)663 TEST(OptionalTest, LessEq_RightEmpty) {
664 Optional<int> l(1);
665 Optional<int> r;
666
667 EXPECT_FALSE(l <= r);
668 }
669
TEST(OptionalTest,LessEq_BothEmpty)670 TEST(OptionalTest, LessEq_BothEmpty) {
671 Optional<int> l;
672 Optional<int> r;
673
674 EXPECT_TRUE(l <= r);
675 }
676
TEST(OptionalTest,LessEq_BothValues)677 TEST(OptionalTest, LessEq_BothValues) {
678 {
679 Optional<int> l(1);
680 Optional<int> r(2);
681
682 EXPECT_TRUE(l <= r);
683 }
684 {
685 Optional<int> l(2);
686 Optional<int> r(1);
687
688 EXPECT_FALSE(l <= r);
689 }
690 {
691 Optional<int> l(1);
692 Optional<int> r(1);
693
694 EXPECT_TRUE(l <= r);
695 }
696 }
697
TEST(OptionalTest,Greater_BothEmpty)698 TEST(OptionalTest, Greater_BothEmpty) {
699 Optional<int> l;
700 Optional<int> r;
701
702 EXPECT_FALSE(l > r);
703 }
704
TEST(OptionalTest,Greater_LeftEmpty)705 TEST(OptionalTest, Greater_LeftEmpty) {
706 Optional<int> l;
707 Optional<int> r(1);
708
709 EXPECT_FALSE(l > r);
710 }
711
TEST(OptionalTest,Greater_RightEmpty)712 TEST(OptionalTest, Greater_RightEmpty) {
713 Optional<int> l(1);
714 Optional<int> r;
715
716 EXPECT_TRUE(l > r);
717 }
718
TEST(OptionalTest,Greater_BothValue)719 TEST(OptionalTest, Greater_BothValue) {
720 {
721 Optional<int> l(1);
722 Optional<int> r(2);
723
724 EXPECT_FALSE(l > r);
725 }
726 {
727 Optional<int> l(2);
728 Optional<int> r(1);
729
730 EXPECT_TRUE(l > r);
731 }
732 {
733 Optional<int> l(1);
734 Optional<int> r(1);
735
736 EXPECT_FALSE(l > r);
737 }
738 }
739
TEST(OptionalTest,GreaterEq_BothEmpty)740 TEST(OptionalTest, GreaterEq_BothEmpty) {
741 Optional<int> l;
742 Optional<int> r;
743
744 EXPECT_TRUE(l >= r);
745 }
746
TEST(OptionalTest,GreaterEq_LeftEmpty)747 TEST(OptionalTest, GreaterEq_LeftEmpty) {
748 Optional<int> l;
749 Optional<int> r(1);
750
751 EXPECT_FALSE(l >= r);
752 }
753
TEST(OptionalTest,GreaterEq_RightEmpty)754 TEST(OptionalTest, GreaterEq_RightEmpty) {
755 Optional<int> l(1);
756 Optional<int> r;
757
758 EXPECT_TRUE(l >= r);
759 }
760
TEST(OptionalTest,GreaterEq_BothValue)761 TEST(OptionalTest, GreaterEq_BothValue) {
762 {
763 Optional<int> l(1);
764 Optional<int> r(2);
765
766 EXPECT_FALSE(l >= r);
767 }
768 {
769 Optional<int> l(2);
770 Optional<int> r(1);
771
772 EXPECT_TRUE(l >= r);
773 }
774 {
775 Optional<int> l(1);
776 Optional<int> r(1);
777
778 EXPECT_TRUE(l >= r);
779 }
780 }
781
TEST(OptionalTest,OptNullEq)782 TEST(OptionalTest, OptNullEq) {
783 {
784 Optional<int> opt;
785 EXPECT_TRUE(opt == base::nullopt);
786 }
787 {
788 Optional<int> opt(1);
789 EXPECT_FALSE(opt == base::nullopt);
790 }
791 }
792
TEST(OptionalTest,NullOptEq)793 TEST(OptionalTest, NullOptEq) {
794 {
795 Optional<int> opt;
796 EXPECT_TRUE(base::nullopt == opt);
797 }
798 {
799 Optional<int> opt(1);
800 EXPECT_FALSE(base::nullopt == opt);
801 }
802 }
803
TEST(OptionalTest,OptNullNotEq)804 TEST(OptionalTest, OptNullNotEq) {
805 {
806 Optional<int> opt;
807 EXPECT_FALSE(opt != base::nullopt);
808 }
809 {
810 Optional<int> opt(1);
811 EXPECT_TRUE(opt != base::nullopt);
812 }
813 }
814
TEST(OptionalTest,NullOptNotEq)815 TEST(OptionalTest, NullOptNotEq) {
816 {
817 Optional<int> opt;
818 EXPECT_FALSE(base::nullopt != opt);
819 }
820 {
821 Optional<int> opt(1);
822 EXPECT_TRUE(base::nullopt != opt);
823 }
824 }
825
TEST(OptionalTest,OptNullLower)826 TEST(OptionalTest, OptNullLower) {
827 {
828 Optional<int> opt;
829 EXPECT_FALSE(opt < base::nullopt);
830 }
831 {
832 Optional<int> opt(1);
833 EXPECT_FALSE(opt < base::nullopt);
834 }
835 }
836
TEST(OptionalTest,NullOptLower)837 TEST(OptionalTest, NullOptLower) {
838 {
839 Optional<int> opt;
840 EXPECT_FALSE(base::nullopt < opt);
841 }
842 {
843 Optional<int> opt(1);
844 EXPECT_TRUE(base::nullopt < opt);
845 }
846 }
847
TEST(OptionalTest,OptNullLowerEq)848 TEST(OptionalTest, OptNullLowerEq) {
849 {
850 Optional<int> opt;
851 EXPECT_TRUE(opt <= base::nullopt);
852 }
853 {
854 Optional<int> opt(1);
855 EXPECT_FALSE(opt <= base::nullopt);
856 }
857 }
858
TEST(OptionalTest,NullOptLowerEq)859 TEST(OptionalTest, NullOptLowerEq) {
860 {
861 Optional<int> opt;
862 EXPECT_TRUE(base::nullopt <= opt);
863 }
864 {
865 Optional<int> opt(1);
866 EXPECT_TRUE(base::nullopt <= opt);
867 }
868 }
869
TEST(OptionalTest,OptNullGreater)870 TEST(OptionalTest, OptNullGreater) {
871 {
872 Optional<int> opt;
873 EXPECT_FALSE(opt > base::nullopt);
874 }
875 {
876 Optional<int> opt(1);
877 EXPECT_TRUE(opt > base::nullopt);
878 }
879 }
880
TEST(OptionalTest,NullOptGreater)881 TEST(OptionalTest, NullOptGreater) {
882 {
883 Optional<int> opt;
884 EXPECT_FALSE(base::nullopt > opt);
885 }
886 {
887 Optional<int> opt(1);
888 EXPECT_FALSE(base::nullopt > opt);
889 }
890 }
891
TEST(OptionalTest,OptNullGreaterEq)892 TEST(OptionalTest, OptNullGreaterEq) {
893 {
894 Optional<int> opt;
895 EXPECT_TRUE(opt >= base::nullopt);
896 }
897 {
898 Optional<int> opt(1);
899 EXPECT_TRUE(opt >= base::nullopt);
900 }
901 }
902
TEST(OptionalTest,NullOptGreaterEq)903 TEST(OptionalTest, NullOptGreaterEq) {
904 {
905 Optional<int> opt;
906 EXPECT_TRUE(base::nullopt >= opt);
907 }
908 {
909 Optional<int> opt(1);
910 EXPECT_FALSE(base::nullopt >= opt);
911 }
912 }
913
TEST(OptionalTest,ValueEq_Empty)914 TEST(OptionalTest, ValueEq_Empty) {
915 Optional<int> opt;
916 EXPECT_FALSE(opt == 1);
917 }
918
TEST(OptionalTest,ValueEq_NotEmpty)919 TEST(OptionalTest, ValueEq_NotEmpty) {
920 {
921 Optional<int> opt(0);
922 EXPECT_FALSE(opt == 1);
923 }
924 {
925 Optional<int> opt(1);
926 EXPECT_TRUE(opt == 1);
927 }
928 }
929
TEST(OptionalTest,EqValue_Empty)930 TEST(OptionalTest, EqValue_Empty) {
931 Optional<int> opt;
932 EXPECT_FALSE(1 == opt);
933 }
934
TEST(OptionalTest,EqValue_NotEmpty)935 TEST(OptionalTest, EqValue_NotEmpty) {
936 {
937 Optional<int> opt(0);
938 EXPECT_FALSE(1 == opt);
939 }
940 {
941 Optional<int> opt(1);
942 EXPECT_TRUE(1 == opt);
943 }
944 }
945
TEST(OptionalTest,ValueNotEq_Empty)946 TEST(OptionalTest, ValueNotEq_Empty) {
947 Optional<int> opt;
948 EXPECT_TRUE(opt != 1);
949 }
950
TEST(OptionalTest,ValueNotEq_NotEmpty)951 TEST(OptionalTest, ValueNotEq_NotEmpty) {
952 {
953 Optional<int> opt(0);
954 EXPECT_TRUE(opt != 1);
955 }
956 {
957 Optional<int> opt(1);
958 EXPECT_FALSE(opt != 1);
959 }
960 }
961
TEST(OptionalTest,NotEqValue_Empty)962 TEST(OptionalTest, NotEqValue_Empty) {
963 Optional<int> opt;
964 EXPECT_TRUE(1 != opt);
965 }
966
TEST(OptionalTest,NotEqValue_NotEmpty)967 TEST(OptionalTest, NotEqValue_NotEmpty) {
968 {
969 Optional<int> opt(0);
970 EXPECT_TRUE(1 != opt);
971 }
972 {
973 Optional<int> opt(1);
974 EXPECT_FALSE(1 != opt);
975 }
976 }
977
TEST(OptionalTest,ValueLess_Empty)978 TEST(OptionalTest, ValueLess_Empty) {
979 Optional<int> opt;
980 EXPECT_TRUE(opt < 1);
981 }
982
TEST(OptionalTest,ValueLess_NotEmpty)983 TEST(OptionalTest, ValueLess_NotEmpty) {
984 {
985 Optional<int> opt(0);
986 EXPECT_TRUE(opt < 1);
987 }
988 {
989 Optional<int> opt(1);
990 EXPECT_FALSE(opt < 1);
991 }
992 {
993 Optional<int> opt(2);
994 EXPECT_FALSE(opt < 1);
995 }
996 }
997
TEST(OptionalTest,LessValue_Empty)998 TEST(OptionalTest, LessValue_Empty) {
999 Optional<int> opt;
1000 EXPECT_FALSE(1 < opt);
1001 }
1002
TEST(OptionalTest,LessValue_NotEmpty)1003 TEST(OptionalTest, LessValue_NotEmpty) {
1004 {
1005 Optional<int> opt(0);
1006 EXPECT_FALSE(1 < opt);
1007 }
1008 {
1009 Optional<int> opt(1);
1010 EXPECT_FALSE(1 < opt);
1011 }
1012 {
1013 Optional<int> opt(2);
1014 EXPECT_TRUE(1 < opt);
1015 }
1016 }
1017
TEST(OptionalTest,ValueLessEq_Empty)1018 TEST(OptionalTest, ValueLessEq_Empty) {
1019 Optional<int> opt;
1020 EXPECT_TRUE(opt <= 1);
1021 }
1022
TEST(OptionalTest,ValueLessEq_NotEmpty)1023 TEST(OptionalTest, ValueLessEq_NotEmpty) {
1024 {
1025 Optional<int> opt(0);
1026 EXPECT_TRUE(opt <= 1);
1027 }
1028 {
1029 Optional<int> opt(1);
1030 EXPECT_TRUE(opt <= 1);
1031 }
1032 {
1033 Optional<int> opt(2);
1034 EXPECT_FALSE(opt <= 1);
1035 }
1036 }
1037
TEST(OptionalTest,LessEqValue_Empty)1038 TEST(OptionalTest, LessEqValue_Empty) {
1039 Optional<int> opt;
1040 EXPECT_FALSE(1 <= opt);
1041 }
1042
TEST(OptionalTest,LessEqValue_NotEmpty)1043 TEST(OptionalTest, LessEqValue_NotEmpty) {
1044 {
1045 Optional<int> opt(0);
1046 EXPECT_FALSE(1 <= opt);
1047 }
1048 {
1049 Optional<int> opt(1);
1050 EXPECT_TRUE(1 <= opt);
1051 }
1052 {
1053 Optional<int> opt(2);
1054 EXPECT_TRUE(1 <= opt);
1055 }
1056 }
1057
TEST(OptionalTest,ValueGreater_Empty)1058 TEST(OptionalTest, ValueGreater_Empty) {
1059 Optional<int> opt;
1060 EXPECT_FALSE(opt > 1);
1061 }
1062
TEST(OptionalTest,ValueGreater_NotEmpty)1063 TEST(OptionalTest, ValueGreater_NotEmpty) {
1064 {
1065 Optional<int> opt(0);
1066 EXPECT_FALSE(opt > 1);
1067 }
1068 {
1069 Optional<int> opt(1);
1070 EXPECT_FALSE(opt > 1);
1071 }
1072 {
1073 Optional<int> opt(2);
1074 EXPECT_TRUE(opt > 1);
1075 }
1076 }
1077
TEST(OptionalTest,GreaterValue_Empty)1078 TEST(OptionalTest, GreaterValue_Empty) {
1079 Optional<int> opt;
1080 EXPECT_TRUE(1 > opt);
1081 }
1082
TEST(OptionalTest,GreaterValue_NotEmpty)1083 TEST(OptionalTest, GreaterValue_NotEmpty) {
1084 {
1085 Optional<int> opt(0);
1086 EXPECT_TRUE(1 > opt);
1087 }
1088 {
1089 Optional<int> opt(1);
1090 EXPECT_FALSE(1 > opt);
1091 }
1092 {
1093 Optional<int> opt(2);
1094 EXPECT_FALSE(1 > opt);
1095 }
1096 }
1097
TEST(OptionalTest,ValueGreaterEq_Empty)1098 TEST(OptionalTest, ValueGreaterEq_Empty) {
1099 Optional<int> opt;
1100 EXPECT_FALSE(opt >= 1);
1101 }
1102
TEST(OptionalTest,ValueGreaterEq_NotEmpty)1103 TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1104 {
1105 Optional<int> opt(0);
1106 EXPECT_FALSE(opt >= 1);
1107 }
1108 {
1109 Optional<int> opt(1);
1110 EXPECT_TRUE(opt >= 1);
1111 }
1112 {
1113 Optional<int> opt(2);
1114 EXPECT_TRUE(opt >= 1);
1115 }
1116 }
1117
TEST(OptionalTest,GreaterEqValue_Empty)1118 TEST(OptionalTest, GreaterEqValue_Empty) {
1119 Optional<int> opt;
1120 EXPECT_TRUE(1 >= opt);
1121 }
1122
TEST(OptionalTest,GreaterEqValue_NotEmpty)1123 TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1124 {
1125 Optional<int> opt(0);
1126 EXPECT_TRUE(1 >= opt);
1127 }
1128 {
1129 Optional<int> opt(1);
1130 EXPECT_TRUE(1 >= opt);
1131 }
1132 {
1133 Optional<int> opt(2);
1134 EXPECT_FALSE(1 >= opt);
1135 }
1136 }
1137
TEST(OptionalTest,NotEquals)1138 TEST(OptionalTest, NotEquals) {
1139 {
1140 Optional<float> a(0.1f);
1141 Optional<float> b(0.2f);
1142 EXPECT_NE(a, b);
1143 }
1144
1145 {
1146 Optional<std::string> a("foo");
1147 Optional<std::string> b("bar");
1148 EXPECT_NE(a, b);
1149 }
1150
1151 {
1152 Optional<TestObject> a(TestObject(3, 0.1));
1153 Optional<TestObject> b(TestObject(4, 1.0));
1154 EXPECT_TRUE(a != b);
1155 }
1156 }
1157
TEST(OptionalTest,NotEqualsNull)1158 TEST(OptionalTest, NotEqualsNull) {
1159 {
1160 Optional<float> a(0.1f);
1161 Optional<float> b(0.1f);
1162 b = base::nullopt;
1163 EXPECT_NE(a, b);
1164 }
1165
1166 {
1167 Optional<std::string> a("foo");
1168 Optional<std::string> b("foo");
1169 b = base::nullopt;
1170 EXPECT_NE(a, b);
1171 }
1172
1173 {
1174 Optional<TestObject> a(TestObject(3, 0.1));
1175 Optional<TestObject> b(TestObject(3, 0.1));
1176 b = base::nullopt;
1177 EXPECT_TRUE(a != b);
1178 }
1179 }
1180
TEST(OptionalTest,MakeOptional)1181 TEST(OptionalTest, MakeOptional) {
1182 {
1183 Optional<float> o = base::make_optional(32.f);
1184 EXPECT_TRUE(o);
1185 EXPECT_EQ(32.f, *o);
1186
1187 float value = 3.f;
1188 o = base::make_optional(std::move(value));
1189 EXPECT_TRUE(o);
1190 EXPECT_EQ(3.f, *o);
1191 }
1192
1193 {
1194 Optional<std::string> o = base::make_optional(std::string("foo"));
1195 EXPECT_TRUE(o);
1196 EXPECT_EQ("foo", *o);
1197
1198 std::string value = "bar";
1199 o = base::make_optional(std::move(value));
1200 EXPECT_TRUE(o);
1201 EXPECT_EQ(std::string("bar"), *o);
1202 }
1203
1204 {
1205 Optional<TestObject> o = base::make_optional(TestObject(3, 0.1));
1206 EXPECT_TRUE(!!o);
1207 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1208
1209 TestObject value = TestObject(0, 0.42);
1210 o = base::make_optional(std::move(value));
1211 EXPECT_TRUE(!!o);
1212 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1213 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
1214 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
1215
1216 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1217 base::make_optional(std::move(value))->state());
1218 }
1219 }
1220
TEST(OptionalTest,NonMemberSwap_bothNoValue)1221 TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1222 Optional<TestObject> a, b;
1223 base::swap(a, b);
1224
1225 EXPECT_FALSE(!!a);
1226 EXPECT_FALSE(!!b);
1227 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1228 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1229 }
1230
TEST(OptionalTest,NonMemberSwap_inHasValue)1231 TEST(OptionalTest, NonMemberSwap_inHasValue) {
1232 Optional<TestObject> a(TestObject(1, 0.3));
1233 Optional<TestObject> b;
1234 base::swap(a, b);
1235
1236 EXPECT_FALSE(!!a);
1237 EXPECT_TRUE(!!b);
1238 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1239 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1240 }
1241
TEST(OptionalTest,NonMemberSwap_outHasValue)1242 TEST(OptionalTest, NonMemberSwap_outHasValue) {
1243 Optional<TestObject> a;
1244 Optional<TestObject> b(TestObject(1, 0.3));
1245 base::swap(a, b);
1246
1247 EXPECT_TRUE(!!a);
1248 EXPECT_FALSE(!!b);
1249 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1250 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1251 }
1252
TEST(OptionalTest,NonMemberSwap_bothValue)1253 TEST(OptionalTest, NonMemberSwap_bothValue) {
1254 Optional<TestObject> a(TestObject(0, 0.1));
1255 Optional<TestObject> b(TestObject(1, 0.3));
1256 base::swap(a, b);
1257
1258 EXPECT_TRUE(!!a);
1259 EXPECT_TRUE(!!b);
1260 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1261 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
1262 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1263 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
1264 }
1265
TEST(OptionalTest,Hash_OptionalReflectsInternal)1266 TEST(OptionalTest, Hash_OptionalReflectsInternal) {
1267 {
1268 std::hash<int> int_hash;
1269 std::hash<Optional<int>> opt_int_hash;
1270
1271 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
1272 }
1273
1274 {
1275 std::hash<std::string> str_hash;
1276 std::hash<Optional<std::string>> opt_str_hash;
1277
1278 EXPECT_EQ(str_hash(std::string("foobar")),
1279 opt_str_hash(Optional<std::string>(std::string("foobar"))));
1280 }
1281 }
1282
TEST(OptionalTest,Hash_NullOptEqualsNullOpt)1283 TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
1284 std::hash<Optional<int>> opt_int_hash;
1285 std::hash<Optional<std::string>> opt_str_hash;
1286
1287 EXPECT_EQ(opt_str_hash(Optional<std::string>()),
1288 opt_int_hash(Optional<int>()));
1289 }
1290
TEST(OptionalTest,Hash_UseInSet)1291 TEST(OptionalTest, Hash_UseInSet) {
1292 std::set<Optional<int>> setOptInt;
1293
1294 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
1295
1296 setOptInt.insert(Optional<int>(3));
1297 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
1298 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
1299 }
1300
TEST(OptionalTest,HasValue)1301 TEST(OptionalTest, HasValue) {
1302 Optional<int> a;
1303 EXPECT_FALSE(a.has_value());
1304
1305 a = 42;
1306 EXPECT_TRUE(a.has_value());
1307
1308 a = nullopt;
1309 EXPECT_FALSE(a.has_value());
1310
1311 a = 0;
1312 EXPECT_TRUE(a.has_value());
1313
1314 a = Optional<int>();
1315 EXPECT_FALSE(a.has_value());
1316 }
1317
TEST(OptionalTest,Reset_int)1318 TEST(OptionalTest, Reset_int) {
1319 Optional<int> a(0);
1320 EXPECT_TRUE(a.has_value());
1321 EXPECT_EQ(0, a.value());
1322
1323 a.reset();
1324 EXPECT_FALSE(a.has_value());
1325 EXPECT_EQ(-1, a.value_or(-1));
1326 }
1327
TEST(OptionalTest,Reset_Object)1328 TEST(OptionalTest, Reset_Object) {
1329 Optional<TestObject> a(TestObject(0, 0.1));
1330 EXPECT_TRUE(a.has_value());
1331 EXPECT_EQ(TestObject(0, 0.1), a.value());
1332
1333 a.reset();
1334 EXPECT_FALSE(a.has_value());
1335 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
1336 }
1337
TEST(OptionalTest,Reset_NoOp)1338 TEST(OptionalTest, Reset_NoOp) {
1339 Optional<int> a;
1340 EXPECT_FALSE(a.has_value());
1341
1342 a.reset();
1343 EXPECT_FALSE(a.has_value());
1344 }
1345
1346 } // namespace base
1347