#include <gtest/gtest.h>

#include <torch/expanding_array.h>

#include <test/cpp/api/support.h>

#include <cstddef>
#include <initializer_list>
#include <vector>

struct ExpandingArrayTest : torch::test::SeedingFixture {};

TEST_F(ExpandingArrayTest, CanConstructFromInitializerList) {
  torch::ExpandingArray<5> e({1, 2, 3, 4, 5});
  ASSERT_EQ(e.size(), 5);
  for (size_t i = 0; i < e.size(); ++i) {
    ASSERT_EQ((*e)[i], i + 1);
  }
}

TEST_F(ExpandingArrayTest, CanConstructFromVector) {
  torch::ExpandingArray<5> e(std::vector<int64_t>{1, 2, 3, 4, 5});
  ASSERT_EQ(e.size(), 5);
  for (size_t i = 0; i < e.size(); ++i) {
    ASSERT_EQ((*e)[i], i + 1);
  }
}

TEST_F(ExpandingArrayTest, CanConstructFromArray) {
  torch::ExpandingArray<5> e(std::array<int64_t, 5>({1, 2, 3, 4, 5}));
  ASSERT_EQ(e.size(), 5);
  for (size_t i = 0; i < e.size(); ++i) {
    ASSERT_EQ((*e)[i], i + 1);
  }
}

TEST_F(ExpandingArrayTest, CanConstructFromSingleValue) {
  torch::ExpandingArray<5> e(5);
  ASSERT_EQ(e.size(), 5);
  for (size_t i = 0; i < e.size(); ++i) {
    ASSERT_EQ((*e)[i], 5);
  }
}

TEST_F(
    ExpandingArrayTest,
    ThrowsWhenConstructedWithIncorrectNumberOfArgumentsInInitializerList) {
  ASSERT_THROWS_WITH(
      torch::ExpandingArray<5>({1, 2, 3, 4, 5, 6, 7}),
      "Expected 5 values, but instead got 7");
}

TEST_F(
    ExpandingArrayTest,
    ThrowsWhenConstructedWithIncorrectNumberOfArgumentsInVector) {
  ASSERT_THROWS_WITH(
      torch::ExpandingArray<5>(std::vector<int64_t>({1, 2, 3, 4, 5, 6, 7})),
      "Expected 5 values, but instead got 7");
}
