| Index: base/optional_unittest.cc
|
| diff --git a/base/optional_unittest.cc b/base/optional_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d3b5cfb12f52365cb30e84004fb629db4da093b8
|
| --- /dev/null
|
| +++ b/base/optional_unittest.cc
|
| @@ -0,0 +1,308 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/optional.h"
|
| +
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace base {
|
| +
|
| +namespace {
|
| +
|
| +class DummyObject {
|
| + public:
|
| + DummyObject() : foo_(0), bar_(0.0) { }
|
| + DummyObject(int foo, double bar) : foo_(foo), bar_(bar) { }
|
| +
|
| + bool operator==(const DummyObject& other) const {
|
| + return foo_ == other.foo_ && bar_ == other.bar_;
|
| + }
|
| +
|
| + int foo() const { return foo_; }
|
| +
|
| + private:
|
| + int foo_;
|
| + double bar_;
|
| +};
|
| +
|
| +} // anonymous namespace
|
| +
|
| +TEST(OptionalTest, DefaultConstructor) {
|
| + {
|
| + Optional<float> o;
|
| + EXPECT_FALSE(o);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> o;
|
| + EXPECT_FALSE(o);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> o;
|
| + EXPECT_FALSE(o);
|
| + }
|
| +}
|
| +
|
| +
|
| +TEST(OptionalTest, ValueConstructor) {
|
| + {
|
| + Optional<float> o(0.1f);
|
| + EXPECT_TRUE(o);
|
| + EXPECT_EQ(o.value(), 0.1f);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> o("foo");
|
| + EXPECT_TRUE(o);
|
| + EXPECT_EQ(o.value(), "foo");
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> o(DummyObject(3, 0.1));
|
| + EXPECT_TRUE(o);
|
| + EXPECT_EQ(o.value(), DummyObject(3, 0.1));
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, CopyConstructor) {
|
| + {
|
| + Optional<float> first(0.1f);
|
| + Optional<float> other(first);
|
| +
|
| + EXPECT_TRUE(other);
|
| + EXPECT_EQ(other.value(), 0.1f);
|
| + EXPECT_EQ(first, other);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> first("foo");
|
| + Optional<std::string> other(first);
|
| +
|
| + EXPECT_TRUE(other);
|
| + EXPECT_EQ(other.value(), "foo");
|
| + EXPECT_EQ(first, other);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> first(DummyObject(3, 0.1));
|
| + Optional<DummyObject> other(first);
|
| +
|
| + EXPECT_TRUE(other);
|
| + EXPECT_EQ(other.value(), DummyObject(3, 0.1));
|
| + EXPECT_EQ(first, other);
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, Equals) {
|
| + {
|
| + Optional<float> a(0.1f);
|
| + Optional<float> b(0.1f);
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> a("foo");
|
| + Optional<std::string> b("foo");
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> a(DummyObject(3, 0.1));
|
| + Optional<DummyObject> b(DummyObject(3, 0.1));
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, EqualsNull) {
|
| + {
|
| + Optional<float> a(0.1f);
|
| + Optional<float> b(0.2f);
|
| + a = nullptr;
|
| + b = nullptr;
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> a("foo");
|
| + Optional<std::string> b("bar");
|
| + a = nullptr;
|
| + b = nullptr;
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> a(DummyObject(3, 0.1));
|
| + Optional<DummyObject> b(DummyObject(4, 1.0));
|
| + a = nullptr;
|
| + b = nullptr;
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, NotEquals) {
|
| + {
|
| + Optional<float> a(0.1f);
|
| + Optional<float> b(0.2f);
|
| + EXPECT_NE(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> a("foo");
|
| + Optional<std::string> b("bar");
|
| + EXPECT_NE(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> a(DummyObject(3, 0.1));
|
| + Optional<DummyObject> b(DummyObject(4, 1.0));
|
| + EXPECT_NE(a, b);
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, NotEqualsNull) {
|
| + {
|
| + Optional<float> a(0.1f);
|
| + Optional<float> b(0.1f);
|
| + b = nullptr;
|
| + EXPECT_NE(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> a("foo");
|
| + Optional<std::string> b("foo");
|
| + b = nullptr;
|
| + EXPECT_NE(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> a(DummyObject(3, 0.1));
|
| + Optional<DummyObject> b(DummyObject(3, 0.1));
|
| + b = nullptr;
|
| + EXPECT_NE(a, b);
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, AssignValue) {
|
| + {
|
| + Optional<float> a;
|
| + EXPECT_FALSE(a);
|
| + a = 0.1f;
|
| + EXPECT_TRUE(a);
|
| +
|
| + Optional<float> b(0.1f);
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> a;
|
| + EXPECT_FALSE(a);
|
| + a = "foo";
|
| + EXPECT_TRUE(a);
|
| +
|
| + Optional<std::string> b("foo");
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> a;
|
| + EXPECT_FALSE(a);
|
| + a = DummyObject(3, 0.1);
|
| + EXPECT_TRUE(a);
|
| +
|
| + Optional<DummyObject> b(DummyObject(3, 0.1));
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, AssignObject) {
|
| + {
|
| + Optional<float> a;
|
| + Optional<float> b(0.1f);
|
| + a = b;
|
| +
|
| + EXPECT_TRUE(a);
|
| + EXPECT_EQ(a.value(), 0.1f);
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> a;
|
| + Optional<std::string> b("foo");
|
| + a = b;
|
| +
|
| + EXPECT_TRUE(a);
|
| + EXPECT_EQ(a.value(), "foo");
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> a;
|
| + Optional<DummyObject> b(DummyObject(3, 0.1));
|
| + a = b;
|
| +
|
| + EXPECT_TRUE(a);
|
| + EXPECT_EQ(a.value(), DummyObject(3, 0.1));
|
| + EXPECT_EQ(a, b);
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, OperatorArrow) {
|
| + {
|
| + Optional<float> a(0.1f);
|
| + EXPECT_EQ(a.value(), *a);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> a("foo");
|
| + EXPECT_EQ(a.value(), *a);
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> a(DummyObject(3, 0.1));
|
| + EXPECT_EQ(a.value(), *a);
|
| + }
|
| +}
|
| +
|
| +TEST(OptionalTest, OperatorReference) {
|
| + Optional<DummyObject> a(DummyObject(3, 0.1));
|
| + EXPECT_EQ(a->foo(), 3);
|
| +}
|
| +
|
| +TEST(OptionalTest, ValueOr) {
|
| + {
|
| + Optional<float> a;
|
| + EXPECT_EQ(a.value_or(0.0f), 0.0f);
|
| +
|
| + a = 0.1f;
|
| + EXPECT_EQ(a.value_or(0.0f), 0.1f);
|
| +
|
| + a = nullptr;
|
| + EXPECT_EQ(a.value_or(0.0f), 0.0f);
|
| + }
|
| +
|
| + {
|
| + Optional<std::string> a;
|
| + EXPECT_EQ(a.value_or("bar"), "bar");
|
| +
|
| + a = "foo";
|
| + EXPECT_EQ(a.value_or("bar"), "foo");
|
| +
|
| + a = nullptr;
|
| + EXPECT_EQ(a.value_or("bar"), "bar");
|
| + }
|
| +
|
| + {
|
| + Optional<DummyObject> a;
|
| + EXPECT_EQ(a.value_or(DummyObject(1, 0.3)), DummyObject(1, 0.3));
|
| +
|
| + a = DummyObject(3, 0.1);
|
| + EXPECT_EQ(a.value_or(DummyObject(1, 0.3)), DummyObject(3, 0.1));
|
| +
|
| + a = nullptr;
|
| + EXPECT_EQ(a.value_or(DummyObject(1, 0.3)), DummyObject(1, 0.3));
|
| + }
|
| +}
|
| +
|
| +} // namespace base
|
|
|