1 //===- GCFactoryListTraitsTest.cpp ----------------------------------------===// 2 // 3 // The MCLinker Project 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 #include "GCFactoryListTraitsTest.h" 10 11 using namespace mcld; 12 using namespace mcldtest; 13 14 // Constructor can do set-up work for all test here. 15 GCFactoryListTraitsTest::GCFactoryListTraitsTest() { 16 // Allocate the nodes. 17 m_pNodesAlloc = new Node* [10]; 18 #define ALLOCATE_NODE(i) m_pNodesAlloc[(i)] = m_NodeFactory.produce(i); 19 ALLOCATE_NODE(0); 20 ALLOCATE_NODE(1); 21 ALLOCATE_NODE(2); 22 ALLOCATE_NODE(3); 23 ALLOCATE_NODE(4); 24 ALLOCATE_NODE(5); 25 ALLOCATE_NODE(6); 26 ALLOCATE_NODE(7); 27 ALLOCATE_NODE(8); 28 ALLOCATE_NODE(9); 29 #undef ALLOCATE_NODE 30 } 31 32 // Destructor can do clean-up work that doesn't throw exceptions here. 33 GCFactoryListTraitsTest::~GCFactoryListTraitsTest() { 34 } 35 36 // SetUp() will be called immediately before each test. 37 void GCFactoryListTraitsTest::SetUp() { 38 // Reset the node value and (re)insert into the iplist. 39 for (unsigned i = 0; i < 10; i++) { 40 m_pNodesAlloc[i]->setValue(m_pNodesAlloc[i]->getInitialValue()); 41 m_pNodeList.push_back(m_pNodesAlloc[i]); 42 } 43 } 44 45 // TearDown() will be called immediately after each test. 46 void GCFactoryListTraitsTest::TearDown() { 47 // Erasing of llvm::iplist won't destroy the allocation of the nodes managed 48 // by the GCFactory (i.e., NodeFactory.) 49 m_pNodeList.clear(); 50 } 51 52 //==========================================================================// 53 // Testcases 54 // 55 56 #define CHECK_NODE_VALUE(v_) \ 57 do { \ 58 ASSERT_TRUE(v_ == it->getValue()); \ 59 it++; \ 60 } while (false) 61 62 #define CHECK_LIST_VALUE(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10) \ 63 do { \ 64 llvm::iplist<Node>::const_iterator it = m_pNodeList.begin(); \ 65 CHECK_NODE_VALUE(v1); \ 66 CHECK_NODE_VALUE(v2); \ 67 CHECK_NODE_VALUE(v3); \ 68 CHECK_NODE_VALUE(v4); \ 69 CHECK_NODE_VALUE(v5); \ 70 CHECK_NODE_VALUE(v6); \ 71 CHECK_NODE_VALUE(v7); \ 72 CHECK_NODE_VALUE(v8); \ 73 CHECK_NODE_VALUE(v9); \ 74 CHECK_NODE_VALUE(v10); \ 75 } while (false) 76 77 TEST_F(GCFactoryListTraitsTest, Basic) { 78 ASSERT_TRUE(10 == m_pNodeList.size()); 79 CHECK_LIST_VALUE(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); 80 } 81 82 TEST_F(GCFactoryListTraitsTest, BasicAgain) { 83 ASSERT_TRUE(10 == m_pNodeList.size()); 84 CHECK_LIST_VALUE(0, 1, 2, 3, 4, 5, 6, 7, 8, 9); 85 } 86 87 TEST_F(GCFactoryListTraitsTest, Clear) { 88 m_pNodeList.clear(); 89 ASSERT_TRUE(0 == m_pNodeList.size()); 90 } 91 92 TEST_F(GCFactoryListTraitsTest, PushThenPop) { 93 Node* NewNode = m_NodeFactory.produce(11); 94 m_pNodeList.push_back(NewNode); 95 ASSERT_TRUE(11 == m_pNodeList.size()); 96 m_pNodeList.pop_back(); 97 ASSERT_TRUE(10 == m_pNodeList.size()); 98 } 99 100 TEST_F(GCFactoryListTraitsTest, CodeIterator) { 101 // to test whether there's compilation error for const template 102 for (llvm::iplist<Node>::const_iterator I = m_pNodeList.begin(), 103 E = m_pNodeList.end(); 104 I != E; 105 I++) 106 I->getValue(); 107 } 108 109 TEST_F(GCFactoryListTraitsTest, Empty) { 110 ASSERT_FALSE(m_pNodeList.empty()); 111 m_pNodeList.clear(); 112 ASSERT_TRUE(m_pNodeList.empty()); 113 } 114 115 TEST_F(GCFactoryListTraitsTest, EraseAndSize) { 116 ASSERT_FALSE(m_pNodeList.empty()); 117 m_pNodeList.erase(m_pNodeList.begin()); 118 m_pNodeList.erase(m_pNodeList.begin()); 119 ASSERT_TRUE(m_pNodeList.size() == 8); 120 } 121 122 #undef CHECK_LIST_VALUE 123 #undef CHECK_NODE_VALUE 124