#include "../collections/Vector.hpp"
#include <stdio.h>
#include <gtest/gtest.h>

class VectorTest : public testing::Test
{
protected:
	virtual void SetUp() override
	{
		testVector.PushBack(1);
		testVector.PushBack(2);
		testVector.PushBack(3);
		testVector.PushBack(5);
	}

	sprawl::collections::Vector<int> testVector;
};

TEST_F(VectorTest, BasicSetupWorks)
{
	EXPECT_EQ(1, testVector[0]);
	EXPECT_EQ(2, testVector[1]);
	EXPECT_EQ(3, testVector[2]);
	EXPECT_EQ(5, testVector[3]);
}

TEST_F(VectorTest, FrontWorks)
{
	ASSERT_EQ(1, testVector.Front());
}

TEST_F(VectorTest, BackWorks)
{
	ASSERT_EQ(5, testVector.Back());
}

TEST_F(VectorTest, IterationAndInsertWorks)
{
	for(auto it = testVector.begin(); it != testVector.end(); ++it)
	{
		if(it.Value() == 5)
		{
			testVector.Insert(it, 4);
			break;
		}
	}

	int value = 0;

	for(auto it = testVector.begin(); it != testVector.end(); ++it)
	{
		EXPECT_EQ(value + 1, it.Value());
		value = it.Value();
	}
}

TEST_F(VectorTest, PopBackWorks)
{
	testVector.PopBack();
	ASSERT_EQ(3, testVector.Back());
}

TEST_F(VectorTest, EraseWorks)
{
	for(auto it = testVector.begin(); it != testVector.end(); ++it)
	{
		if(it.Value() == 3)
		{
			testVector.Erase(it);
			break;
		}
	}

	for(auto it = testVector.begin(); it != testVector.end(); ++it)
	{
		ASSERT_NE(3, it.Value());
	}
}

TEST_F(VectorTest, GrowWorks)
{
	sprawl::collections::Vector<int> vector2(sprawl::collections::Capacity(5));

	for(int i = 1; i <= 100; ++i)
	{
		vector2.PushBack(i);
	}

	ASSERT_EQ(1, vector2.Front());

	int value = 0;
	for(auto& num : vector2)
	{
		ASSERT_EQ(value + 1, num);
		value = num;
	}

	ASSERT_EQ(100, vector2.Back());
}

TEST_F(VectorTest, NegativeIndexingWorks)
{
	ASSERT_EQ(testVector[-1], testVector.Back());
}
