#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#include "stack.h"
#include "queue.h"

void queue_test(void)
{
	Queue q;
	int i,x;
	srandom(time(NULL));
	printf("Beginning: QUEUE TEST\n");
	printf("Creating Queue...\n");
	Queue_Create(&q,sizeof(int));
	printf("Enqueue-ing objects...\n");
	for(i=0;i<50;i++)
	{
		x=random()&10;
		printf("Enqueue-ing %i.\n",x);
		Queue_Enqueue(&q,&x);
	}
	printf("Dequeue-ing objects...\n");
	for(i=0;i<Queue_Length(&q);i++)
	{
		printf("Dequeue-ing %i.\n",*((int*)(Queue_Next(&q))));
		Queue_Dequeue(&q);
	}
	printf("Destroying Queue...\n");
	Queue_Destroy(&q);
}

void stack_test(void)
{
	Stack stack;
	int i,x;
	srandom(time(NULL));
	printf("Beginning: STACK TEST\n");
	printf("Creating Stack...\n");
	Stack_Create(&stack,sizeof(int));
	printf("Pushing objects onto the stack...\n");
	for(i=0;i<50;i++)
	{
		x=random()%10;
		printf("Element %i will be %i.\n",i,x);
		Stack_Push(&stack,&x);
	}
	printf("Popping objects off of the stack...\n");
	for(i=0;i<Stack_Length(&stack);i++)
	{
		printf("Element %i was %x.\n",i,*((int*)Stack_Top(&stack)));
		Stack_Pop(&stack);
	}
	printf("Destroying the stack...\n");
	Stack_Destroy(&stack);
}

void list_test(void)
{
	List list;
	int i,x;
	printf("Beginning: LIST TEST\n");
	printf("Seeding rand.\n");
	srandom(time(NULL));
	printf("Phase 1:\n");
	printf("Creating List.\n");
	List_Create(&list,sizeof(int));
	printf("Phase 2:\n");
	printf("Adding one hundred members to the list.\n");
	for(i=0;i<100;i++)
	{
		x=random() % 10;
		printf("Adding member number %i: ",i);
		if(i % 2)
		{
			printf("member is added to the front.\n");
			List_Insert(&list,&x,FRONT);
		}
		else
		{
			printf("member is added to the rear.\n");
			List_Insert(&list,&x,REAR);
		}
	}
	printf("Phase 3: %i\n",List_Length(&list));
	for(i=0;i<List_Length(&list);i++)
	{
		printf("%i: %i\n",i,*((int*)(List_Position(&list,i))));
	}
	printf("Phase 4:\n");
	List_Remove(&list,0);
	printf("Removed Element 0.\n");
	List_Remove(&list,List_Length(&list)-1);
	printf("Removed Element %i.\n",List_Length(&list)-2);
	List_Remove(&list,random() % List_Length(&list));
	printf("Removed Random Element.\n");
	printf("Phase 5: %i\n",List_Length(&list));
	for(i=0;i<List_Length(&list);i++)
	{
		printf("%i: %i\n",i,*((int*)(List_Position(&list,i))));
	}
	List_Destroy(&list);
	printf("Done: %i\n",List_Length(&list));
}

int main(void)
{
	queue_test();
	stack_test();
	list_test();
	return 0;
}
