//===- 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; } }