| // Copyright 2018 The Fuchsia 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 "lib/fidl/cpp/vector.h" |
| |
| #include <gtest/gtest.h> |
| |
| namespace fidl { |
| namespace { |
| |
| TEST(VectorPtr, Control) { |
| VectorPtr<int> vector; |
| EXPECT_FALSE(vector.has_value()); |
| EXPECT_FALSE(vector); |
| |
| std::vector<int> reference = {1, 2, 3}; |
| |
| vector = reference; |
| EXPECT_TRUE(vector.has_value()); |
| EXPECT_TRUE(vector); |
| EXPECT_EQ(reference, vector.value()); |
| EXPECT_EQ(reference, *vector); |
| EXPECT_EQ(3u, vector->size()); |
| |
| VectorPtr<int> other(std::move(vector)); |
| EXPECT_EQ(reference, *other); |
| |
| std::vector<int> taken = std::move(other).value(); |
| other.reset(); |
| EXPECT_FALSE(other.has_value()); |
| EXPECT_EQ(3u, taken.size()); |
| |
| VectorPtr<int> sized(3); |
| EXPECT_TRUE(sized.has_value()); |
| EXPECT_TRUE(sized); |
| EXPECT_EQ(3u, sized->size()); |
| EXPECT_EQ(0, sized->at(0)); |
| } |
| |
| TEST(VectorPtr, ResetMoveOnlyType) { |
| std::vector<std::unique_ptr<int>> original; |
| // can't use initializer list on a move-only type... |
| original.push_back(std::make_unique<int>(1)); |
| original.push_back(std::make_unique<int>(2)); |
| original.push_back(std::make_unique<int>(3)); |
| VectorPtr<std::unique_ptr<int>> vector; |
| vector = std::move(original); |
| EXPECT_TRUE(vector.has_value()); |
| EXPECT_TRUE(vector); |
| EXPECT_EQ(1, *vector->at(0)); |
| EXPECT_EQ(2, *vector->at(1)); |
| EXPECT_EQ(3, *vector->at(2)); |
| EXPECT_EQ(3u, vector->size()); |
| } |
| |
| TEST(VectorPtr, Constructors) { |
| { |
| std::vector<int> numbers({1, 2, 3, 4}); |
| VectorPtr<int> ptr(numbers); |
| EXPECT_EQ(numbers.size(), 4u); |
| EXPECT_EQ(ptr->size(), 4u); |
| } |
| { |
| std::vector<int> numbers({1, 2, 3, 4}); |
| VectorPtr<int> ptr(std::move(numbers)); |
| EXPECT_EQ(numbers.size(), 0u); |
| EXPECT_EQ(ptr->size(), 4u); |
| } |
| |
| { |
| VectorPtr<int> ptr1({1, 2, 3, 4}); |
| VectorPtr<int> ptr2(std::move(ptr1)); |
| |
| EXPECT_EQ(ptr1->size(), 0u); |
| EXPECT_EQ(ptr2->size(), 4u); |
| } |
| } |
| |
| TEST(VectorPtr, Assignment) { |
| VectorPtr<int> ptr1({1, 2, 3, 4}); |
| VectorPtr<int> ptr2; |
| |
| ptr2 = std::move(ptr1); |
| |
| EXPECT_EQ(ptr1->size(), 0u); |
| EXPECT_EQ(ptr2->size(), 4u); |
| } |
| |
| TEST(VectorPtr, StdVectorCopyable) { |
| { |
| // Copy in constructor |
| std::vector<int> vec({1, 2, 3, 4}); |
| VectorPtr<int> vecptr(vec); |
| EXPECT_EQ(vec.size(), 4u); |
| EXPECT_EQ(vecptr->size(), 4u); |
| } |
| { |
| // Move in constructor |
| std::vector<int> vec({1, 2, 3, 4}); |
| VectorPtr<int> vecptr(std::move(vec)); |
| EXPECT_EQ(vec.size(), 0u); |
| EXPECT_EQ(vecptr->size(), 4u); |
| } |
| { |
| // Copy in assignment |
| std::vector<int> vec({1, 2, 3, 4}); |
| VectorPtr<int> vecptr; |
| vecptr = vec; |
| EXPECT_EQ(vec.size(), 4u); |
| EXPECT_EQ(vecptr->size(), 4u); |
| } |
| { |
| // Move in assignment |
| std::vector<int> vec({1, 2, 3, 4}); |
| VectorPtr<int> vecptr; |
| vecptr = std::move(vec); |
| EXPECT_EQ(vec.size(), 0u); |
| EXPECT_EQ(vecptr->size(), 4u); |
| } |
| } |
| TEST(VectorPtr, StdVectorMoveOnly) { |
| auto mkvec = []() { |
| std::vector<std::unique_ptr<int>> vec; |
| vec.push_back(std::make_unique<int>(1)); |
| vec.push_back(std::make_unique<int>(2)); |
| vec.push_back(std::make_unique<int>(3)); |
| vec.push_back(std::make_unique<int>(4)); |
| return vec; |
| }; |
| { |
| // Move in constructor |
| std::vector<std::unique_ptr<int>> vec = mkvec(); |
| VectorPtr<std::unique_ptr<int>> vecptr(std::move(vec)); |
| EXPECT_EQ(vec.size(), 0u); |
| EXPECT_EQ(vecptr->size(), 4u); |
| } |
| { |
| // Move in assignment |
| std::vector<std::unique_ptr<int>> vec = mkvec(); |
| VectorPtr<std::unique_ptr<int>> vecptr; |
| vecptr = std::move(vec); |
| EXPECT_EQ(vec.size(), 0u); |
| EXPECT_EQ(vecptr->size(), 4u); |
| } |
| } |
| |
| TEST(VectorPtr, FitOptional) { |
| std::vector<int> numbers({1, 2, 3, 4}); |
| VectorPtr<int> a(numbers); |
| EXPECT_TRUE(a.has_value()); |
| EXPECT_TRUE(a); |
| EXPECT_FALSE(a->empty()); |
| EXPECT_EQ(a->size(), 4u); |
| EXPECT_EQ(*a, std::vector<int>({1, 2, 3, 4})); |
| EXPECT_EQ(a.value(), std::vector<int>({1, 2, 3, 4})); |
| EXPECT_EQ(a.value_or(std::vector<int>({1, 2})), std::vector<int>({1, 2, 3, 4})); |
| |
| numbers.push_back(5); |
| EXPECT_EQ(a->size(), 4u); |
| a.value().push_back(5); |
| EXPECT_EQ(a->size(), 5u); |
| |
| a.reset(); |
| EXPECT_FALSE(a.has_value()); |
| EXPECT_EQ(a.value_or(std::vector<int>({1, 2})), std::vector<int>({1, 2})); |
| } |
| |
| } // namespace |
| } // namespace fidl |