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