#include "support/inplace_vector.h"
#include "gtest/gtest.h"

using InplaceVectorTest = ::testing::Test;

using namespace wasm;

TEST_F(InplaceVectorTest, Size) {
  inplace_vector<int32_t, 10> vec;
  // An inplace_vector is just a size plus the in-place storage.
  EXPECT_EQ(sizeof(vec), sizeof(size_t) + 10 * sizeof(int32_t));
}

TEST_F(InplaceVectorTest, Basics) {
  inplace_vector<int, 3> vec;

  EXPECT_EQ(vec.size(), 0);
  EXPECT_TRUE(vec.empty());
  vec.push_back(10);
  EXPECT_EQ(vec[0], 10);
  EXPECT_EQ(vec.size(), 1);

  vec.resize(3);
  EXPECT_EQ(vec.size(), 3);

  vec[1] = 20;
  vec[2] = 30;
  EXPECT_EQ(vec[1], 20);
  EXPECT_EQ(vec[2], 30);

  vec.pop_back();
  EXPECT_EQ(vec.size(), 2);
}

TEST_F(InplaceVectorTest, I) {
  inplace_vector<int, 3> vec{10, 20, 30};
  std::vector<int> normal;

  for (auto x : vec) {
    normal.push_back(x);
  }

  EXPECT_EQ(normal, std::vector<int>({10, 20, 30}));
}

TEST_F(InplaceVectorTest, Erase) {
  inplace_vector<int, 5> vec{10, 20, 30, 40, 50};

  // Erase single element in the middle (30 at index 2)
  auto it = vec.erase(vec.begin() + 2);
  EXPECT_EQ(*it, 40);
  EXPECT_EQ(vec.size(), 4u);
  EXPECT_EQ(vec[0], 10);
  EXPECT_EQ(vec[1], 20);
  EXPECT_EQ(vec[2], 40);
  EXPECT_EQ(vec[3], 50);

  // Erase range at beginning [10, 20]
  it = vec.erase(vec.begin(), vec.begin() + 2);
  EXPECT_EQ(*it, 40);
  EXPECT_EQ(vec.size(), 2u);
  EXPECT_EQ(vec[0], 40);
  EXPECT_EQ(vec[1], 50);

  // Erase at end
  it = vec.erase(vec.begin() + 1, vec.end());
  EXPECT_EQ(it, vec.end());
  EXPECT_EQ(vec.size(), 1u);
  EXPECT_EQ(vec[0], 40);
}

TEST_F(InplaceVectorTest, EraseIf) {
  // Test std::erase_if on inplace_vector
  inplace_vector<int, 5> vec{1, 2, 3, 4, 5};
  size_t erased = std::erase_if(vec, [](int x) { return x % 2 == 0; });
  EXPECT_EQ(erased, 2u);
  EXPECT_EQ(vec.size(), 3u);
  EXPECT_EQ(vec[0], 1);
  EXPECT_EQ(vec[1], 3);
  EXPECT_EQ(vec[2], 5);

  // Erase remaining elements
  erased = std::erase_if(vec, [](int x) { return x > 0; });
  EXPECT_EQ(erased, 3u);
  EXPECT_TRUE(vec.empty());
}

TEST_F(InplaceVectorTest, Insert) {
  inplace_vector<int, 6> vec{10, 30, 40};

  // Insert single element in middle (20 at index 1)
  auto it = vec.insert(vec.begin() + 1, 20);
  EXPECT_EQ(*it, 20);
  EXPECT_EQ(vec.size(), 4u);
  EXPECT_EQ(vec[0], 10);
  EXPECT_EQ(vec[1], 20);
  EXPECT_EQ(vec[2], 30);
  EXPECT_EQ(vec[3], 40);

  // Insert at beginning (5 at index 0)
  it = vec.insert(vec.begin(), 5);
  EXPECT_EQ(*it, 5);
  EXPECT_EQ(vec.size(), 5u);
  EXPECT_EQ(vec[0], 5);
  EXPECT_EQ(vec[1], 10);

  // Insert at end (50 at index 5)
  it = vec.insert(vec.end(), 50);
  EXPECT_EQ(*it, 50);
  EXPECT_EQ(vec.size(), 6u);
  EXPECT_EQ(vec[5], 50);
}

TEST_F(InplaceVectorTest, SortAndIteratorOps) {
  inplace_vector<int, 5> vec{40, 10, 50, 20, 30};

  // Test iterator subscripting and friend operator+
  EXPECT_EQ(vec.begin()[1], 10);
  EXPECT_EQ(*(2 + vec.begin()), 50);

  // Test std::sort on inplace_vector iterators
  std::sort(vec.begin(), vec.end());
  EXPECT_EQ(vec, (inplace_vector<int, 5>{10, 20, 30, 40, 50}));
}
