//===- FactoriesTest.cpp --------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <cstdlib>
#include "FactoriesTest.h"
#include <string>

using namespace mcld;
using namespace mcldtest;


// Constructor can do set-up work for all test here.
FactoriesTest::FactoriesTest()
{
	m_pNodeAlloc = new NodeAlloc();
	m_pFileAlloc = new FileAlloc();
}

// Destructor can do clean-up work that doesn't throw exceptions here.
FactoriesTest::~FactoriesTest()
{
	delete m_pNodeAlloc;
	delete m_pFileAlloc;
}

// SetUp() will be called immediately before each test.
void FactoriesTest::SetUp()
{
}

// TearDown() will be called immediately after each test.
void FactoriesTest::TearDown()
{
}

//==========================================================================//
// Testcases
//
TEST_F( FactoriesTest, node_produce ) {
	NodeAlloc::NodeType* node = m_pNodeAlloc->produce();
	ASSERT_EQ(1, m_pNodeAlloc->size());
	ASSERT_FALSE(m_pNodeAlloc->empty());
	node = m_pNodeAlloc->produce();
	ASSERT_EQ(2, m_pNodeAlloc->size());
	ASSERT_FALSE(m_pNodeAlloc->empty());
	node = m_pNodeAlloc->produce();
	ASSERT_EQ(3, m_pNodeAlloc->size());
	ASSERT_FALSE(m_pNodeAlloc->empty());
}

TEST_F( FactoriesTest, node_iterate ) {
	NodeAlloc::NodeType* node = 0;
	for (int i=0 ; i<100; ++i) {
		node = m_pNodeAlloc->produce();
		node->data = (int*)malloc(sizeof(int));
		*(node->data) = i;
	}

	int counter = 0;
	NodeAlloc::iterator data = m_pNodeAlloc->begin();
	NodeAlloc::iterator dEnd = m_pNodeAlloc->end();
	for (; data!=dEnd; ++data) {
		ASSERT_EQ(counter, *(*data).data );
		free((*data).data);
		(*data).data = 0;
		++counter;
	}
}

TEST_F( FactoriesTest, node_delegate_empty ) {
	NodeAlloc::NodeType* node = 0;
	for (int i=0 ; i<100; ++i) {
		node = m_pNodeAlloc->produce();
		node->data = (int*)malloc(sizeof(int));
		*(node->data) = i;
	}
	NodeAlloc* delegatee = new NodeAlloc();
	m_pNodeAlloc->delegate(*delegatee);
	ASSERT_EQ(100, m_pNodeAlloc->size());
	int counter = 0;
	NodeAlloc::iterator data = m_pNodeAlloc->begin();
	NodeAlloc::iterator dEnd = m_pNodeAlloc->end();
	for (; data!=dEnd; ++data) {
		ASSERT_EQ(counter, *(*data).data );
		free((*data).data);
		(*data).data = 0;
		++counter;
	}
	delete delegatee;
}

TEST_F( FactoriesTest, node_empty_delegate ) {
	NodeAlloc::NodeType* node = 0;
	NodeAlloc* delegatee = new NodeAlloc();
	for (int i=0 ; i<100; ++i) {
		node = delegatee->produce();
		node->data = (int*)malloc(sizeof(int));
		*(node->data) = i;
	}
	m_pNodeAlloc->delegate(*delegatee);
	ASSERT_EQ(100, m_pNodeAlloc->size());
	int counter = 0;
	NodeAlloc::iterator data = m_pNodeAlloc->begin();
	NodeAlloc::iterator dEnd = m_pNodeAlloc->end();
	for (; data!=dEnd; ++data) {
		ASSERT_EQ(counter, *(*data).data );
		free((*data).data);
		(*data).data = 0;
		++counter;
	}
	ASSERT_EQ(0, delegatee->size());
	ASSERT_TRUE(delegatee->empty());
	delete delegatee;
}

TEST_F( FactoriesTest, node_delegate ) {
	NodeAlloc::NodeType* node = 0;
	NodeAlloc* delegatee = new NodeAlloc();
	int counter = 0;
	// produce agent
	for (int i=0 ; i<100; ++i) {
		node = m_pNodeAlloc->produce();
		node->data = (int*)malloc(sizeof(int));
		*(node->data) = counter;
		++counter;
	}

	// produce delegatee
	for (int i=0 ; i<100; ++i) {
		node = delegatee->produce();
		node->data = (int*)malloc(sizeof(int));
		*(node->data) = counter;
		++counter;
	}

	m_pNodeAlloc->delegate(*delegatee);
	ASSERT_EQ(200, m_pNodeAlloc->size());
	ASSERT_FALSE(m_pNodeAlloc->empty());
	NodeAlloc::iterator data = m_pNodeAlloc->begin();
	NodeAlloc::iterator dEnd = m_pNodeAlloc->end();
	for ( counter = 0; data!=dEnd; ++data) {
		ASSERT_EQ(counter, *(*data).data );
		free((*data).data);
		(*data).data = 0;
		++counter;
	}
	ASSERT_EQ(0, delegatee->size());
	ASSERT_TRUE(delegatee->empty());
	delete delegatee;
}

TEST_F( FactoriesTest, node_delegate_self ) {
	NodeAlloc::NodeType* node = 0;
	for (int i=0 ; i<100; ++i) {
		node = m_pNodeAlloc->produce();
		node->data = (int*)malloc(sizeof(int));
		*(node->data) = i;
	}
	ASSERT_EQ(100, m_pNodeAlloc->size());
	m_pNodeAlloc->delegate(*m_pNodeAlloc);
	ASSERT_EQ(100, m_pNodeAlloc->size());
	ASSERT_FALSE(m_pNodeAlloc->empty());
}

TEST_F( FactoriesTest, file_produce ) {
	int counter = 0;
	for (counter=1; counter<1000; ++counter) {
		MCLDFile* file = m_pFileAlloc->produce();
		ASSERT_EQ(counter, m_pFileAlloc->size());
		ASSERT_FALSE(m_pFileAlloc->empty());
	}
}

TEST_F( FactoriesTest, file_produce_by_params ) {
	int counter = 0;
	for (counter=1; counter<1000; ++counter) {
		char name[100];
		sprintf(name, "file %d", counter);
		char path_name[100];
		sprintf(path_name, "/proj/mtk%d", counter);
		MCLDFile* file = m_pFileAlloc->produce( string(name),
							sys::fs::Path(string(path_name)),
							MCLDFile::Archive);
		ASSERT_EQ(counter, m_pFileAlloc->size());
		ASSERT_FALSE(m_pFileAlloc->empty());
		ASSERT_TRUE(file->isRecognized());
		ASSERT_STREQ(name, file->name().data());
	}
}

TEST_F( FactoriesTest, file_iterate ) {
	int counter = 0;
	for (counter=1; counter<1000; ++counter) {
		char name[100];
		sprintf(name, "file %d", counter);
		char path_name[100];
		sprintf(path_name, "/proj/mtk%d", counter);
		MCLDFile* file = m_pFileAlloc->produce( string(name),
							sys::fs::Path(string(path_name)),
							MCLDFile::Archive);
	}

	ASSERT_EQ(counter-1, m_pFileAlloc->size());
	ASSERT_FALSE(m_pFileAlloc->empty());

	MCLDFileFactory::iterator file = m_pFileAlloc->begin();
	MCLDFileFactory::iterator fEnd = m_pFileAlloc->end();

	while (file!=fEnd) {
		ASSERT_TRUE((*file).isRecognized());
		ASSERT_FALSE((*file).name().empty());
		++file;
	}
}

