// 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
