10c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez// Copyright 2016 The Chromium Authors. All rights reserved.
20c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez// Use of this source code is governed by a BSD-style license that can be
30c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez// found in the LICENSE file.
40c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
50c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#include "base/optional.h"
60c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
70c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#include <set>
80c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
90c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez#include "testing/gtest/include/gtest/gtest.h"
100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chaveznamespace base {
120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chaveznamespace {
140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez// Object used to test complex object with Optional<T> in addition of the move
160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez// semantics.
170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezclass TestObject {
180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez public:
190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  enum class State {
200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    DEFAULT_CONSTRUCTED,
210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    VALUE_CONSTRUCTED,
220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    COPY_CONSTRUCTED,
230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    MOVE_CONSTRUCTED,
240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    MOVED_FROM,
250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    COPY_ASSIGNED,
260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    MOVE_ASSIGNED,
270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    SWAPPED,
280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  };
290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  TestObject() : foo_(0), bar_(0.0), state_(State::DEFAULT_CONSTRUCTED) {}
310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  TestObject(int foo, double bar)
330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      : foo_(foo), bar_(bar), state_(State::VALUE_CONSTRUCTED) {}
340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  TestObject(const TestObject& other)
360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      : foo_(other.foo_), bar_(other.bar_), state_(State::COPY_CONSTRUCTED) {}
370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  TestObject(TestObject&& other)
390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez      : foo_(std::move(other.foo_)),
400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez        bar_(std::move(other.bar_)),
410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez        state_(State::MOVE_CONSTRUCTED) {
420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    other.state_ = State::MOVED_FROM;
430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  TestObject& operator=(const TestObject& other) {
460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    foo_ = other.foo_;
470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    bar_ = other.bar_;
480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    state_ = State::COPY_ASSIGNED;
490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    return *this;
500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  TestObject& operator=(TestObject&& other) {
530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    foo_ = other.foo_;
540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    bar_ = other.bar_;
550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    state_ = State::MOVE_ASSIGNED;
560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    other.state_ = State::MOVED_FROM;
570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    return *this;
580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  void Swap(TestObject* other) {
610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    using std::swap;
620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    swap(foo_, other->foo_);
630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    swap(bar_, other->bar_);
640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    state_ = State::SWAPPED;
650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    other->state_ = State::SWAPPED;
660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  bool operator==(const TestObject& other) const {
690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    return foo_ == other.foo_ && bar_ == other.bar_;
700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  int foo() const { return foo_; }
730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  State state() const { return state_; }
740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez private:
760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  int foo_;
770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  double bar_;
780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  State state_;
790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez};
800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez// Implementing Swappable concept.
820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezvoid swap(TestObject& lhs, TestObject& rhs) {
830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  lhs.Swap(&rhs);
840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezclass NonTriviallyDestructible {
870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  ~NonTriviallyDestructible() {}
880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez};
890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}  // anonymous namespace
910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezstatic_assert(is_trivially_destructible<Optional<int>>::value,
930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez              "OptionalIsTriviallyDestructible");
940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavezstatic_assert(
960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    !is_trivially_destructible<Optional<NonTriviallyDestructible>>::value,
970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    "OptionalIsTriviallyDestructible");
980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, DefaultConstructor) {
1000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> o;
1020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(o);
1030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> o;
1070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(o);
1080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> o;
1120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(o);
1130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
1150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, CopyConstructor) {
1170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> first(0.1f);
1190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> other(first);
1200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(other);
1220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(other.value(), 0.1f);
1230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(first, other);
1240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> first("foo");
1280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> other(first);
1290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(other);
1310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(other.value(), "foo");
1320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(first, other);
1330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> first(TestObject(3, 0.1));
1370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> other(first);
1380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!other);
1400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(other.value() == TestObject(3, 0.1));
1410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(first == other);
1420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
1440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueConstructor) {
1460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> o(0.1f);
1480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(o);
1490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(o.value(), 0.1f);
1500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> o("foo");
1540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(o);
1550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(o.value(), "foo");
1560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> o(TestObject(3, 0.1));
1600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!o);
1610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(o.value() == TestObject(3, 0.1));
1620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
1640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, MoveConstructor) {
1660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> first(0.1f);
1680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> second(std::move(first));
1690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(second);
1710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(second.value(), 0.1f);
1720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(first);
1740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> first("foo");
1780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> second(std::move(first));
1790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(second);
1810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ("foo", second.value());
1820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(first);
1840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
1870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> first(TestObject(3, 0.1));
1880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> second(std::move(first));
1890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!second);
1910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
1920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(TestObject(3, 0.1) == second.value());
1930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!first);
1950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
1960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
1970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
1980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
1990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, MoveValueConstructor) {
2000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> first(0.1f);
2020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> second(std::move(first.value()));
2030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(second);
2050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(second.value(), 0.1f);
2060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(first);
2080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> first("foo");
2120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> second(std::move(first.value()));
2130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(second);
2150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ("foo", second.value());
2160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(first);
2180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> first(TestObject(3, 0.1));
2220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> second(std::move(first.value()));
2230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!second);
2250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, second->state());
2260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(TestObject(3, 0.1) == second.value());
2270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!first);
2290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVED_FROM, first->state());
2300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
2320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ConstructorForwardArguments) {
2340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a(base::in_place, 0.1f);
2360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
2370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(0.1f, a.value());
2380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a(base::in_place, "foo");
2420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
2430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ("foo", a.value());
2440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a(base::in_place, 0, 0.1);
2480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
2490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(TestObject(0, 0.1) == a.value());
2500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
2520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NulloptConstructor) {
2540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a = base::nullopt;
2550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(a);
2560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
2570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, AssignValue) {
2590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a;
2610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(a);
2620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = 0.1f;
2630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
2640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> b(0.1f);
2660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a == b);
2670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a;
2710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(a);
2720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = std::string("foo");
2730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
2740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> b(std::string("foo"));
2760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a, b);
2770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a;
2810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(!!a);
2820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = TestObject(3, 0.1);
2830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
2840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(3, 0.1));
2860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a == b);
2870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
2900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a = TestObject(4, 1.0);
2910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
2920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = TestObject(3, 0.1);
2930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
2940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
2950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(3, 0.1));
2960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a == b);
2970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
2980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
2990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, AssignObject) {
3010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a;
3030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> b(0.1f);
3040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = b;
3050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
3070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a.value(), 0.1f);
3080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a, b);
3090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a;
3130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> b("foo");
3140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = b;
3150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
3170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a.value(), "foo");
3180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a, b);
3190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a;
3230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(3, 0.1));
3240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = b;
3250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
3270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a.value() == TestObject(3, 0.1));
3280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a == b);
3290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a(TestObject(4, 1.0));
3330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(3, 0.1));
3340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = b;
3350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
3370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a.value() == TestObject(3, 0.1));
3380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a == b);
3390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
3410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, AssignObject_rvalue) {
3430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a;
3450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> b(0.1f);
3460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = std::move(b);
3470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
3490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(b);
3500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(0.1f, a.value());
3510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a;
3550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> b("foo");
3560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = std::move(b);
3570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
3590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(b);
3600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ("foo", a.value());
3610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a;
3650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(3, 0.1));
3660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = std::move(b);
3670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
3690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!b);
3700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(TestObject(3, 0.1) == a.value());
3710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED, a->state());
3730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
3740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a(TestObject(4, 1.0));
3780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(3, 0.1));
3790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = std::move(b);
3800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
3820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!b);
3830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(TestObject(3, 0.1) == a.value());
3840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, a->state());
3860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVED_FROM, b->state());
3870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
3890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, AssignNull) {
3910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
3920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a(0.1f);
3930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> b(0.2f);
3940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = base::nullopt;
3950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    b = base::nullopt;
3960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a, b);
3970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
3980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
3990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
4000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a("foo");
4010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> b("bar");
4020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = base::nullopt;
4030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    b = base::nullopt;
4040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a, b);
4050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
4080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a(TestObject(3, 0.1));
4090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(4, 1.0));
4100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = base::nullopt;
4110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    b = base::nullopt;
4120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a == b);
4130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
4150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OperatorStar) {
4170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
4180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a(0.1f);
4190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a.value(), *a);
4200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
4230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a("foo");
4240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a.value(), *a);
4250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
4280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a(TestObject(3, 0.1));
4290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(a.value(), *a);
4300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
4320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OperatorStar_rvalue) {
4340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(0.1f, *Optional<float>(0.1f));
4350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(std::string("foo"), *Optional<std::string>("foo"));
4360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(3, 0.1) == *Optional<TestObject>(TestObject(3, 0.1)));
4370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
4380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OperatorArrow) {
4400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a(TestObject(3, 0.1));
4410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(a->foo(), 3);
4420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
4430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Value_rvalue) {
4450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(0.1f, Optional<float>(0.1f).value());
4460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(std::string("foo"), Optional<std::string>("foo").value());
4470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(3, 0.1) ==
4480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez              Optional<TestObject>(TestObject(3, 0.1)).value());
4490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
4500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueOr) {
4520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
4530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a;
4540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(0.0f, a.value_or(0.0f));
4550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = 0.1f;
4570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(0.1f, a.value_or(0.0f));
4580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = base::nullopt;
4600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(0.0f, a.value_or(0.0f));
4610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
4640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a;
4650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ("bar", a.value_or("bar"));
4660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = std::string("foo");
4680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(std::string("foo"), a.value_or("bar"));
4690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = base::nullopt;
4710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(std::string("bar"), a.value_or("bar"));
4720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
4750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a;
4760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
4770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = TestObject(3, 0.1);
4790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(3, 0.1));
4800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a = base::nullopt;
4820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a.value_or(TestObject(1, 0.3)) == TestObject(1, 0.3));
4830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
4840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
4850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Swap_bothNoValue) {
4870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a, b;
4880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  a.swap(b);
4890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(a);
4910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(b);
4920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
4930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
4940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
4950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
4960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Swap_inHasValue) {
4970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a(TestObject(1, 0.3));
4980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> b;
4990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  a.swap(b);
5000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(a);
5020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(!!b);
5040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
5050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
5060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Swap_outHasValue) {
5090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a;
5100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> b(TestObject(1, 0.3));
5110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  a.swap(b);
5120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(!!a);
5140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(!!b);
5150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
5160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
5170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Swap_bothValue) {
5200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a(TestObject(0, 0.1));
5210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> b(TestObject(1, 0.3));
5220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  a.swap(b);
5230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(!!a);
5250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(!!b);
5260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
5270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
5280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(TestObject::State::SWAPPED, a->state());
5290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(TestObject::State::SWAPPED, b->state());
5300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Emplace) {
5330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
5340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a(0.1f);
5350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a.emplace(0.3f);
5360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
5380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(0.3f, a.value());
5390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
5400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
5420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a("foo");
5430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a.emplace("bar");
5440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a);
5460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ("bar", a.value());
5470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
5480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
5500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a(TestObject(0, 0.1));
5510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    a.emplace(TestObject(1, 0.2));
5520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!a);
5540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(TestObject(1, 0.2) == a.value());
5550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
5560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Equals_TwoEmpty) {
5590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a;
5600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> b;
5610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(a == b);
5630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Equals_TwoEquals) {
5660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a(1);
5670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> b(1);
5680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(a == b);
5700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Equals_OneEmpty) {
5730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a;
5740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> b(1);
5750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(a == b);
5770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Equals_TwoDifferent) {
5800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a(0);
5810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> b(1);
5820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(a == b);
5840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NotEquals_TwoEmpty) {
5870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a;
5880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> b;
5890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(a != b);
5910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NotEquals_TwoEquals) {
5940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a(1);
5950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> b(1);
5960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
5970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(a != b);
5980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
5990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NotEquals_OneEmpty) {
6010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a;
6020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> b(1);
6030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(a != b);
6050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NotEquals_TwoDifferent) {
6080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> a(0);
6090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> b(1);
6100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(a != b);
6120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Less_LeftEmpty) {
6150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l;
6160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r(1);
6170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(l < r);
6190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Less_RightEmpty) {
6220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l(1);
6230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r;
6240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(l < r);
6260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Less_BothEmpty) {
6290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l;
6300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r;
6310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(l < r);
6330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Less_BothValues) {
6360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
6370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(1);
6380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(2);
6390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(l < r);
6410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
6420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
6430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(2);
6440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(1);
6450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(l < r);
6470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
6480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
6490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(1);
6500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(1);
6510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(l < r);
6530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
6540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, LessEq_LeftEmpty) {
6570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l;
6580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r(1);
6590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(l <= r);
6610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, LessEq_RightEmpty) {
6640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l(1);
6650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r;
6660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(l <= r);
6680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, LessEq_BothEmpty) {
6710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l;
6720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r;
6730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(l <= r);
6750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, LessEq_BothValues) {
6780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
6790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(1);
6800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(2);
6810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(l <= r);
6830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
6840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
6850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(2);
6860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(1);
6870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(l <= r);
6890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
6900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
6910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(1);
6920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(1);
6930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(l <= r);
6950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
6960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
6970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
6980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Greater_BothEmpty) {
6990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l;
7000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r;
7010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(l > r);
7030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Greater_LeftEmpty) {
7060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l;
7070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r(1);
7080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(l > r);
7100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Greater_RightEmpty) {
7130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l(1);
7140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r;
7150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(l > r);
7170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Greater_BothValue) {
7200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(1);
7220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(2);
7230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(l > r);
7250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(2);
7280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(1);
7290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(l > r);
7310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(1);
7340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(1);
7350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(l > r);
7370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, GreaterEq_BothEmpty) {
7410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l;
7420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r;
7430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(l >= r);
7450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, GreaterEq_LeftEmpty) {
7480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l;
7490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r(1);
7500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(l >= r);
7520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, GreaterEq_RightEmpty) {
7550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> l(1);
7560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> r;
7570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(l >= r);
7590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, GreaterEq_BothValue) {
7620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(1);
7640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(2);
7650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(l >= r);
7670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(2);
7700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(1);
7710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(l >= r);
7730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> l(1);
7760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> r(1);
7770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(l >= r);
7790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OptNullEq) {
7830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
7850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt == base::nullopt);
7860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
7890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt == base::nullopt);
7900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
7920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
7930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NullOptEq) {
7940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
7960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(base::nullopt == opt);
7970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
7980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
7990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(base::nullopt == opt);
8010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OptNullNotEq) {
8050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt != base::nullopt);
8080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt != base::nullopt);
8120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NullOptNotEq) {
8160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(base::nullopt != opt);
8190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(base::nullopt != opt);
8230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OptNullLower) {
8270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt < base::nullopt);
8300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt < base::nullopt);
8340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NullOptLower) {
8380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(base::nullopt < opt);
8410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(base::nullopt < opt);
8450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OptNullLowerEq) {
8490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt <= base::nullopt);
8520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt <= base::nullopt);
8560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NullOptLowerEq) {
8600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(base::nullopt <= opt);
8630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(base::nullopt <= opt);
8670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OptNullGreater) {
8710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt > base::nullopt);
8740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt > base::nullopt);
8780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NullOptGreater) {
8820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(base::nullopt > opt);
8850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(base::nullopt > opt);
8890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
8910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
8920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, OptNullGreaterEq) {
8930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
8950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt >= base::nullopt);
8960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
8970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
8980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
8990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt >= base::nullopt);
9000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NullOptGreaterEq) {
9040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt;
9060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(base::nullopt >= opt);
9070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
9100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(base::nullopt >= opt);
9110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueEq_Empty) {
9150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
9160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(opt == 1);
9170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueEq_NotEmpty) {
9200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
9220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt == 1);
9230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
9260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt == 1);
9270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, EqValue_Empty) {
9310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
9320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(1 == opt);
9330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, EqValue_NotEmpty) {
9360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
9380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(1 == opt);
9390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
9420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(1 == opt);
9430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueNotEq_Empty) {
9470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
9480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(opt != 1);
9490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueNotEq_NotEmpty) {
9520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
9540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt != 1);
9550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
9580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt != 1);
9590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NotEqValue_Empty) {
9630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
9640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(1 != opt);
9650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NotEqValue_NotEmpty) {
9680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
9700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(1 != opt);
9710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
9740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(1 != opt);
9750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueLess_Empty) {
9790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
9800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(opt < 1);
9810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueLess_NotEmpty) {
9840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
9860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt < 1);
9870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
9900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt < 1);
9910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
9930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(2);
9940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt < 1);
9950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
9960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
9970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
9980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, LessValue_Empty) {
9990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
10000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(1 < opt);
10010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, LessValue_NotEmpty) {
10040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
10060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(1 < opt);
10070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
10100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(1 < opt);
10110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(2);
10140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(1 < opt);
10150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueLessEq_Empty) {
10190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
10200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(opt <= 1);
10210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueLessEq_NotEmpty) {
10240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
10260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt <= 1);
10270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
10300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt <= 1);
10310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(2);
10340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt <= 1);
10350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, LessEqValue_Empty) {
10390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
10400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(1 <= opt);
10410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, LessEqValue_NotEmpty) {
10440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
10460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(1 <= opt);
10470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
10500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(1 <= opt);
10510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(2);
10540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(1 <= opt);
10550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueGreater_Empty) {
10590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
10600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(opt > 1);
10610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueGreater_NotEmpty) {
10640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
10660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt > 1);
10670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
10700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt > 1);
10710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(2);
10740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt > 1);
10750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, GreaterValue_Empty) {
10790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
10800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(1 > opt);
10810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, GreaterValue_NotEmpty) {
10840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
10860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(1 > opt);
10870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
10900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(1 > opt);
10910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
10930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(2);
10940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(1 > opt);
10950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
10960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
10970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
10980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueGreaterEq_Empty) {
10990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
11000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(opt >= 1);
11010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
11020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, ValueGreaterEq_NotEmpty) {
11040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
11060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(opt >= 1);
11070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
11100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt >= 1);
11110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(2);
11140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(opt >= 1);
11150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
11170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, GreaterEqValue_Empty) {
11190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<int> opt;
11200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(1 >= opt);
11210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
11220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, GreaterEqValue_NotEmpty) {
11240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(0);
11260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(1 >= opt);
11270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(1);
11300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(1 >= opt);
11310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<int> opt(2);
11340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_FALSE(1 >= opt);
11350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
11370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NotEquals) {
11390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a(0.1f);
11410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> b(0.2f);
11420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_NE(a, b);
11430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a("foo");
11470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> b("bar");
11480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_NE(a, b);
11490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a(TestObject(3, 0.1));
11530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(4, 1.0));
11540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a != b);
11550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
11570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NotEqualsNull) {
11590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> a(0.1f);
11610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> b(0.1f);
11620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    b = base::nullopt;
11630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_NE(a, b);
11640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> a("foo");
11680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> b("foo");
11690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    b = base::nullopt;
11700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_NE(a, b);
11710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> a(TestObject(3, 0.1));
11750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> b(TestObject(3, 0.1));
11760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    b = base::nullopt;
11770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(a != b);
11780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
11800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, MakeOptional) {
11820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<float> o = base::make_optional(32.f);
11840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(o);
11850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(32.f, *o);
11860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    float value = 3.f;
11880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    o = base::make_optional(std::move(value));
11890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(o);
11900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(3.f, *o);
11910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
11920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
11940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<std::string> o = base::make_optional(std::string("foo"));
11950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(o);
11960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ("foo", *o);
11970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
11980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    std::string value = "bar";
11990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    o = base::make_optional(std::move(value));
12000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(o);
12010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(std::string("bar"), *o);
12020c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
12030c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12040c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
12050c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    Optional<TestObject> o = base::make_optional(TestObject(3, 0.1));
12060c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!o);
12070c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(TestObject(3, 0.1) == *o);
12080c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12090c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    TestObject value = TestObject(0, 0.42);
12100c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    o = base::make_optional(std::move(value));
12110c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(!!o);
12120c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_TRUE(TestObject(0, 0.42) == *o);
12130c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVED_FROM, value.state());
12140c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVE_ASSIGNED, o->state());
12150c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12160c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(TestObject::State::MOVE_CONSTRUCTED,
12170c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez              base::make_optional(std::move(value))->state());
12180c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
12190c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
12200c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12210c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NonMemberSwap_bothNoValue) {
12220c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a, b;
12230c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  base::swap(a, b);
12240c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12250c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(!!a);
12260c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(!!b);
12270c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
12280c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
12290c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
12300c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12310c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NonMemberSwap_inHasValue) {
12320c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a(TestObject(1, 0.3));
12330c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> b;
12340c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  base::swap(a, b);
12350c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12360c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(!!a);
12370c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(!!b);
12380c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(42, 0.42) == a.value_or(TestObject(42, 0.42)));
12390c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(1, 0.3) == b.value_or(TestObject(42, 0.42)));
12400c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
12410c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12420c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NonMemberSwap_outHasValue) {
12430c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a;
12440c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> b(TestObject(1, 0.3));
12450c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  base::swap(a, b);
12460c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12470c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(!!a);
12480c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_FALSE(!!b);
12490c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
12500c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(42, 0.42) == b.value_or(TestObject(42, 0.42)));
12510c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
12520c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12530c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, NonMemberSwap_bothValue) {
12540c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> a(TestObject(0, 0.1));
12550c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  Optional<TestObject> b(TestObject(1, 0.3));
12560c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  base::swap(a, b);
12570c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12580c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(!!a);
12590c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(!!b);
12600c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(1, 0.3) == a.value_or(TestObject(42, 0.42)));
12610c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_TRUE(TestObject(0, 0.1) == b.value_or(TestObject(42, 0.42)));
12620c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(TestObject::State::SWAPPED, a->state());
12630c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(TestObject::State::SWAPPED, b->state());
12640c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
12650c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12660c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Hash_OptionalReflectsInternal) {
12670c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
12680c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    std::hash<int> int_hash;
12690c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    std::hash<Optional<int>> opt_int_hash;
12700c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12710c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(int_hash(1), opt_int_hash(Optional<int>(1)));
12720c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
12730c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12740c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  {
12750c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    std::hash<std::string> str_hash;
12760c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    std::hash<Optional<std::string>> opt_str_hash;
12770c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12780c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez    EXPECT_EQ(str_hash(std::string("foobar")),
12790c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez              opt_str_hash(Optional<std::string>(std::string("foobar"))));
12800c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  }
12810c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
12820c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12830c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Hash_NullOptEqualsNullOpt) {
12840c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  std::hash<Optional<int>> opt_int_hash;
12850c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  std::hash<Optional<std::string>> opt_str_hash;
12860c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12870c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(opt_str_hash(Optional<std::string>()),
12880c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez            opt_int_hash(Optional<int>()));
12890c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
12900c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12910c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector ChavezTEST(OptionalTest, Hash_UseInSet) {
12920c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  std::set<Optional<int>> setOptInt;
12930c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12940c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
12950c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
12960c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  setOptInt.insert(Optional<int>(3));
12970c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_EQ(setOptInt.end(), setOptInt.find(42));
12980c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez  EXPECT_NE(setOptInt.end(), setOptInt.find(3));
12990c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}
13000c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez
13010c4f26a46430b8c503c65f5cae1d2b6876d53e30Luis Hector Chavez}  // namespace base
1302