#include "../collections/Deque.hpp"

bool test_deque()
{
	bool success = true;

	sprawl::collections::Deque<int> testDeque;

	testDeque.PushBack(3);
	testDeque.PushBack(5);
	testDeque.PushFront(2);
	testDeque.PushFront(1);

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

	if(testDeque.Front() != 1)
	{
		printf("Failed testDeque.Front()\n... ");
		success = false;
	}

	if(testDeque.Back() != 5)
	{
		printf("Failed testDeque.Back()\n... ");
		success = false;
	}
	int value = 0;

	for(auto it = testDeque.begin(); it != testDeque.end(); ++it)
	{
		if(it.Value() != value + 1)
		{
			printf("Failed iteration (%d != %d + 1)\n... ", it.Value(), value);
			success = false;
		}
		value = it.Value();
	}

	testDeque.PopFront();
	testDeque.PopBack();

	if(testDeque.Front() != 2)
	{
		printf("Failed testDeque.PopFront(): %d != 2\n... ", testDeque.Front());
		success = false;
	}

	if(testDeque.Back() != 4)
	{
		printf("Failed testDeque.PopBack(): %d != 4\n... ", testDeque.Back());
		success = false;
	}

	for(auto it = testDeque.begin(); it != testDeque.end(); ++it)
	{
		if(it.Value() == 3)
		{
			testDeque.Erase(it);
			break;
		}
	}

	for(auto it = testDeque.begin(); it != testDeque.end(); ++it)
	{
		if(it.Value() == 3)
		{
			printf("Failed erase\n... ");
			success = false;
			break;
		}
	}

	sprawl::collections::Deque<int> deque2(sprawl::collections::Capacity(5));

	for(int i = 50; i < 75; ++i)
	{
		deque2.PushBack(i);
	}
	for(int i = 49; i > 0; --i)
	{
		deque2.PushFront(i);
	}
	for(int i = 75; i <= 100; ++i)
	{
		deque2.PushBack(i);
	}

	value = 0;
	for(auto& num : deque2)
	{
		if(num != value + 1)
		{
			printf("Failed iteration after growth (%d != %d + 1)\n... ", num, value);
			success = false;
		}
		value = num;
	}

	if (deque2[-1] != deque2.Back())
	{
		printf("Failed negative indexing: %d != %d\n...", deque2[-1], deque2.Back());
		success = false;
	}

	return success;
}
