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