Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: base/optional_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698