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

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: review comments Created 4 years, 9 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
« base/optional.h ('K') | « base/optional.h ('k') | no next file » | 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, ValueConstructor) {
82 {
83 Optional<float> o(0.1f);
84 EXPECT_TRUE(o);
85 EXPECT_EQ(o.value(), 0.1f);
86 }
87
88 {
89 Optional<std::string> o("foo");
90 EXPECT_TRUE(o);
91 EXPECT_EQ(o.value(), "foo");
92 }
93
94 {
95 Optional<TestObject> o(TestObject(3, 0.1));
96 EXPECT_TRUE(o);
97 EXPECT_EQ(o.value(), TestObject(3, 0.1));
98 }
99 }
100
101 TEST(OptionalTest, CopyConstructor) {
102 {
103 Optional<float> first(0.1f);
104 Optional<float> other(first);
105
106 EXPECT_TRUE(other);
107 EXPECT_EQ(other.value(), 0.1f);
108 EXPECT_EQ(first, other);
109 }
110
111 {
112 Optional<std::string> first("foo");
113 Optional<std::string> other(first);
114
115 EXPECT_TRUE(other);
116 EXPECT_EQ(other.value(), "foo");
117 EXPECT_EQ(first, other);
118 }
119
120 {
121 Optional<TestObject> first(TestObject(3, 0.1));
122 Optional<TestObject> other(first);
123
124 EXPECT_TRUE(other);
125 EXPECT_EQ(other.value(), TestObject(3, 0.1));
126 EXPECT_EQ(first, other);
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_EQ(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_EQ(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_EQ(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 // Using |const char*| because |std::string| can't be assigned string
231 // literals because of the decay-only perfect forwarding assignment rule.
232 Optional<const char*> a;
233 EXPECT_FALSE(a);
234 a = "foo";
235 EXPECT_TRUE(a);
236
237 Optional<const char*> b("foo");
238 EXPECT_TRUE(a == b);
239 }
240
241 {
242 Optional<TestObject> a;
243 EXPECT_FALSE(a);
244 a = TestObject(3, 0.1);
245 EXPECT_TRUE(a);
246
247 Optional<TestObject> b(TestObject(3, 0.1));
248 EXPECT_TRUE(a == b);
249 }
250 }
251
252 TEST(OptionalTest, AssignObject) {
253 {
254 Optional<float> a;
255 Optional<float> b(0.1f);
256 a = b;
257
258 EXPECT_TRUE(a);
259 EXPECT_EQ(a.value(), 0.1f);
260 EXPECT_EQ(a, b);
261 }
262
263 {
264 Optional<std::string> a;
265 Optional<std::string> b("foo");
266 a = b;
267
268 EXPECT_TRUE(a);
269 EXPECT_EQ(a.value(), "foo");
270 EXPECT_EQ(a, b);
271 }
272
273 {
274 Optional<TestObject> a;
275 Optional<TestObject> b(TestObject(3, 0.1));
276 a = b;
277
278 EXPECT_TRUE(a);
279 EXPECT_EQ(a.value(), TestObject(3, 0.1));
280 EXPECT_EQ(a, b);
281 }
282 }
283
284 TEST(OptionalTest, AssignObject_rvalue) {
285 {
286 Optional<float> a;
287 Optional<float> b(0.1f);
288 a = std::move(b);
289
290 EXPECT_TRUE(a);
291 EXPECT_TRUE(b);
292 EXPECT_EQ(0.1f, a.value());
293 }
294
295 {
296 Optional<std::string> a;
297 Optional<std::string> b("foo");
298 a = std::move(b);
299
300 EXPECT_TRUE(a);
301 EXPECT_TRUE(b);
302 EXPECT_EQ("foo", a.value());
303 }
304
305 {
306 Optional<TestObject> a;
307 Optional<TestObject> b(TestObject(3, 0.1));
308 a = std::move(b);
309
310 EXPECT_TRUE(a);
311 EXPECT_TRUE(b);
312 EXPECT_EQ(TestObject(3, 0.1), a.value());
313
314 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
315 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
316 }
317 }
318
319 TEST(OptionalTest, OperatorStar) {
320 {
321 Optional<float> a(0.1f);
322 EXPECT_EQ(a.value(), *a);
323 }
324
325 {
326 Optional<std::string> a("foo");
327 EXPECT_EQ(a.value(), *a);
328 }
329
330 {
331 Optional<TestObject> a(TestObject(3, 0.1));
332 EXPECT_EQ(a.value(), *a);
333 }
334 }
335
336 TEST(OptionalTest, OperatorStar_rvalue) {
337 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
338 EXPECT_EQ("foo", *Optional<const char*>("foo"));
339 EXPECT_EQ(TestObject(3, 0.1), *Optional<TestObject>(TestObject(3, 0.1)));
340 }
341
342 TEST(OptionalTest, OperatorArrow) {
343 Optional<TestObject> a(TestObject(3, 0.1));
344 EXPECT_EQ(a->foo(), 3);
345 }
346
347 TEST(OptionalTest, Value_rvalue) {
348 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
349 EXPECT_EQ("foo", Optional<const char*>("foo").value());
350 EXPECT_EQ(TestObject(3, 0.1),
351 Optional<TestObject>(TestObject(3, 0.1)).value());
352 }
353
354 TEST(OptionalTest, ValueOr) {
355 {
356 Optional<float> a;
357 EXPECT_EQ(0.0f, a.value_or(0.0f));
358
359 a = 0.1f;
360 EXPECT_EQ(0.1f, a.value_or(0.0f));
361
362 a = base::nullopt;
363 EXPECT_EQ(0.0f, a.value_or(0.0f));
364 }
365
366 {
367 // Using |const char*| because |std::string| can't be assigned string
368 // literals because of the decay-only perfect forwarding assignment rule.
369 Optional<const char*> a;
370 EXPECT_EQ("bar", a.value_or("bar"));
371
372 a = "foo";
373 EXPECT_EQ("foo", a.value_or("bar"));
374
375 a = base::nullopt;
376 EXPECT_EQ("bar", a.value_or("bar"));
377 }
378
379 {
380 Optional<TestObject> a;
381 EXPECT_EQ(a.value_or(TestObject(1, 0.3)), TestObject(1, 0.3));
382
383 a = TestObject(3, 0.1);
384 EXPECT_EQ(a.value_or(TestObject(1, 0.3)), TestObject(3, 0.1));
385
386 a = base::nullopt;
387 EXPECT_EQ(a.value_or(TestObject(1, 0.3)), TestObject(1, 0.3));
388 }
389 }
390
391 TEST(OptionalTest, Swap_bothNoValue) {
392 Optional<TestObject> a, b;
393 a.swap(b);
394
395 EXPECT_FALSE(a);
396 EXPECT_FALSE(b);
397 EXPECT_EQ(TestObject(42, 0.42), a.value_or(TestObject(42, 0.42)));
398 EXPECT_EQ(TestObject(42, 0.42), b.value_or(TestObject(42, 0.42)));
399 }
400
401 TEST(OptionalTest, Swap_inHasValue) {
402 Optional<TestObject> a(TestObject(1, 0.3));
403 Optional<TestObject> b;
404 a.swap(b);
405
406 EXPECT_FALSE(a);
407
408 EXPECT_TRUE(b);
409 EXPECT_EQ(TestObject(42, 0.42), a.value_or(TestObject(42, 0.42)));
410 EXPECT_EQ(TestObject(1, 0.3), b.value_or(TestObject(42, 0.42)));
411 }
412
413 TEST(OptionalTest, Swap_outHasValue) {
414 Optional<TestObject> a;
415 Optional<TestObject> b(TestObject(1, 0.3));
416 a.swap(b);
417
418 EXPECT_TRUE(a);
419 EXPECT_FALSE(b);
420 EXPECT_EQ(TestObject(1, 0.3), a.value_or(TestObject(42, 0.42)));
421 EXPECT_EQ(TestObject(42, 0.42), b.value_or(TestObject(42, 0.42)));
422 }
423
424 TEST(OptionalTest, Swap_bothValue) {
425 Optional<TestObject> a(TestObject(0, 0.1));
426 Optional<TestObject> b(TestObject(1, 0.3));
427 a.swap(b);
428
429 EXPECT_TRUE(a);
430 EXPECT_TRUE(b);
431 EXPECT_EQ(TestObject(1, 0.3), a.value_or(TestObject(42, 0.42)));
432 EXPECT_EQ(TestObject(0, 0.1), b.value_or(TestObject(42, 0.42)));
433 }
434
435 TEST(OptionalTest, Emplace) {
436 {
437 Optional<float> a(0.1f);
438 a.emplace(0.3f);
439
440 EXPECT_TRUE(a);
441 EXPECT_EQ(0.3f, a.value());
442 }
443
444 {
445 Optional<std::string> a("foo");
446 a.emplace("bar");
447
448 EXPECT_TRUE(a);
449 EXPECT_EQ("bar", a.value());
450 }
451
452 {
453 Optional<TestObject> a(TestObject(0, 0.1));
454 a.emplace(TestObject(1, 0.2));
455
456 EXPECT_TRUE(a);
457 EXPECT_EQ(TestObject(1, 0.2), a.value());
458 }
459 }
460
461 TEST(OptionalTest, Equals_TwoEmpty) {
462 Optional<int> a;
463 Optional<int> b;
464
465 EXPECT_TRUE(a == b);
466 }
467
468 TEST(OptionalTest, Equals_TwoEquals) {
469 Optional<int> a(1);
470 Optional<int> b(1);
471
472 EXPECT_TRUE(a == b);
473 }
474
475 TEST(OptionalTest, Equals_OneEmpty) {
476 Optional<int> a;
477 Optional<int> b(1);
478
479 EXPECT_FALSE(a == b);
480 }
481
482 TEST(OptionalTest, Equals_TwoDifferent) {
483 Optional<int> a(0);
484 Optional<int> b(1);
485
486 EXPECT_FALSE(a == b);
487 }
488
489 TEST(OptionalTest, NotEquals_TwoEmpty) {
490 Optional<int> a;
491 Optional<int> b;
492
493 EXPECT_FALSE(a != b);
494 }
495
496 TEST(OptionalTest, NotEquals_TwoEquals) {
497 Optional<int> a(1);
498 Optional<int> b(1);
499
500 EXPECT_FALSE(a != b);
501 }
502
503 TEST(OptionalTest, NotEquals_OneEmpty) {
504 Optional<int> a;
505 Optional<int> b(1);
506
507 EXPECT_TRUE(a != b);
508 }
509
510 TEST(OptionalTest, NotEquals_TwoDifferent) {
511 Optional<int> a(0);
512 Optional<int> b(1);
513
514 EXPECT_TRUE(a != b);
515 }
516
517 TEST(OptionalTest, Less_LeftEmpty) {
518 Optional<int> l;
519 Optional<int> r(1);
520
521 EXPECT_TRUE(l < r);
522 }
523
524 TEST(OptionalTest, Less_RightEmpty) {
525 Optional<int> l(1);
526 Optional<int> r;
527
528 EXPECT_FALSE(l < r);
529 }
530
531 TEST(OptionalTest, Less_BothValues) {
532 {
533 Optional<int> l(1);
534 Optional<int> r(2);
535
536 EXPECT_TRUE(l < r);
537 }
538 {
539 Optional<int> l(2);
540 Optional<int> r(1);
541
542 EXPECT_FALSE(l < r);
543 }
544 {
545 Optional<int> l(1);
546 Optional<int> r(1);
547
548 EXPECT_FALSE(l < r);
549 }
550 }
551
552 TEST(OptionalTest, LessEq_LeftEmpty) {
553 Optional<int> l;
554 Optional<int> r(1);
555
556 EXPECT_TRUE(l <= r);
557 }
558
559 TEST(OptionalTest, LessEq_RightEmpty) {
560 Optional<int> l(1);
561 Optional<int> r;
562
563 EXPECT_FALSE(l <= r);
564 }
565
566 TEST(OptionalTest, LessEq_BothValues) {
567 {
568 Optional<int> l(1);
569 Optional<int> r(2);
570
571 EXPECT_TRUE(l <= r);
572 }
573 {
574 Optional<int> l(2);
575 Optional<int> r(1);
576
577 EXPECT_FALSE(l <= r);
578 }
579 {
580 Optional<int> l(1);
581 Optional<int> r(1);
582
583 EXPECT_TRUE(l <= r);
584 }
585 }
586
587 // TODO: finish tests for following functions.
588
589 /*
590 constexpr bool operator>(const Optional<T>& lhs, const Optional<T>& rhs) {
591 return rhs < lhs;
592
593 constexpr bool operator>=(const Optional<T>& lhs, const Optional<T>& rhs) {
594 return !(lhs < rhs);
595
596 constexpr bool operator==(const Optional<T>& opt, base::nullopt_t) {
597 return !opt;
598
599 constexpr bool operator==(base::nullopt_t, const Optional<T>& opt) {
600 return !opt;
601
602 constexpr bool operator!=(const Optional<T>& opt, base::nullopt_t) {
603 return !!opt;
604
605 constexpr bool operator!=(base::nullopt_t, const Optional<T>& opt) {
606 return !!opt;
607
608 constexpr bool operator<(const Optional<T>& opt, base::nullopt_t) {
609 return false;
610
611 constexpr bool operator<(base::nullopt_t, const Optional<T>& opt) {
612 return !!opt;
613
614 constexpr bool operator<=(const Optional<T>& opt, base::nullopt_t) {
615 return !opt;
616
617 constexpr bool operator<=(base::nullopt_t, const Optional<T>& opt) {
618 return true;
619
620 constexpr bool operator>(const Optional<T>& opt, base::nullopt_t) {
621 return !!opt;
622
623 constexpr bool operator>(base::nullopt_t, const Optional<T>& opt) {
624 return false;
625
626 constexpr bool operator>=(const Optional<T>& opt, base::nullopt_t) {
627 return true;
628
629 constexpr bool operator>=(base::nullopt_t, const Optional<T>& opt) {
630 return !opt;
631
632 constexpr bool operator==(const Optional<T>& opt, const T& value) {
633 return opt != nullopt ? *opt == value : false;
634
635 constexpr bool operator==(const T& value, const Optional<T>& opt) {
636 return opt != nullopt ? value == *opt : false;
637
638 constexpr bool operator!=(const Optional<T>& opt, const T& value) {
639 return opt != nullopt ? *opt != value : true;
640
641 constexpr bool operator!=(const T& value, const Optional<T>& opt) {
642 return opt != nullopt ? value != *opt : true;
643
644 constexpr bool operator<(const Optional<T>& opt, const T& value) {
645 return opt != nullopt ? *opt < value : true;
646
647 constexpr bool operator<(const T& value, const Optional<T>& opt) {
648 return opt != nullopt ? value < *opt : false;
649
650 constexpr bool operator<=(const Optional<T>& opt, const T& value) {
651 return !(opt > value);
652
653 constexpr bool operator<=(const T& value, const Optional<T>& opt) {
654 return !(value > opt);
655
656 constexpr bool operator>(const Optional<T>& opt, const T& value) {
657 return opt != nullopt ? value < *opt : false;
658
659 constexpr bool operator>(const T& value, const Optional<T>& opt) {
660 return opt != nullopt ? *opt < value : true;
661
662 constexpr bool operator>=(const Optional<T>& opt, const T& value) {
663 return !(opt < value);
664
665 constexpr bool operator>=(const T& value, const Optional<T>& opt) {
666 return !(value < opt);
667 */
668
669 TEST(OptionalTest, EqualsNull) {
670 {
671 Optional<float> a(0.1f);
672 Optional<float> b(0.2f);
673 a = base::nullopt;
674 b = base::nullopt;
675 EXPECT_EQ(a, b);
676 }
677
678 {
679 Optional<std::string> a("foo");
680 Optional<std::string> b("bar");
681 a = base::nullopt;
682 b = base::nullopt;
683 EXPECT_EQ(a, b);
684 }
685
686 {
687 Optional<TestObject> a(TestObject(3, 0.1));
688 Optional<TestObject> b(TestObject(4, 1.0));
689 a = base::nullopt;
690 b = base::nullopt;
691 EXPECT_EQ(a, b);
692 }
693 }
694
695 TEST(OptionalTest, NotEquals) {
696 {
697 Optional<float> a(0.1f);
698 Optional<float> b(0.2f);
699 EXPECT_NE(a, b);
700 }
701
702 {
703 Optional<std::string> a("foo");
704 Optional<std::string> b("bar");
705 EXPECT_NE(a, b);
706 }
707
708 {
709 Optional<TestObject> a(TestObject(3, 0.1));
710 Optional<TestObject> b(TestObject(4, 1.0));
711 EXPECT_NE(a, b);
712 }
713 }
714
715 TEST(OptionalTest, NotEqualsNull) {
716 {
717 Optional<float> a(0.1f);
718 Optional<float> b(0.1f);
719 b = base::nullopt;
720 EXPECT_NE(a, b);
721 }
722
723 {
724 Optional<std::string> a("foo");
725 Optional<std::string> b("foo");
726 b = base::nullopt;
727 EXPECT_NE(a, b);
728 }
729
730 {
731 Optional<TestObject> a(TestObject(3, 0.1));
732 Optional<TestObject> b(TestObject(3, 0.1));
733 b = base::nullopt;
734 EXPECT_NE(a, b);
735 }
736 }
737
738 TEST(OptionalTest, MakeOptional) {
739 {
740 Optional<float> o = base::make_optional(32.f);
741 EXPECT_TRUE(o);
742 EXPECT_EQ(32.f, *o);
743
744 float value = 3.f;
745 o = base::make_optional(std::move(value));
746 EXPECT_TRUE(o);
747 EXPECT_EQ(3.f, *o);
748 }
749
750 {
751 Optional<const char*> o = base::make_optional("foo");
752 EXPECT_TRUE(o);
753 EXPECT_EQ("foo", *o);
754
755 const char* value = "bar";
756 o = base::make_optional(std::move(value));
757 EXPECT_TRUE(o);
758 EXPECT_EQ("bar", *o);
759 }
760
761 {
762 Optional<TestObject> o = base::make_optional(TestObject(3, 0.1));
763 EXPECT_TRUE(o);
764 EXPECT_EQ(TestObject(3, 0.1), *o);
765
766 TestObject value = TestObject(0, 0.42);
767 o = base::make_optional(std::move(value));
768 EXPECT_TRUE(o);
769 EXPECT_EQ(TestObject(0, 0.42), *o);
770 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
771 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
772
773 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
774 base::make_optional(std::move(value))->state());
775 }
776 }
777
778 TEST(OptionalTest, NonMemberSwap_bothNoValue) {
779 Optional<TestObject> a, b;
780 base::swap(a, b);
781
782 EXPECT_FALSE(a);
783 EXPECT_FALSE(b);
784 EXPECT_EQ(TestObject(42, 0.42), a.value_or(TestObject(42, 0.42)));
785 EXPECT_EQ(TestObject(42, 0.42), b.value_or(TestObject(42, 0.42)));
786 }
787
788 TEST(OptionalTest, NonMemberSwap_inHasValue) {
789 Optional<TestObject> a(TestObject(1, 0.3));
790 Optional<TestObject> b;
791 base::swap(a, b);
792
793 EXPECT_FALSE(a);
794 EXPECT_TRUE(b);
795 EXPECT_EQ(TestObject(42, 0.42), a.value_or(TestObject(42, 0.42)));
796 EXPECT_EQ(TestObject(1, 0.3), b.value_or(TestObject(42, 0.42)));
797 }
798
799 TEST(OptionalTest, NonMemberSwap_outHasValue) {
800 Optional<TestObject> a;
801 Optional<TestObject> b(TestObject(1, 0.3));
802 base::swap(a, b);
803
804 EXPECT_TRUE(a);
805 EXPECT_FALSE(b);
806 EXPECT_EQ(TestObject(1, 0.3), a.value_or(TestObject(42, 0.42)));
807 EXPECT_EQ(TestObject(42, 0.42), b.value_or(TestObject(42, 0.42)));
808 }
809
810 TEST(OptionalTest, NonMemberSwap_bothValue) {
811 Optional<TestObject> a(TestObject(0, 0.1));
812 Optional<TestObject> b(TestObject(1, 0.3));
813 base::swap(a, b);
814
815 EXPECT_TRUE(a);
816 EXPECT_TRUE(b);
817 EXPECT_EQ(TestObject(1, 0.3), a.value_or(TestObject(42, 0.42)));
818 EXPECT_EQ(TestObject(0, 0.1), b.value_or(TestObject(42, 0.42)));
819 }
820
821 TEST(OptionalTest, Hash_OptionalReflectsInternal) {
822 {
823 std::hash<int> intHash;
danakj 2016/03/21 21:49:38 int_hash
mlamouri (slow - plz ping) 2016/03/24 09:20:45 Done.
824 std::hash<Optional<int>> optIntHash;
825
826 EXPECT_EQ(intHash(1), optIntHash(Optional<int>(1)));
827 }
828
829 {
830 std::hash<std::string> strHash;
831 std::hash<Optional<std::string>> optStrHash;
832
833 EXPECT_EQ(strHash(std::string("")),
danakj 2016/03/21 21:49:38 maybe some other string than empty?
mlamouri (slow - plz ping) 2016/03/24 09:20:45 Done.
834 optStrHash(Optional<std::string>(std::string(""))));
835 }
836 }
837
838 TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
839 std::hash<Optional<int>> optIntHash;
danakj 2016/03/21 21:49:38 opt_int_hash
mlamouri (slow - plz ping) 2016/03/24 09:20:45 Done.
840 std::hash<Optional<std::string>> optStrHash;
841
842 EXPECT_EQ(optStrHash(Optional<std::string>()), optIntHash(Optional<int>()));
843 }
844
845 TEST(OptionalTest, Hash_UseInSet) {
846 std::set<Optional<int>> setOptInt;
847
848 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
849
850 setOptInt.insert(Optional<int>(3));
851 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
852 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
853 }
854
855 } // namespace base
OLDNEW
« base/optional.h ('K') | « base/optional.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698