blob: 285db5103d158c7c1b4e39d0fd02541005986348 [file] [log] [blame]
Lalit Magantif3e5b072018-11-19 21:51:47 +00001/*
2 * Copyright (C) 2018 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17// Comparisions of floats is used extensively in this file. Ignore warnings
18// as we want to stay close to Chromium.
Primiano Tucci63201702020-12-04 17:38:12 +010019#if defined(__GNUC__) || defined(__clang__)
Lalit Magantif3e5b072018-11-19 21:51:47 +000020#pragma GCC diagnostic push
21#pragma GCC diagnostic ignored "-Wfloat-equal"
Primiano Tucci63201702020-12-04 17:38:12 +010022#endif
Lalit Magantif3e5b072018-11-19 21:51:47 +000023
Lalit Magantif3e5b072018-11-19 21:51:47 +000024#include <memory>
25#include <set>
26#include <string>
27#include <vector>
28
Primiano Tucci2c5488f2019-06-01 03:27:28 +010029#include "perfetto/ext/base/optional.h"
Primiano Tucci22727922019-06-01 10:07:42 +010030#include "perfetto/ext/base/utils.h"
Primiano Tucci919ca1e2019-08-21 20:26:58 +020031#include "test/gtest_and_gmock.h"
Lalit Magantif3e5b072018-11-19 21:51:47 +000032
33using ::testing::ElementsAre;
34
35namespace perfetto {
36namespace base {
37
38namespace {
39
40// Object used to test complex object with Optional<T> in addition of the move
41// semantics.
42class TestObject {
43 public:
44 enum class State {
45 DEFAULT_CONSTRUCTED,
46 VALUE_CONSTRUCTED,
47 COPY_CONSTRUCTED,
48 MOVE_CONSTRUCTED,
49 MOVED_FROM,
50 COPY_ASSIGNED,
51 MOVE_ASSIGNED,
52 SWAPPED,
53 };
54
55 TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
56
57 TestObject(int foo, double bar)
58 : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
59
60 TestObject(const TestObject& other)
61 : foo_(other.foo_),
62 bar_(other.bar_),
63 state_(State::COPY_CONSTRUCTED),
64 move_ctors_count_(other.move_ctors_count_) {}
65
66 TestObject(TestObject&& other)
67 : foo_(std::move(other.foo_)),
68 bar_(std::move(other.bar_)),
69 state_(State::MOVE_CONSTRUCTED),
70 move_ctors_count_(other.move_ctors_count_ + 1) {
71 other.state_ = State::MOVED_FROM;
72 }
73
74 TestObject& operator=(const TestObject& other) {
75 foo_ = other.foo_;
76 bar_ = other.bar_;
77 state_ = State::COPY_ASSIGNED;
78 move_ctors_count_ = other.move_ctors_count_;
79 return *this;
80 }
81
82 TestObject& operator=(TestObject&& other) {
83 foo_ = other.foo_;
84 bar_ = other.bar_;
85 state_ = State::MOVE_ASSIGNED;
86 move_ctors_count_ = other.move_ctors_count_;
87 other.state_ = State::MOVED_FROM;
88 return *this;
89 }
90
91 void Swap(TestObject* other) {
92 using std::swap;
93 swap(foo_, other->foo_);
94 swap(bar_, other->bar_);
95 swap(move_ctors_count_, other->move_ctors_count_);
96 state_ = State::SWAPPED;
97 other->state_ = State::SWAPPED;
98 }
99
100 bool operator==(const TestObject& other) const {
101 return std::tie(foo_, bar_) == std::tie(other.foo_, other.bar_);
102 }
103
104 bool operator!=(const TestObject& other) const { return !(*this == other); }
105
106 int foo() const { return foo_; }
107 State state() const { return state_; }
108 int move_ctors_count() const { return move_ctors_count_; }
109
110 private:
111 int foo_;
112 double bar_;
113 State state_;
114 int move_ctors_count_ = 0;
115};
116
117// Implementing Swappable concept.
118void swap(TestObject& lhs, TestObject& rhs) {
119 lhs.Swap(&rhs);
120}
121
122class NonTriviallyDestructible {
123 ~NonTriviallyDestructible() {}
124};
125
126class DeletedDefaultConstructor {
127 public:
128 DeletedDefaultConstructor() = delete;
129 DeletedDefaultConstructor(int foo) : foo_(foo) {}
130
131 int foo() const { return foo_; }
132
133 private:
134 int foo_;
135};
136
137class DeletedCopy {
138 public:
139 explicit DeletedCopy(int foo) : foo_(foo) {}
140 DeletedCopy(const DeletedCopy&) = delete;
141 DeletedCopy(DeletedCopy&&) = default;
142
143 DeletedCopy& operator=(const DeletedCopy&) = delete;
144 DeletedCopy& operator=(DeletedCopy&&) = default;
145
146 int foo() const { return foo_; }
147
148 private:
149 int foo_;
150};
151
152class DeletedMove {
153 public:
154 explicit DeletedMove(int foo) : foo_(foo) {}
155 DeletedMove(const DeletedMove&) = default;
156 DeletedMove(DeletedMove&&) = delete;
157
158 DeletedMove& operator=(const DeletedMove&) = default;
159 DeletedMove& operator=(DeletedMove&&) = delete;
160
161 int foo() const { return foo_; }
162
163 private:
164 int foo_;
165};
166
167class NonTriviallyDestructibleDeletedCopyConstructor {
168 public:
169 explicit NonTriviallyDestructibleDeletedCopyConstructor(int foo)
170 : foo_(foo) {}
171 NonTriviallyDestructibleDeletedCopyConstructor(
172 const NonTriviallyDestructibleDeletedCopyConstructor&) = delete;
173 NonTriviallyDestructibleDeletedCopyConstructor(
174 NonTriviallyDestructibleDeletedCopyConstructor&&) = default;
175
176 ~NonTriviallyDestructibleDeletedCopyConstructor() {}
177
178 int foo() const { return foo_; }
179
180 private:
181 int foo_;
182};
183
184class DeleteNewOperators {
185 public:
186 void* operator new(size_t) = delete;
187 void* operator new(size_t, void*) = delete;
188 void* operator new[](size_t) = delete;
189 void* operator new[](size_t, void*) = delete;
190};
191
192} // anonymous namespace
193
194static_assert(std::is_trivially_destructible<Optional<int>>::value,
195 "OptionalIsTriviallyDestructible");
196
197static_assert(
198 !std::is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
199 "OptionalIsTriviallyDestructible");
200
201static_assert(sizeof(Optional<int>) == sizeof(internal::OptionalBase<int>),
202 "internal::{Copy,Move}{Constructible,Assignable} structs "
203 "should be 0-sized");
204
205TEST(OptionalTest, DefaultConstructor) {
206 {
207 constexpr Optional<float> o;
208 EXPECT_FALSE(o);
209 }
210
211 {
212 Optional<std::string> o;
213 EXPECT_FALSE(o);
214 }
215
216 {
217 Optional<TestObject> o;
218 EXPECT_FALSE(o);
219 }
220}
221
222TEST(OptionalTest, CopyConstructor) {
223 {
224 constexpr Optional<float> first(0.1f);
225 constexpr Optional<float> other(first);
226
227 EXPECT_TRUE(other);
228 EXPECT_EQ(other.value(), 0.1f);
229 EXPECT_EQ(first, other);
230 }
231
232 {
233 Optional<std::string> first("foo");
234 Optional<std::string> other(first);
235
236 EXPECT_TRUE(other);
237 EXPECT_EQ(other.value(), "foo");
238 EXPECT_EQ(first, other);
239 }
240
241 {
242 const Optional<std::string> first("foo");
243 Optional<std::string> other(first);
244
245 EXPECT_TRUE(other);
246 EXPECT_EQ(other.value(), "foo");
247 EXPECT_EQ(first, other);
248 }
249
250 {
251 Optional<TestObject> first(TestObject(3, 0.1));
252 Optional<TestObject> other(first);
253
254 EXPECT_TRUE(!!other);
255 EXPECT_TRUE(other.value() == TestObject(3, 0.1));
256 EXPECT_TRUE(first == other);
257 }
258}
259
260TEST(OptionalTest, ValueConstructor) {
261 {
262 constexpr float value = 0.1f;
263 constexpr Optional<float> o(value);
264
265 EXPECT_TRUE(o);
266 EXPECT_EQ(value, o.value());
267 }
268
269 {
270 std::string value("foo");
271 Optional<std::string> o(value);
272
273 EXPECT_TRUE(o);
274 EXPECT_EQ(value, o.value());
275 }
276
277 {
278 TestObject value(3, 0.1);
279 Optional<TestObject> o(value);
280
281 EXPECT_TRUE(o);
282 EXPECT_EQ(TestObject::State::COPY_CONSTRUCTED, o->state());
283 EXPECT_EQ(value, o.value());
284 }
285}
286
287TEST(OptionalTest, MoveConstructor) {
288 {
289 constexpr Optional<float> first(0.1f);
290 constexpr Optional<float> second(std::move(first));
291
292 EXPECT_TRUE(second.has_value());
293 EXPECT_EQ(second.value(), 0.1f);
294
295 EXPECT_TRUE(first.has_value());
296 }
297
298 {
299 Optional<std::string> first("foo");
300 Optional<std::string> second(std::move(first));
301
302 EXPECT_TRUE(second.has_value());
303 EXPECT_EQ("foo", second.value());
304
305 EXPECT_TRUE(first.has_value());
306 }
307
308 {
309 Optional<TestObject> first(TestObject(3, 0.1));
310 Optional<TestObject> second(std::move(first));
311
312 EXPECT_TRUE(second.has_value());
313 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
314 EXPECT_TRUE(TestObject(3, 0.1) == second.value());
315
316 EXPECT_TRUE(first.has_value());
317 EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
318 }
319
320 // Even if copy constructor is deleted, move constructor needs to work.
321 // Note that it couldn't be constexpr.
322 {
323 Optional<DeletedCopy> first(in_place, 42);
324 Optional<DeletedCopy> second(std::move(first));
325
326 EXPECT_TRUE(second.has_value());
327 EXPECT_EQ(42, second->foo());
328
329 EXPECT_TRUE(first.has_value());
330 }
331
332 {
333 Optional<DeletedMove> first(in_place, 42);
334 Optional<DeletedMove> second(std::move(first));
335
336 EXPECT_TRUE(second.has_value());
337 EXPECT_EQ(42, second->foo());
338
339 EXPECT_TRUE(first.has_value());
340 }
341
342 {
343 Optional<NonTriviallyDestructibleDeletedCopyConstructor> first(in_place,
344 42);
345 Optional<NonTriviallyDestructibleDeletedCopyConstructor> second(
346 std::move(first));
347
348 EXPECT_TRUE(second.has_value());
349 EXPECT_EQ(42, second->foo());
350
351 EXPECT_TRUE(first.has_value());
352 }
353}
354
355TEST(OptionalTest, MoveValueConstructor) {
356 {
357 constexpr float value = 0.1f;
358 constexpr Optional<float> o(std::move(value));
359
360 EXPECT_TRUE(o);
361 EXPECT_EQ(0.1f, o.value());
362 }
363
364 {
365 float value = 0.1f;
366 Optional<float> o(std::move(value));
367
368 EXPECT_TRUE(o);
369 EXPECT_EQ(0.1f, o.value());
370 }
371
372 {
373 std::string value("foo");
374 Optional<std::string> o(std::move(value));
375
376 EXPECT_TRUE(o);
377 EXPECT_EQ("foo", o.value());
378 }
379
380 {
381 TestObject value(3, 0.1);
382 Optional<TestObject> o(std::move(value));
383
384 EXPECT_TRUE(o);
385 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, o->state());
386 EXPECT_EQ(TestObject(3, 0.1), o.value());
387 }
388}
389
390TEST(OptionalTest, ConvertingCopyConstructor) {
391 {
392 Optional<int> first(1);
393 Optional<double> second(first);
394 EXPECT_TRUE(second.has_value());
395 EXPECT_EQ(1.0, second.value());
396 }
397
398 // Make sure explicit is not marked for convertible case.
399 {
400 Optional<int> o(1);
401 ignore_result<Optional<double>>(o);
402 }
403}
404
405TEST(OptionalTest, ConvertingMoveConstructor) {
406 {
407 Optional<int> first(1);
408 Optional<double> second(std::move(first));
409 EXPECT_TRUE(second.has_value());
410 EXPECT_EQ(1.0, second.value());
411 }
412
413 // Make sure explicit is not marked for convertible case.
414 {
415 Optional<int> o(1);
416 ignore_result<Optional<double>>(std::move(o));
417 }
418
419 {
420 class Test1 {
421 public:
422 explicit Test1(int foo) : foo_(foo) {}
423
424 int foo() const { return foo_; }
425
426 private:
427 int foo_;
428 };
429
430 // Not copyable but convertible from Test1.
431 class Test2 {
432 public:
433 Test2(const Test2&) = delete;
434 explicit Test2(Test1&& other) : bar_(other.foo()) {}
435
436 double bar() const { return bar_; }
437
438 private:
439 double bar_;
440 };
441
442 Optional<Test1> first(in_place, 42);
443 Optional<Test2> second(std::move(first));
444 EXPECT_TRUE(second.has_value());
445 EXPECT_EQ(42.0, second->bar());
446 }
447}
448
449TEST(OptionalTest, ConstructorForwardArguments) {
450 {
451 constexpr Optional<float> a(base::in_place, 0.1f);
452 EXPECT_TRUE(a);
453 EXPECT_EQ(0.1f, a.value());
454 }
455
456 {
457 Optional<float> a(base::in_place, 0.1f);
458 EXPECT_TRUE(a);
459 EXPECT_EQ(0.1f, a.value());
460 }
461
462 {
463 Optional<std::string> a(base::in_place, "foo");
464 EXPECT_TRUE(a);
465 EXPECT_EQ("foo", a.value());
466 }
467
468 {
469 Optional<TestObject> a(base::in_place, 0, 0.1);
470 EXPECT_TRUE(!!a);
471 EXPECT_TRUE(TestObject(0, 0.1) == a.value());
472 }
473}
474
475TEST(OptionalTest, ConstructorForwardInitListAndArguments) {
476 {
477 Optional<std::vector<int>> opt(in_place, {3, 1});
478 EXPECT_TRUE(opt);
479 EXPECT_THAT(*opt, ElementsAre(3, 1));
480 EXPECT_EQ(2u, opt->size());
481 }
482
483 {
484 Optional<std::vector<int>> opt(in_place, {3, 1}, std::allocator<int>());
485 EXPECT_TRUE(opt);
486 EXPECT_THAT(*opt, ElementsAre(3, 1));
487 EXPECT_EQ(2u, opt->size());
488 }
489}
490
491TEST(OptionalTest, ForwardConstructor) {
492 {
493 Optional<double> a(1);
494 EXPECT_TRUE(a.has_value());
495 EXPECT_EQ(1.0, a.value());
496 }
497
498 // Test that default type of 'U' is value_type.
499 {
500 struct TestData {
501 int a;
502 double b;
503 bool c;
504 };
505
506 Optional<TestData> a({1, 2.0, true});
507 EXPECT_TRUE(a.has_value());
508 EXPECT_EQ(1, a->a);
509 EXPECT_EQ(2.0, a->b);
510 EXPECT_TRUE(a->c);
511 }
512
513 // If T has a constructor with a param Optional<U>, and another ctor with a
514 // param U, then T(Optional<U>) should be used for Optional<T>(Optional<U>)
515 // constructor.
516 {
517 enum class ParamType {
518 DEFAULT_CONSTRUCTED,
519 COPY_CONSTRUCTED,
520 MOVE_CONSTRUCTED,
521 INT,
522 IN_PLACE,
523 OPTIONAL_INT,
524 };
525 struct Test {
526 Test() : param_type(ParamType::DEFAULT_CONSTRUCTED) {}
527 Test(const Test&) : param_type(ParamType::COPY_CONSTRUCTED) {}
528 Test(Test&&) : param_type(ParamType::MOVE_CONSTRUCTED) {}
529 explicit Test(int) : param_type(ParamType::INT) {}
530 explicit Test(in_place_t) : param_type(ParamType::IN_PLACE) {}
531 explicit Test(Optional<int>) : param_type(ParamType::OPTIONAL_INT) {}
532
533 ParamType param_type;
534 };
535
536 // Overload resolution with copy-conversion constructor.
537 {
538 const Optional<int> arg(in_place, 1);
539 Optional<Test> testee(arg);
540 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
541 }
542
543 // Overload resolution with move conversion constructor.
544 {
545 Optional<Test> testee(Optional<int>(in_place, 1));
546 EXPECT_EQ(ParamType::OPTIONAL_INT, testee->param_type);
547 }
548
549 // Default constructor should be used.
550 {
551 Optional<Test> testee(in_place);
552 EXPECT_EQ(ParamType::DEFAULT_CONSTRUCTED, testee->param_type);
553 }
554 }
555
556 {
557 struct Test {
558 Test(int) {} // NOLINT(runtime/explicit)
559 };
560 // If T is convertible from U, it is not marked as explicit.
561 static_assert(std::is_convertible<int, Test>::value,
562 "Int should be convertible to Test.");
563 ([](Optional<Test>) {})(1);
564 }
565}
566
567TEST(OptionalTest, NulloptConstructor) {
568 constexpr Optional<int> a(base::nullopt);
569 EXPECT_FALSE(a);
570}
571
572TEST(OptionalTest, AssignValue) {
573 {
574 Optional<float> a;
575 EXPECT_FALSE(a);
576 a = 0.1f;
577 EXPECT_TRUE(a);
578
579 Optional<float> b(0.1f);
580 EXPECT_TRUE(a == b);
581 }
582
583 {
584 Optional<std::string> a;
585 EXPECT_FALSE(a);
586 a = std::string("foo");
587 EXPECT_TRUE(a);
588
589 Optional<std::string> b(std::string("foo"));
590 EXPECT_EQ(a, b);
591 }
592
593 {
594 Optional<TestObject> a;
595 EXPECT_FALSE(!!a);
596 a = TestObject(3, 0.1);
597 EXPECT_TRUE(!!a);
598
599 Optional<TestObject> b(TestObject(3, 0.1));
600 EXPECT_TRUE(a == b);
601 }
602
603 {
604 Optional<TestObject> a = TestObject(4, 1.0);
605 EXPECT_TRUE(!!a);
606 a = TestObject(3, 0.1);
607 EXPECT_TRUE(!!a);
608
609 Optional<TestObject> b(TestObject(3, 0.1));
610 EXPECT_TRUE(a == b);
611 }
612}
613
614TEST(OptionalTest, AssignObject) {
615 {
616 Optional<float> a;
617 Optional<float> b(0.1f);
618 a = b;
619
620 EXPECT_TRUE(a);
621 EXPECT_EQ(a.value(), 0.1f);
622 EXPECT_EQ(a, b);
623 }
624
625 {
626 Optional<std::string> a;
627 Optional<std::string> b("foo");
628 a = b;
629
630 EXPECT_TRUE(a);
631 EXPECT_EQ(a.value(), "foo");
632 EXPECT_EQ(a, b);
633 }
634
635 {
636 Optional<TestObject> a;
637 Optional<TestObject> b(TestObject(3, 0.1));
638 a = b;
639
640 EXPECT_TRUE(!!a);
641 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
642 EXPECT_TRUE(a == b);
643 }
644
645 {
646 Optional<TestObject> a(TestObject(4, 1.0));
647 Optional<TestObject> b(TestObject(3, 0.1));
648 a = b;
649
650 EXPECT_TRUE(!!a);
651 EXPECT_TRUE(a.value() == TestObject(3, 0.1));
652 EXPECT_TRUE(a == b);
653 }
654
655 {
656 Optional<DeletedMove> a(in_place, 42);
657 Optional<DeletedMove> b;
658 b = a;
659
660 EXPECT_TRUE(!!a);
661 EXPECT_TRUE(!!b);
662 EXPECT_EQ(a->foo(), b->foo());
663 }
664
665 {
666 Optional<DeletedMove> a(in_place, 42);
667 Optional<DeletedMove> b(in_place, 1);
668 b = a;
669
670 EXPECT_TRUE(!!a);
671 EXPECT_TRUE(!!b);
672 EXPECT_EQ(a->foo(), b->foo());
673 }
674
675 // Converting assignment.
676 {
677 Optional<int> a(in_place, 1);
678 Optional<double> b;
679 b = a;
680
681 EXPECT_TRUE(!!a);
682 EXPECT_TRUE(!!b);
683 EXPECT_EQ(1, a.value());
684 EXPECT_EQ(1.0, b.value());
685 }
686
687 {
688 Optional<int> a(in_place, 42);
689 Optional<double> b(in_place, 1);
690 b = a;
691
692 EXPECT_TRUE(!!a);
693 EXPECT_TRUE(!!b);
694 EXPECT_EQ(42, a.value());
695 EXPECT_EQ(42.0, b.value());
696 }
697
698 {
699 Optional<int> a;
700 Optional<double> b(in_place, 1);
701 b = a;
702 EXPECT_FALSE(!!a);
703 EXPECT_FALSE(!!b);
704 }
705}
706
707TEST(OptionalTest, AssignObject_rvalue) {
708 {
709 Optional<float> a;
710 Optional<float> b(0.1f);
711 a = std::move(b);
712
713 EXPECT_TRUE(a);
714 EXPECT_TRUE(b);
715 EXPECT_EQ(0.1f, a.value());
716 }
717
718 {
719 Optional<std::string> a;
720 Optional<std::string> b("foo");
721 a = std::move(b);
722
723 EXPECT_TRUE(a);
724 EXPECT_TRUE(b);
725 EXPECT_EQ("foo", a.value());
726 }
727
728 {
729 Optional<TestObject> a;
730 Optional<TestObject> b(TestObject(3, 0.1));
731 a = std::move(b);
732
733 EXPECT_TRUE(!!a);
734 EXPECT_TRUE(!!b);
735 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
736
737 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
738 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
739 }
740
741 {
742 Optional<TestObject> a(TestObject(4, 1.0));
743 Optional<TestObject> b(TestObject(3, 0.1));
744 a = std::move(b);
745
746 EXPECT_TRUE(!!a);
747 EXPECT_TRUE(!!b);
748 EXPECT_TRUE(TestObject(3, 0.1) == a.value());
749
750 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
751 EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
752 }
753
754 {
755 Optional<DeletedMove> a(in_place, 42);
756 Optional<DeletedMove> b;
757 b = std::move(a);
758
759 EXPECT_TRUE(!!a);
760 EXPECT_TRUE(!!b);
761 EXPECT_EQ(42, b->foo());
762 }
763
764 {
765 Optional<DeletedMove> a(in_place, 42);
766 Optional<DeletedMove> b(in_place, 1);
767 b = std::move(a);
768
769 EXPECT_TRUE(!!a);
770 EXPECT_TRUE(!!b);
771 EXPECT_EQ(42, b->foo());
772 }
773
774 // Converting assignment.
775 {
776 Optional<int> a(in_place, 1);
777 Optional<double> b;
778 b = std::move(a);
779
780 EXPECT_TRUE(!!a);
781 EXPECT_TRUE(!!b);
782 EXPECT_EQ(1.0, b.value());
783 }
784
785 {
786 Optional<int> a(in_place, 42);
787 Optional<double> b(in_place, 1);
788 b = std::move(a);
789
790 EXPECT_TRUE(!!a);
791 EXPECT_TRUE(!!b);
792 EXPECT_EQ(42.0, b.value());
793 }
794
795 {
796 Optional<int> a;
797 Optional<double> b(in_place, 1);
798 b = std::move(a);
799
800 EXPECT_FALSE(!!a);
801 EXPECT_FALSE(!!b);
802 }
803}
804
805TEST(OptionalTest, AssignNull) {
806 {
807 Optional<float> a(0.1f);
808 Optional<float> b(0.2f);
809 a = base::nullopt;
810 b = base::nullopt;
811 EXPECT_EQ(a, b);
812 }
813
814 {
815 Optional<std::string> a("foo");
816 Optional<std::string> b("bar");
817 a = base::nullopt;
818 b = base::nullopt;
819 EXPECT_EQ(a, b);
820 }
821
822 {
823 Optional<TestObject> a(TestObject(3, 0.1));
824 Optional<TestObject> b(TestObject(4, 1.0));
825 a = base::nullopt;
826 b = base::nullopt;
827 EXPECT_TRUE(a == b);
828 }
829}
830
831TEST(OptionalTest, AssignOverload) {
832 struct Test1 {
833 enum class State {
834 CONSTRUCTED,
835 MOVED,
836 };
837 State state = State::CONSTRUCTED;
838 };
839
840 // Here, Optional<Test2> can be assigned from Optioanl<Test1>.
841 // In case of move, marks MOVED to Test1 instance.
842 struct Test2 {
843 enum class State {
844 DEFAULT_CONSTRUCTED,
845 COPY_CONSTRUCTED_FROM_TEST1,
846 MOVE_CONSTRUCTED_FROM_TEST1,
847 COPY_ASSIGNED_FROM_TEST1,
848 MOVE_ASSIGNED_FROM_TEST1,
849 };
850
851 Test2() = default;
852 explicit Test2(const Test1&) : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
853 explicit Test2(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
854 test1.state = Test1::State::MOVED;
855 }
856 Test2& operator=(const Test1&) {
857 state = State::COPY_ASSIGNED_FROM_TEST1;
858 return *this;
859 }
860 Test2& operator=(Test1&& test1) {
861 state = State::MOVE_ASSIGNED_FROM_TEST1;
862 test1.state = Test1::State::MOVED;
863 return *this;
864 }
865
866 State state = State::DEFAULT_CONSTRUCTED;
867 };
868
869 {
870 Optional<Test1> a(in_place);
871 Optional<Test2> b;
872
873 b = a;
874 EXPECT_TRUE(!!a);
875 EXPECT_TRUE(!!b);
876 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
877 EXPECT_EQ(Test2::State::COPY_CONSTRUCTED_FROM_TEST1, b->state);
878 }
879
880 {
881 Optional<Test1> a(in_place);
882 Optional<Test2> b(in_place);
883
884 b = a;
885 EXPECT_TRUE(!!a);
886 EXPECT_TRUE(!!b);
887 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
888 EXPECT_EQ(Test2::State::COPY_ASSIGNED_FROM_TEST1, b->state);
889 }
890
891 {
892 Optional<Test1> a(in_place);
893 Optional<Test2> b;
894
895 b = std::move(a);
896 EXPECT_TRUE(!!a);
897 EXPECT_TRUE(!!b);
898 EXPECT_EQ(Test1::State::MOVED, a->state);
899 EXPECT_EQ(Test2::State::MOVE_CONSTRUCTED_FROM_TEST1, b->state);
900 }
901
902 {
903 Optional<Test1> a(in_place);
904 Optional<Test2> b(in_place);
905
906 b = std::move(a);
907 EXPECT_TRUE(!!a);
908 EXPECT_TRUE(!!b);
909 EXPECT_EQ(Test1::State::MOVED, a->state);
910 EXPECT_EQ(Test2::State::MOVE_ASSIGNED_FROM_TEST1, b->state);
911 }
912
913 // Similar to Test2, but Test3 also has copy/move ctor and assign operators
914 // from Optional<Test1>, too. In this case, for a = b where a is
915 // Optional<Test3> and b is Optional<Test1>,
916 // Optional<T>::operator=(U&&) where U is Optional<Test1> should be used
917 // rather than Optional<T>::operator=(Optional<U>&&) where U is Test1.
918 struct Test3 {
919 enum class State {
920 DEFAULT_CONSTRUCTED,
921 COPY_CONSTRUCTED_FROM_TEST1,
922 MOVE_CONSTRUCTED_FROM_TEST1,
923 COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1,
924 MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1,
925 COPY_ASSIGNED_FROM_TEST1,
926 MOVE_ASSIGNED_FROM_TEST1,
927 COPY_ASSIGNED_FROM_OPTIONAL_TEST1,
928 MOVE_ASSIGNED_FROM_OPTIONAL_TEST1,
929 };
930
931 Test3() = default;
932 explicit Test3(const Test1&) : state(State::COPY_CONSTRUCTED_FROM_TEST1) {}
933 explicit Test3(Test1&& test1) : state(State::MOVE_CONSTRUCTED_FROM_TEST1) {
934 test1.state = Test1::State::MOVED;
935 }
936 explicit Test3(const Optional<Test1>&)
937 : state(State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1) {}
938 explicit Test3(Optional<Test1>&& test1)
939 : state(State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1) {
940 // In the following senarios, given |test1| should always have value.
941 PERFETTO_DCHECK(test1.has_value());
942 test1->state = Test1::State::MOVED;
943 }
944 Test3& operator=(const Test1&) {
945 state = State::COPY_ASSIGNED_FROM_TEST1;
946 return *this;
947 }
948 Test3& operator=(Test1&& test1) {
949 state = State::MOVE_ASSIGNED_FROM_TEST1;
950 test1.state = Test1::State::MOVED;
951 return *this;
952 }
953 Test3& operator=(const Optional<Test1>&) {
954 state = State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1;
955 return *this;
956 }
957 Test3& operator=(Optional<Test1>&& test1) {
958 state = State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1;
959 // In the following senarios, given |test1| should always have value.
960 PERFETTO_DCHECK(test1.has_value());
961 test1->state = Test1::State::MOVED;
962 return *this;
963 }
964
965 State state = State::DEFAULT_CONSTRUCTED;
966 };
967
968 {
969 Optional<Test1> a(in_place);
970 Optional<Test3> b;
971
972 b = a;
973 EXPECT_TRUE(!!a);
974 EXPECT_TRUE(!!b);
975 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
976 EXPECT_EQ(Test3::State::COPY_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
977 }
978
979 {
980 Optional<Test1> a(in_place);
981 Optional<Test3> b(in_place);
982
983 b = a;
984 EXPECT_TRUE(!!a);
985 EXPECT_TRUE(!!b);
986 EXPECT_EQ(Test1::State::CONSTRUCTED, a->state);
987 EXPECT_EQ(Test3::State::COPY_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
988 }
989
990 {
991 Optional<Test1> a(in_place);
992 Optional<Test3> b;
993
994 b = std::move(a);
995 EXPECT_TRUE(!!a);
996 EXPECT_TRUE(!!b);
997 EXPECT_EQ(Test1::State::MOVED, a->state);
998 EXPECT_EQ(Test3::State::MOVE_CONSTRUCTED_FROM_OPTIONAL_TEST1, b->state);
999 }
1000
1001 {
1002 Optional<Test1> a(in_place);
1003 Optional<Test3> b(in_place);
1004
1005 b = std::move(a);
1006 EXPECT_TRUE(!!a);
1007 EXPECT_TRUE(!!b);
1008 EXPECT_EQ(Test1::State::MOVED, a->state);
1009 EXPECT_EQ(Test3::State::MOVE_ASSIGNED_FROM_OPTIONAL_TEST1, b->state);
1010 }
1011}
1012
1013TEST(OptionalTest, OperatorStar) {
1014 {
1015 Optional<float> a(0.1f);
1016 EXPECT_EQ(a.value(), *a);
1017 }
1018
1019 {
1020 Optional<std::string> a("foo");
1021 EXPECT_EQ(a.value(), *a);
1022 }
1023
1024 {
1025 Optional<TestObject> a(TestObject(3, 0.1));
1026 EXPECT_EQ(a.value(), *a);
1027 }
1028}
1029
1030TEST(OptionalTest, OperatorStar_rvalue) {
1031 EXPECT_EQ(0.1f, *Optional<float>(0.1f));
1032 EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
1033 EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
1034}
1035
1036TEST(OptionalTest, OperatorArrow) {
1037 Optional<TestObject> a(TestObject(3, 0.1));
1038 EXPECT_EQ(a->foo(), 3);
1039}
1040
1041TEST(OptionalTest, Value_rvalue) {
1042 EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
1043 EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
1044 EXPECT_TRUE(TestObject(3, 0.1) ==
1045 Optional<TestObject>(TestObject(3, 0.1)).value());
1046}
1047
1048TEST(OptionalTest, ValueOr) {
1049 {
1050 Optional<float> a;
1051 EXPECT_EQ(0.0f, a.value_or(0.0f));
1052
1053 a = 0.1f;
1054 EXPECT_EQ(0.1f, a.value_or(0.0f));
1055
1056 a = base::nullopt;
1057 EXPECT_EQ(0.0f, a.value_or(0.0f));
1058 }
1059
1060 // value_or() can be constexpr.
1061 {
1062 constexpr Optional<int> a(in_place, 1);
1063 constexpr int value = a.value_or(10);
1064 EXPECT_EQ(1, value);
1065 }
1066 {
1067 constexpr Optional<int> a;
1068 constexpr int value = a.value_or(10);
1069 EXPECT_EQ(10, value);
1070 }
1071
1072 {
1073 Optional<std::string> a;
1074 EXPECT_EQ("bar", a.value_or("bar"));
1075
1076 a = std::string("foo");
1077 EXPECT_EQ(std::string("foo"), a.value_or("bar"));
1078
1079 a = base::nullopt;
1080 EXPECT_EQ(std::string("bar"), a.value_or("bar"));
1081 }
1082
1083 {
1084 Optional<TestObject> a;
1085 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1086
1087 a = TestObject(3, 0.1);
1088 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
1089
1090 a = base::nullopt;
1091 EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
1092 }
1093}
1094
1095TEST(OptionalTest, Swap_bothNoValue) {
1096 Optional<TestObject> a, b;
1097 a.swap(b);
1098
1099 EXPECT_FALSE(a);
1100 EXPECT_FALSE(b);
1101 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1102 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1103}
1104
1105TEST(OptionalTest, Swap_inHasValue) {
1106 Optional<TestObject> a(TestObject(1, 0.3));
1107 Optional<TestObject> b;
1108 a.swap(b);
1109
1110 EXPECT_FALSE(a);
1111
1112 EXPECT_TRUE(!!b);
1113 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1114 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
1115}
1116
1117TEST(OptionalTest, Swap_outHasValue) {
1118 Optional<TestObject> a;
1119 Optional<TestObject> b(TestObject(1, 0.3));
1120 a.swap(b);
1121
1122 EXPECT_TRUE(!!a);
1123 EXPECT_FALSE(!!b);
1124 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1125 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1126}
1127
1128TEST(OptionalTest, Swap_bothValue) {
1129 Optional<TestObject> a(TestObject(0, 0.1));
1130 Optional<TestObject> b(TestObject(1, 0.3));
1131 a.swap(b);
1132
1133 EXPECT_TRUE(!!a);
1134 EXPECT_TRUE(!!b);
1135 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
1136 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
1137 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
1138 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
1139}
1140
1141TEST(OptionalTest, Emplace) {
1142 {
1143 Optional<float> a(0.1f);
1144 EXPECT_EQ(0.3f, a.emplace(0.3f));
1145
1146 EXPECT_TRUE(a);
1147 EXPECT_EQ(0.3f, a.value());
1148 }
1149
1150 {
1151 Optional<std::string> a("foo");
1152 EXPECT_EQ("bar", a.emplace("bar"));
1153
1154 EXPECT_TRUE(a);
1155 EXPECT_EQ("bar", a.value());
1156 }
1157
1158 {
1159 Optional<TestObject> a(TestObject(0, 0.1));
1160 EXPECT_EQ(TestObject(1, 0.2), a.emplace(TestObject(1, 0.2)));
1161
1162 EXPECT_TRUE(!!a);
1163 EXPECT_TRUE(TestObject(1, 0.2) == a.value());
1164 }
1165
1166 {
1167 Optional<std::vector<int>> a;
1168 auto& ref = a.emplace({2, 3});
1169 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1170 EXPECT_TRUE(a);
1171 EXPECT_THAT(*a, ElementsAre(2, 3));
1172 EXPECT_EQ(&ref, &*a);
1173 }
1174
1175 {
1176 Optional<std::vector<int>> a;
1177 auto& ref = a.emplace({4, 5}, std::allocator<int>());
1178 static_assert(std::is_same<std::vector<int>&, decltype(ref)>::value, "");
1179 EXPECT_TRUE(a);
1180 EXPECT_THAT(*a, ElementsAre(4, 5));
1181 EXPECT_EQ(&ref, &*a);
1182 }
1183}
1184
1185TEST(OptionalTest, Equals_TwoEmpty) {
1186 Optional<int> a;
1187 Optional<int> b;
1188
1189 EXPECT_TRUE(a == b);
1190}
1191
1192TEST(OptionalTest, Equals_TwoEquals) {
1193 Optional<int> a(1);
1194 Optional<int> b(1);
1195
1196 EXPECT_TRUE(a == b);
1197}
1198
1199TEST(OptionalTest, Equals_OneEmpty) {
1200 Optional<int> a;
1201 Optional<int> b(1);
1202
1203 EXPECT_FALSE(a == b);
1204}
1205
1206TEST(OptionalTest, Equals_TwoDifferent) {
1207 Optional<int> a(0);
1208 Optional<int> b(1);
1209
1210 EXPECT_FALSE(a == b);
1211}
1212
1213TEST(OptionalTest, Equals_DifferentType) {
1214 Optional<int> a(0);
1215 Optional<double> b(0);
1216
1217 EXPECT_TRUE(a == b);
1218}
1219
1220TEST(OptionalTest, NotEquals_TwoEmpty) {
1221 Optional<int> a;
1222 Optional<int> b;
1223
1224 EXPECT_FALSE(a != b);
1225}
1226
1227TEST(OptionalTest, NotEquals_TwoEquals) {
1228 Optional<int> a(1);
1229 Optional<int> b(1);
1230
1231 EXPECT_FALSE(a != b);
1232}
1233
1234TEST(OptionalTest, NotEquals_OneEmpty) {
1235 Optional<int> a;
1236 Optional<int> b(1);
1237
1238 EXPECT_TRUE(a != b);
1239}
1240
1241TEST(OptionalTest, NotEquals_TwoDifferent) {
1242 Optional<int> a(0);
1243 Optional<int> b(1);
1244
1245 EXPECT_TRUE(a != b);
1246}
1247
1248TEST(OptionalTest, NotEquals_DifferentType) {
1249 Optional<int> a(0);
1250 Optional<double> b(0.0);
1251
1252 EXPECT_FALSE(a != b);
1253}
1254
1255TEST(OptionalTest, Less_LeftEmpty) {
1256 Optional<int> l;
1257 Optional<int> r(1);
1258
1259 EXPECT_TRUE(l < r);
1260}
1261
1262TEST(OptionalTest, Less_RightEmpty) {
1263 Optional<int> l(1);
1264 Optional<int> r;
1265
1266 EXPECT_FALSE(l < r);
1267}
1268
1269TEST(OptionalTest, Less_BothEmpty) {
1270 Optional<int> l;
1271 Optional<int> r;
1272
1273 EXPECT_FALSE(l < r);
1274}
1275
1276TEST(OptionalTest, Less_BothValues) {
1277 {
1278 Optional<int> l(1);
1279 Optional<int> r(2);
1280
1281 EXPECT_TRUE(l < r);
1282 }
1283 {
1284 Optional<int> l(2);
1285 Optional<int> r(1);
1286
1287 EXPECT_FALSE(l < r);
1288 }
1289 {
1290 Optional<int> l(1);
1291 Optional<int> r(1);
1292
1293 EXPECT_FALSE(l < r);
1294 }
1295}
1296
1297TEST(OptionalTest, Less_DifferentType) {
1298 Optional<int> l(1);
1299 Optional<double> r(2.0);
1300
1301 EXPECT_TRUE(l < r);
1302}
1303
1304TEST(OptionalTest, LessEq_LeftEmpty) {
1305 Optional<int> l;
1306 Optional<int> r(1);
1307
1308 EXPECT_TRUE(l <= r);
1309}
1310
1311TEST(OptionalTest, LessEq_RightEmpty) {
1312 Optional<int> l(1);
1313 Optional<int> r;
1314
1315 EXPECT_FALSE(l <= r);
1316}
1317
1318TEST(OptionalTest, LessEq_BothEmpty) {
1319 Optional<int> l;
1320 Optional<int> r;
1321
1322 EXPECT_TRUE(l <= r);
1323}
1324
1325TEST(OptionalTest, LessEq_BothValues) {
1326 {
1327 Optional<int> l(1);
1328 Optional<int> r(2);
1329
1330 EXPECT_TRUE(l <= r);
1331 }
1332 {
1333 Optional<int> l(2);
1334 Optional<int> r(1);
1335
1336 EXPECT_FALSE(l <= r);
1337 }
1338 {
1339 Optional<int> l(1);
1340 Optional<int> r(1);
1341
1342 EXPECT_TRUE(l <= r);
1343 }
1344}
1345
1346TEST(OptionalTest, LessEq_DifferentType) {
1347 Optional<int> l(1);
1348 Optional<double> r(2.0);
1349
1350 EXPECT_TRUE(l <= r);
1351}
1352
1353TEST(OptionalTest, Greater_BothEmpty) {
1354 Optional<int> l;
1355 Optional<int> r;
1356
1357 EXPECT_FALSE(l > r);
1358}
1359
1360TEST(OptionalTest, Greater_LeftEmpty) {
1361 Optional<int> l;
1362 Optional<int> r(1);
1363
1364 EXPECT_FALSE(l > r);
1365}
1366
1367TEST(OptionalTest, Greater_RightEmpty) {
1368 Optional<int> l(1);
1369 Optional<int> r;
1370
1371 EXPECT_TRUE(l > r);
1372}
1373
1374TEST(OptionalTest, Greater_BothValue) {
1375 {
1376 Optional<int> l(1);
1377 Optional<int> r(2);
1378
1379 EXPECT_FALSE(l > r);
1380 }
1381 {
1382 Optional<int> l(2);
1383 Optional<int> r(1);
1384
1385 EXPECT_TRUE(l > r);
1386 }
1387 {
1388 Optional<int> l(1);
1389 Optional<int> r(1);
1390
1391 EXPECT_FALSE(l > r);
1392 }
1393}
1394
1395TEST(OptionalTest, Greater_DifferentType) {
1396 Optional<int> l(1);
1397 Optional<double> r(2.0);
1398
1399 EXPECT_FALSE(l > r);
1400}
1401
1402TEST(OptionalTest, GreaterEq_BothEmpty) {
1403 Optional<int> l;
1404 Optional<int> r;
1405
1406 EXPECT_TRUE(l >= r);
1407}
1408
1409TEST(OptionalTest, GreaterEq_LeftEmpty) {
1410 Optional<int> l;
1411 Optional<int> r(1);
1412
1413 EXPECT_FALSE(l >= r);
1414}
1415
1416TEST(OptionalTest, GreaterEq_RightEmpty) {
1417 Optional<int> l(1);
1418 Optional<int> r;
1419
1420 EXPECT_TRUE(l >= r);
1421}
1422
1423TEST(OptionalTest, GreaterEq_BothValue) {
1424 {
1425 Optional<int> l(1);
1426 Optional<int> r(2);
1427
1428 EXPECT_FALSE(l >= r);
1429 }
1430 {
1431 Optional<int> l(2);
1432 Optional<int> r(1);
1433
1434 EXPECT_TRUE(l >= r);
1435 }
1436 {
1437 Optional<int> l(1);
1438 Optional<int> r(1);
1439
1440 EXPECT_TRUE(l >= r);
1441 }
1442}
1443
1444TEST(OptionalTest, GreaterEq_DifferentType) {
1445 Optional<int> l(1);
1446 Optional<double> r(2.0);
1447
1448 EXPECT_FALSE(l >= r);
1449}
1450
1451TEST(OptionalTest, OptNullEq) {
1452 {
1453 Optional<int> opt;
1454 EXPECT_TRUE(opt == base::nullopt);
1455 }
1456 {
1457 Optional<int> opt(1);
1458 EXPECT_FALSE(opt == base::nullopt);
1459 }
1460}
1461
1462TEST(OptionalTest, NullOptEq) {
1463 {
1464 Optional<int> opt;
1465 EXPECT_TRUE(base::nullopt == opt);
1466 }
1467 {
1468 Optional<int> opt(1);
1469 EXPECT_FALSE(base::nullopt == opt);
1470 }
1471}
1472
1473TEST(OptionalTest, OptNullNotEq) {
1474 {
1475 Optional<int> opt;
1476 EXPECT_FALSE(opt != base::nullopt);
1477 }
1478 {
1479 Optional<int> opt(1);
1480 EXPECT_TRUE(opt != base::nullopt);
1481 }
1482}
1483
1484TEST(OptionalTest, NullOptNotEq) {
1485 {
1486 Optional<int> opt;
1487 EXPECT_FALSE(base::nullopt != opt);
1488 }
1489 {
1490 Optional<int> opt(1);
1491 EXPECT_TRUE(base::nullopt != opt);
1492 }
1493}
1494
1495TEST(OptionalTest, OptNullLower) {
1496 {
1497 Optional<int> opt;
1498 EXPECT_FALSE(opt < base::nullopt);
1499 }
1500 {
1501 Optional<int> opt(1);
1502 EXPECT_FALSE(opt < base::nullopt);
1503 }
1504}
1505
1506TEST(OptionalTest, NullOptLower) {
1507 {
1508 Optional<int> opt;
1509 EXPECT_FALSE(base::nullopt < opt);
1510 }
1511 {
1512 Optional<int> opt(1);
1513 EXPECT_TRUE(base::nullopt < opt);
1514 }
1515}
1516
1517TEST(OptionalTest, OptNullLowerEq) {
1518 {
1519 Optional<int> opt;
1520 EXPECT_TRUE(opt <= base::nullopt);
1521 }
1522 {
1523 Optional<int> opt(1);
1524 EXPECT_FALSE(opt <= base::nullopt);
1525 }
1526}
1527
1528TEST(OptionalTest, NullOptLowerEq) {
1529 {
1530 Optional<int> opt;
1531 EXPECT_TRUE(base::nullopt <= opt);
1532 }
1533 {
1534 Optional<int> opt(1);
1535 EXPECT_TRUE(base::nullopt <= opt);
1536 }
1537}
1538
1539TEST(OptionalTest, OptNullGreater) {
1540 {
1541 Optional<int> opt;
1542 EXPECT_FALSE(opt > base::nullopt);
1543 }
1544 {
1545 Optional<int> opt(1);
1546 EXPECT_TRUE(opt > base::nullopt);
1547 }
1548}
1549
1550TEST(OptionalTest, NullOptGreater) {
1551 {
1552 Optional<int> opt;
1553 EXPECT_FALSE(base::nullopt > opt);
1554 }
1555 {
1556 Optional<int> opt(1);
1557 EXPECT_FALSE(base::nullopt > opt);
1558 }
1559}
1560
1561TEST(OptionalTest, OptNullGreaterEq) {
1562 {
1563 Optional<int> opt;
1564 EXPECT_TRUE(opt >= base::nullopt);
1565 }
1566 {
1567 Optional<int> opt(1);
1568 EXPECT_TRUE(opt >= base::nullopt);
1569 }
1570}
1571
1572TEST(OptionalTest, NullOptGreaterEq) {
1573 {
1574 Optional<int> opt;
1575 EXPECT_TRUE(base::nullopt >= opt);
1576 }
1577 {
1578 Optional<int> opt(1);
1579 EXPECT_FALSE(base::nullopt >= opt);
1580 }
1581}
1582
1583TEST(OptionalTest, ValueEq_Empty) {
1584 Optional<int> opt;
1585 EXPECT_FALSE(opt == 1);
1586}
1587
1588TEST(OptionalTest, ValueEq_NotEmpty) {
1589 {
1590 Optional<int> opt(0);
1591 EXPECT_FALSE(opt == 1);
1592 }
1593 {
1594 Optional<int> opt(1);
1595 EXPECT_TRUE(opt == 1);
1596 }
1597}
1598
1599TEST(OptionalTest, ValueEq_DifferentType) {
1600 Optional<int> opt(0);
1601 EXPECT_TRUE(opt == 0.0);
1602}
1603
1604TEST(OptionalTest, EqValue_Empty) {
1605 Optional<int> opt;
1606 EXPECT_FALSE(1 == opt);
1607}
1608
1609TEST(OptionalTest, EqValue_NotEmpty) {
1610 {
1611 Optional<int> opt(0);
1612 EXPECT_FALSE(1 == opt);
1613 }
1614 {
1615 Optional<int> opt(1);
1616 EXPECT_TRUE(1 == opt);
1617 }
1618}
1619
1620TEST(OptionalTest, EqValue_DifferentType) {
1621 Optional<int> opt(0);
1622 EXPECT_TRUE(0.0 == opt);
1623}
1624
1625TEST(OptionalTest, ValueNotEq_Empty) {
1626 Optional<int> opt;
1627 EXPECT_TRUE(opt != 1);
1628}
1629
1630TEST(OptionalTest, ValueNotEq_NotEmpty) {
1631 {
1632 Optional<int> opt(0);
1633 EXPECT_TRUE(opt != 1);
1634 }
1635 {
1636 Optional<int> opt(1);
1637 EXPECT_FALSE(opt != 1);
1638 }
1639}
1640
1641TEST(OPtionalTest, ValueNotEq_DifferentType) {
1642 Optional<int> opt(0);
1643 EXPECT_FALSE(opt != 0.0);
1644}
1645
1646TEST(OptionalTest, NotEqValue_Empty) {
1647 Optional<int> opt;
1648 EXPECT_TRUE(1 != opt);
1649}
1650
1651TEST(OptionalTest, NotEqValue_NotEmpty) {
1652 {
1653 Optional<int> opt(0);
1654 EXPECT_TRUE(1 != opt);
1655 }
1656 {
1657 Optional<int> opt(1);
1658 EXPECT_FALSE(1 != opt);
1659 }
1660}
1661
1662TEST(OptionalTest, NotEqValue_DifferentType) {
1663 Optional<int> opt(0);
1664 EXPECT_FALSE(0.0 != opt);
1665}
1666
1667TEST(OptionalTest, ValueLess_Empty) {
1668 Optional<int> opt;
1669 EXPECT_TRUE(opt < 1);
1670}
1671
1672TEST(OptionalTest, ValueLess_NotEmpty) {
1673 {
1674 Optional<int> opt(0);
1675 EXPECT_TRUE(opt < 1);
1676 }
1677 {
1678 Optional<int> opt(1);
1679 EXPECT_FALSE(opt < 1);
1680 }
1681 {
1682 Optional<int> opt(2);
1683 EXPECT_FALSE(opt < 1);
1684 }
1685}
1686
1687TEST(OPtionalTest, ValueLess_DifferentType) {
1688 Optional<int> opt(0);
1689 EXPECT_TRUE(opt < 1.0);
1690}
1691
1692TEST(OptionalTest, LessValue_Empty) {
1693 Optional<int> opt;
1694 EXPECT_FALSE(1 < opt);
1695}
1696
1697TEST(OptionalTest, LessValue_NotEmpty) {
1698 {
1699 Optional<int> opt(0);
1700 EXPECT_FALSE(1 < opt);
1701 }
1702 {
1703 Optional<int> opt(1);
1704 EXPECT_FALSE(1 < opt);
1705 }
1706 {
1707 Optional<int> opt(2);
1708 EXPECT_TRUE(1 < opt);
1709 }
1710}
1711
1712TEST(OptionalTest, LessValue_DifferentType) {
1713 Optional<int> opt(0);
1714 EXPECT_FALSE(0.0 < opt);
1715}
1716
1717TEST(OptionalTest, ValueLessEq_Empty) {
1718 Optional<int> opt;
1719 EXPECT_TRUE(opt <= 1);
1720}
1721
1722TEST(OptionalTest, ValueLessEq_NotEmpty) {
1723 {
1724 Optional<int> opt(0);
1725 EXPECT_TRUE(opt <= 1);
1726 }
1727 {
1728 Optional<int> opt(1);
1729 EXPECT_TRUE(opt <= 1);
1730 }
1731 {
1732 Optional<int> opt(2);
1733 EXPECT_FALSE(opt <= 1);
1734 }
1735}
1736
1737TEST(OptionalTest, ValueLessEq_DifferentType) {
1738 Optional<int> opt(0);
1739 EXPECT_TRUE(opt <= 0.0);
1740}
1741
1742TEST(OptionalTest, LessEqValue_Empty) {
1743 Optional<int> opt;
1744 EXPECT_FALSE(1 <= opt);
1745}
1746
1747TEST(OptionalTest, LessEqValue_NotEmpty) {
1748 {
1749 Optional<int> opt(0);
1750 EXPECT_FALSE(1 <= opt);
1751 }
1752 {
1753 Optional<int> opt(1);
1754 EXPECT_TRUE(1 <= opt);
1755 }
1756 {
1757 Optional<int> opt(2);
1758 EXPECT_TRUE(1 <= opt);
1759 }
1760}
1761
1762TEST(OptionalTest, LessEqValue_DifferentType) {
1763 Optional<int> opt(0);
1764 EXPECT_TRUE(0.0 <= opt);
1765}
1766
1767TEST(OptionalTest, ValueGreater_Empty) {
1768 Optional<int> opt;
1769 EXPECT_FALSE(opt > 1);
1770}
1771
1772TEST(OptionalTest, ValueGreater_NotEmpty) {
1773 {
1774 Optional<int> opt(0);
1775 EXPECT_FALSE(opt > 1);
1776 }
1777 {
1778 Optional<int> opt(1);
1779 EXPECT_FALSE(opt > 1);
1780 }
1781 {
1782 Optional<int> opt(2);
1783 EXPECT_TRUE(opt > 1);
1784 }
1785}
1786
1787TEST(OptionalTest, ValueGreater_DifferentType) {
1788 Optional<int> opt(0);
1789 EXPECT_FALSE(opt > 0.0);
1790}
1791
1792TEST(OptionalTest, GreaterValue_Empty) {
1793 Optional<int> opt;
1794 EXPECT_TRUE(1 > opt);
1795}
1796
1797TEST(OptionalTest, GreaterValue_NotEmpty) {
1798 {
1799 Optional<int> opt(0);
1800 EXPECT_TRUE(1 > opt);
1801 }
1802 {
1803 Optional<int> opt(1);
1804 EXPECT_FALSE(1 > opt);
1805 }
1806 {
1807 Optional<int> opt(2);
1808 EXPECT_FALSE(1 > opt);
1809 }
1810}
1811
1812TEST(OptionalTest, GreaterValue_DifferentType) {
1813 Optional<int> opt(0);
1814 EXPECT_FALSE(0.0 > opt);
1815}
1816
1817TEST(OptionalTest, ValueGreaterEq_Empty) {
1818 Optional<int> opt;
1819 EXPECT_FALSE(opt >= 1);
1820}
1821
1822TEST(OptionalTest, ValueGreaterEq_NotEmpty) {
1823 {
1824 Optional<int> opt(0);
1825 EXPECT_FALSE(opt >= 1);
1826 }
1827 {
1828 Optional<int> opt(1);
1829 EXPECT_TRUE(opt >= 1);
1830 }
1831 {
1832 Optional<int> opt(2);
1833 EXPECT_TRUE(opt >= 1);
1834 }
1835}
1836
1837TEST(OptionalTest, ValueGreaterEq_DifferentType) {
1838 Optional<int> opt(0);
1839 EXPECT_TRUE(opt <= 0.0);
1840}
1841
1842TEST(OptionalTest, GreaterEqValue_Empty) {
1843 Optional<int> opt;
1844 EXPECT_TRUE(1 >= opt);
1845}
1846
1847TEST(OptionalTest, GreaterEqValue_NotEmpty) {
1848 {
1849 Optional<int> opt(0);
1850 EXPECT_TRUE(1 >= opt);
1851 }
1852 {
1853 Optional<int> opt(1);
1854 EXPECT_TRUE(1 >= opt);
1855 }
1856 {
1857 Optional<int> opt(2);
1858 EXPECT_FALSE(1 >= opt);
1859 }
1860}
1861
1862TEST(OptionalTest, GreaterEqValue_DifferentType) {
1863 Optional<int> opt(0);
1864 EXPECT_TRUE(0.0 >= opt);
1865}
1866
1867TEST(OptionalTest, NotEquals) {
1868 {
1869 Optional<float> a(0.1f);
1870 Optional<float> b(0.2f);
1871 EXPECT_NE(a, b);
1872 }
1873
1874 {
1875 Optional<std::string> a("foo");
1876 Optional<std::string> b("bar");
1877 EXPECT_NE(a, b);
1878 }
1879
1880 {
1881 Optional<int> a(1);
1882 Optional<double> b(2);
1883 EXPECT_NE(a, b);
1884 }
1885
1886 {
1887 Optional<TestObject> a(TestObject(3, 0.1));
1888 Optional<TestObject> b(TestObject(4, 1.0));
1889 EXPECT_TRUE(a != b);
1890 }
1891}
1892
1893TEST(OptionalTest, NotEqualsNull) {
1894 {
1895 Optional<float> a(0.1f);
1896 Optional<float> b(0.1f);
1897 b = base::nullopt;
1898 EXPECT_NE(a, b);
1899 }
1900
1901 {
1902 Optional<std::string> a("foo");
1903 Optional<std::string> b("foo");
1904 b = base::nullopt;
1905 EXPECT_NE(a, b);
1906 }
1907
1908 {
1909 Optional<TestObject> a(TestObject(3, 0.1));
1910 Optional<TestObject> b(TestObject(3, 0.1));
1911 b = base::nullopt;
1912 EXPECT_TRUE(a != b);
1913 }
1914}
1915
1916TEST(OptionalTest, MakeOptional) {
1917 {
1918 // Use qualified base::make_optional here and elsewhere to avoid the name
1919 // confliction to std::make_optional.
1920 // The name conflict happens only for types in std namespace, such as
1921 // std::string. The other qualified base::make_optional usages are just for
1922 // consistency.
1923 Optional<float> o = base::make_optional(32.f);
1924 EXPECT_TRUE(o);
1925 EXPECT_EQ(32.f, *o);
1926
1927 float value = 3.f;
1928 o = base::make_optional(std::move(value));
1929 EXPECT_TRUE(o);
1930 EXPECT_EQ(3.f, *o);
1931 }
1932
1933 {
1934 Optional<std::string> o = base::make_optional(std::string("foo"));
1935 EXPECT_TRUE(o);
1936 EXPECT_EQ("foo", *o);
1937
1938 std::string value = "bar";
1939 o = base::make_optional(std::move(value));
1940 EXPECT_TRUE(o);
1941 EXPECT_EQ(std::string("bar"), *o);
1942 }
1943
1944 {
1945 Optional<TestObject> o = base::make_optional(TestObject(3, 0.1));
1946 EXPECT_TRUE(!!o);
1947 EXPECT_TRUE(TestObject(3, 0.1) == *o);
1948
1949 TestObject value = TestObject(0, 0.42);
1950 o = base::make_optional(std::move(value));
1951 EXPECT_TRUE(!!o);
1952 EXPECT_TRUE(TestObject(0, 0.42) == *o);
1953 EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
1954 EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
1955
1956 EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
1957 base::make_optional(std::move(value))->state());
1958 }
1959
1960 {
1961 struct Test {
1962 Test(int x, double y, bool z) : a(x), b(y), c(z) {}
1963
1964 int a;
1965 double b;
1966 bool c;
1967 };
1968
1969 Optional<Test> o = base::make_optional<Test>(1, 2.0, true);
1970 EXPECT_TRUE(!!o);
1971 EXPECT_EQ(1, o->a);
1972 EXPECT_EQ(2.0, o->b);
1973 EXPECT_TRUE(o->c);
1974 }
1975
1976 {
1977 auto str1 = base::make_optional<std::string>({'1', '2', '3'});
1978 EXPECT_EQ("123", *str1);
1979
1980 auto str2 = base::make_optional<std::string>({'a', 'b', 'c'},
1981 std::allocator<char>());
1982 EXPECT_EQ("abc", *str2);
1983 }
1984}
1985
1986TEST(OptionalTest, NonMemberSwap_bothNoValue) {
1987 Optional<TestObject> a, b;
1988 base::swap(a, b);
1989
1990 EXPECT_FALSE(!!a);
1991 EXPECT_FALSE(!!b);
1992 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
1993 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
1994}
1995
1996TEST(OptionalTest, NonMemberSwap_inHasValue) {
1997 Optional<TestObject> a(TestObject(1, 0.3));
1998 Optional<TestObject> b;
1999 base::swap(a, b);
2000
2001 EXPECT_FALSE(!!a);
2002 EXPECT_TRUE(!!b);
2003 EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
2004 EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
2005}
2006
2007TEST(OptionalTest, NonMemberSwap_outHasValue) {
2008 Optional<TestObject> a;
2009 Optional<TestObject> b(TestObject(1, 0.3));
2010 base::swap(a, b);
2011
2012 EXPECT_TRUE(!!a);
2013 EXPECT_FALSE(!!b);
2014 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2015 EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
2016}
2017
2018TEST(OptionalTest, NonMemberSwap_bothValue) {
2019 Optional<TestObject> a(TestObject(0, 0.1));
2020 Optional<TestObject> b(TestObject(1, 0.3));
2021 base::swap(a, b);
2022
2023 EXPECT_TRUE(!!a);
2024 EXPECT_TRUE(!!b);
2025 EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
2026 EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
2027 EXPECT_EQ(TestObject::State::SWAPPED, a->state());
2028 EXPECT_EQ(TestObject::State::SWAPPED, b->state());
2029}
2030
2031TEST(OptionalTest, Hash_OptionalReflectsInternal) {
2032 {
2033 std::hash<int> int_hash;
2034 std::hash<Optional<int>> opt_int_hash;
2035
2036 EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
2037 }
2038
2039 {
2040 std::hash<std::string> str_hash;
2041 std::hash<Optional<std::string>> opt_str_hash;
2042
2043 EXPECT_EQ(str_hash(std::string("foobar")),
2044 opt_str_hash(Optional<std::string>(std::string("foobar"))));
2045 }
2046}
2047
2048TEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
2049 std::hash<Optional<int>> opt_int_hash;
2050 std::hash<Optional<std::string>> opt_str_hash;
2051
2052 EXPECT_EQ(opt_str_hash(Optional<std::string>()),
2053 opt_int_hash(Optional<int>()));
2054}
2055
2056TEST(OptionalTest, Hash_UseInSet) {
2057 std::set<Optional<int>> setOptInt;
2058
2059 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2060
2061 setOptInt.insert(Optional<int>(3));
2062 EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
2063 EXPECT_NE(setOptInt.end(), setOptInt.find(3));
2064}
2065
2066TEST(OptionalTest, HasValue) {
2067 Optional<int> a;
2068 EXPECT_FALSE(a.has_value());
2069
2070 a = 42;
2071 EXPECT_TRUE(a.has_value());
2072
2073 a = nullopt;
2074 EXPECT_FALSE(a.has_value());
2075
2076 a = 0;
2077 EXPECT_TRUE(a.has_value());
2078
2079 a = Optional<int>();
2080 EXPECT_FALSE(a.has_value());
2081}
2082
2083TEST(OptionalTest, Reset_int) {
2084 Optional<int> a(0);
2085 EXPECT_TRUE(a.has_value());
2086 EXPECT_EQ(0, a.value());
2087
2088 a.reset();
2089 EXPECT_FALSE(a.has_value());
2090 EXPECT_EQ(-1, a.value_or(-1));
2091}
2092
2093TEST(OptionalTest, Reset_Object) {
2094 Optional<TestObject> a(TestObject(0, 0.1));
2095 EXPECT_TRUE(a.has_value());
2096 EXPECT_EQ(TestObject(0, 0.1), a.value());
2097
2098 a.reset();
2099 EXPECT_FALSE(a.has_value());
2100 EXPECT_EQ(TestObject(42, 0.0), a.value_or(TestObject(42, 0.0)));
2101}
2102
2103TEST(OptionalTest, Reset_NoOp) {
2104 Optional<int> a;
2105 EXPECT_FALSE(a.has_value());
2106
2107 a.reset();
2108 EXPECT_FALSE(a.has_value());
2109}
2110
2111TEST(OptionalTest, AssignFromRValue) {
2112 Optional<TestObject> a;
2113 EXPECT_FALSE(a.has_value());
2114
2115 TestObject obj;
2116 a = std::move(obj);
2117 EXPECT_TRUE(a.has_value());
2118 EXPECT_EQ(1, a->move_ctors_count());
2119}
2120
2121TEST(OptionalTest, DontCallDefaultCtor) {
2122 Optional<DeletedDefaultConstructor> a;
2123 EXPECT_FALSE(a.has_value());
2124
2125 a = base::make_optional<DeletedDefaultConstructor>(42);
2126 EXPECT_TRUE(a.has_value());
2127 EXPECT_EQ(42, a->foo());
2128}
2129
2130TEST(OptionalTest, DontCallNewMemberFunction) {
2131 Optional<DeleteNewOperators> a;
2132 EXPECT_FALSE(a.has_value());
2133
2134 a = DeleteNewOperators();
2135 EXPECT_TRUE(a.has_value());
2136}
2137
2138TEST(OptionalTest, Noexcept) {
2139 // Trivial copy ctor, non-trivial move ctor, nothrow move assign.
2140 struct Test1 {
2141 Test1(const Test1&) = default;
2142 Test1(Test1&&) {}
2143 Test1& operator=(Test1&&) = default;
2144 };
2145 // Non-trivial copy ctor, trivial move ctor, throw move assign.
2146 struct Test2 {
2147 Test2(const Test2&) {}
2148 Test2(Test2&&) = default;
2149 Test2& operator=(Test2&&) { return *this; }
2150 };
2151 // Trivial copy ctor, non-trivial nothrow move ctor.
2152 struct Test3 {
2153 Test3(const Test3&) = default;
2154 Test3(Test3&&) noexcept {}
2155 };
2156 // Non-trivial copy ctor, non-trivial nothrow move ctor.
2157 struct Test4 {
2158 Test4(const Test4&) {}
2159 Test4(Test4&&) noexcept {}
2160 };
2161 // Non-trivial copy ctor, non-trivial move ctor.
2162 struct Test5 {
2163 Test5(const Test5&) {}
2164 Test5(Test5&&) {}
2165 };
2166
2167 static_assert(
2168 noexcept(Optional<int>(std::declval<Optional<int>>())),
2169 "move constructor for noexcept move-constructible T must be noexcept "
2170 "(trivial copy, trivial move)");
2171 static_assert(
2172 !noexcept(Optional<Test1>(std::declval<Optional<Test1>>())),
2173 "move constructor for non-noexcept move-constructible T must not be "
2174 "noexcept (trivial copy)");
2175 static_assert(
2176 noexcept(Optional<Test2>(std::declval<Optional<Test2>>())),
2177 "move constructor for noexcept move-constructible T must be noexcept "
2178 "(non-trivial copy, trivial move)");
2179 static_assert(
2180 noexcept(Optional<Test3>(std::declval<Optional<Test3>>())),
2181 "move constructor for noexcept move-constructible T must be noexcept "
2182 "(trivial copy, non-trivial move)");
2183 static_assert(
2184 noexcept(Optional<Test4>(std::declval<Optional<Test4>>())),
2185 "move constructor for noexcept move-constructible T must be noexcept "
2186 "(non-trivial copy, non-trivial move)");
2187 static_assert(
2188 !noexcept(Optional<Test5>(std::declval<Optional<Test5>>())),
2189 "move constructor for non-noexcept move-constructible T must not be "
2190 "noexcept (non-trivial copy)");
2191
2192 static_assert(
2193 noexcept(std::declval<Optional<int>>() = std::declval<Optional<int>>()),
2194 "move assign for noexcept move-constructible/move-assignable T "
2195 "must be noexcept");
2196 static_assert(
2197 !noexcept(std::declval<Optional<Test1>>() =
2198 std::declval<Optional<Test1>>()),
2199 "move assign for non-noexcept move-constructible T must not be noexcept");
2200 static_assert(
2201 !noexcept(std::declval<Optional<Test2>>() =
2202 std::declval<Optional<Test2>>()),
2203 "move assign for non-noexcept move-assignable T must not be noexcept");
2204}
2205
2206} // namespace base
2207} // namespace perfetto
2208
Primiano Tucci63201702020-12-04 17:38:12 +01002209#if defined(__GNUC__) || defined(__clang__)
Lalit Magantif3e5b072018-11-19 21:51:47 +00002210#pragma GCC diagnostic pop
Primiano Tucci63201702020-12-04 17:38:12 +01002211#endif