//===- GCFactoryListTraitsTest.cpp ----------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "GCFactoryListTraitsTest.h" using namespace mcld; using namespace mcldtest; // Constructor can do set-up work for all test here. GCFactoryListTraitsTest::GCFactoryListTraitsTest() { // Allocate the nodes. m_pNodesAlloc = new Node* [10]; #define ALLOCATE_NODE(i) m_pNodesAlloc[(i)] = m_NodeFactory.produce(i); ALLOCATE_NODE(0); ALLOCATE_NODE(1); ALLOCATE_NODE(2); ALLOCATE_NODE(3); ALLOCATE_NODE(4); ALLOCATE_NODE(5); ALLOCATE_NODE(6); ALLOCATE_NODE(7); ALLOCATE_NODE(8); ALLOCATE_NODE(9); #undef ALLOCATE_NODE } // Destructor can do clean-up work that doesn't throw exceptions here. GCFactoryListTraitsTest::~GCFactoryListTraitsTest() { } // SetUp() will be called immediately before each test. void GCFactoryListTraitsTest::SetUp() { // Reset the node value and (re)insert into the iplist. for (unsigned i = 0; i < 10; i++) { m_pNodesAlloc[i]->setValue(m_pNodesAlloc[i]->getInitialValue()); m_pNodeList.push_back(m_pNodesAlloc[i]); } } // TearDown() will be called immediately after each test. void GCFactoryListTraitsTest::TearDown() { // Erasing of llvm::iplist won't destroy the allocation of the nodes managed // by the GCFactory (i.e., NodeFactory.) m_pNodeList.clear(); } //==========================================================================// // Testcases // #define CHECK_NODE_VALUE(v_) do { \ ASSERT_TRUE(v_ == it->getValue()); \ it++; \ } while (false) #define CHECK_LIST_VALUE(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) do { \ llvm::iplist<Node>::const_iterator it = m_pNodeList.begin(); \ CHECK_NODE_VALUE(v1); \ CHECK_NODE_VALUE(v2); \ CHECK_NODE_VALUE(v3); \ CHECK_NODE_VALUE(v4); \ CHECK_NODE_VALUE(v5); \ CHECK_NODE_VALUE(v6); \ CHECK_NODE_VALUE(v7); \ CHECK_NODE_VALUE(v8); \ CHECK_NODE_VALUE(v9); \ CHECK_NODE_VALUE(v10); \ } while (false) TEST_F( GCFactoryListTraitsTest, Basic) { ASSERT_TRUE(10 == m_pNodeList.size()); CHECK_LIST_VALUE(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); } TEST_F( GCFactoryListTraitsTest, BasicAgain) { ASSERT_TRUE(10 == m_pNodeList.size()); CHECK_LIST_VALUE(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); } TEST_F( GCFactoryListTraitsTest, Clear) { m_pNodeList.clear(); ASSERT_TRUE(0 == m_pNodeList.size()); } TEST_F( GCFactoryListTraitsTest, PushThenPop) { Node *NewNode = m_NodeFactory.produce(11); m_pNodeList.push_back(NewNode); ASSERT_TRUE(11 == m_pNodeList.size()); m_pNodeList.pop_back(); ASSERT_TRUE(10 == m_pNodeList.size()); } TEST_F( GCFactoryListTraitsTest, CodeIterator) { // to test whether there's compilation error for const template for (llvm::iplist<Node>::const_iterator I = m_pNodeList.begin(), E = m_pNodeList.end(); I != E; I++) I->getValue(); } TEST_F( GCFactoryListTraitsTest, Empty) { ASSERT_FALSE(m_pNodeList.empty()); m_pNodeList.clear(); ASSERT_TRUE(m_pNodeList.empty()); } TEST_F( GCFactoryListTraitsTest, EraseAndSize) { ASSERT_FALSE(m_pNodeList.empty()); m_pNodeList.erase(m_pNodeList.begin()); m_pNodeList.erase(m_pNodeList.begin()); ASSERT_TRUE(m_pNodeList.size() == 8); } #undef CHECK_LIST_VALUE #undef CHECK_NODE_VALUE