1 //===- implTest.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 "mcld/MC/SymbolCategory.h" 10 #include "mcld/LD/ResolveInfo.h" 11 #include "mcld/LD/LDSymbol.h" 12 #include <iostream> 13 #include "SymbolCategoryTest.h" 14 15 using namespace std; 16 using namespace mcld; 17 using namespace mcldtest; 18 19 // Constructor can do set-up work for all test here. 20 SymbolCategoryTest::SymbolCategoryTest() { 21 // create testee. modify it if need 22 m_pTestee = new SymbolCategory(); 23 } 24 25 // Destructor can do clean-up work that doesn't throw exceptions here. 26 SymbolCategoryTest::~SymbolCategoryTest() { 27 delete m_pTestee; 28 } 29 30 // SetUp() will be called immediately before each test. 31 void SymbolCategoryTest::SetUp() { 32 } 33 34 // TearDown() will be called immediately after each test. 35 void SymbolCategoryTest::TearDown() { 36 } 37 38 //==========================================================================// 39 // Testcases 40 // 41 42 TEST_F(SymbolCategoryTest, upward_test) { 43 ResolveInfo* a = ResolveInfo::Create("a"); 44 ResolveInfo* b = ResolveInfo::Create("b"); 45 ResolveInfo* c = ResolveInfo::Create("c"); 46 ResolveInfo* d = ResolveInfo::Create("d"); 47 ResolveInfo* e = ResolveInfo::Create("e"); 48 e->setBinding(ResolveInfo::Global); 49 d->setBinding(ResolveInfo::Weak); 50 c->setDesc(ResolveInfo::Common); 51 c->setBinding(ResolveInfo::Global); 52 b->setBinding(ResolveInfo::Local); 53 a->setType(ResolveInfo::File); 54 55 LDSymbol* aa = LDSymbol::Create(*a); 56 LDSymbol* bb = LDSymbol::Create(*b); 57 LDSymbol* cc = LDSymbol::Create(*c); 58 LDSymbol* dd = LDSymbol::Create(*d); 59 LDSymbol* ee = LDSymbol::Create(*e); 60 61 m_pTestee->add(*ee); 62 m_pTestee->add(*dd); 63 m_pTestee->add(*cc); 64 m_pTestee->add(*bb); 65 m_pTestee->add(*aa); 66 67 SymbolCategory::iterator sym = m_pTestee->begin(); 68 ASSERT_STREQ("a", (*sym)->name()); 69 ++sym; 70 ASSERT_STREQ("b", (*sym)->name()); 71 ++sym; 72 ASSERT_STREQ("c", (*sym)->name()); 73 ++sym; 74 ASSERT_STREQ("d", (*sym)->name()); 75 ++sym; 76 ASSERT_STREQ("e", (*sym)->name()); 77 78 ASSERT_TRUE(1 == m_pTestee->numOfLocals()); 79 ASSERT_TRUE(1 == m_pTestee->numOfCommons()); 80 ASSERT_TRUE(2 == m_pTestee->numOfDynamics()); 81 ASSERT_TRUE(5 == m_pTestee->numOfSymbols()); 82 } 83 84 TEST_F(SymbolCategoryTest, change_local_to_dynamic) { 85 ResolveInfo* a = ResolveInfo::Create("a"); 86 ResolveInfo* b = ResolveInfo::Create("b"); 87 ResolveInfo* c = ResolveInfo::Create("c"); 88 ResolveInfo* d = ResolveInfo::Create("d"); 89 ResolveInfo* e = ResolveInfo::Create("e"); 90 91 a->setBinding(ResolveInfo::Local); 92 b->setBinding(ResolveInfo::Local); 93 c->setBinding(ResolveInfo::Local); 94 d->setDesc(ResolveInfo::Common); 95 d->setBinding(ResolveInfo::Global); 96 e->setBinding(ResolveInfo::Global); 97 98 LDSymbol* aa = LDSymbol::Create(*a); 99 LDSymbol* bb = LDSymbol::Create(*b); 100 LDSymbol* cc = LDSymbol::Create(*c); 101 LDSymbol* dd = LDSymbol::Create(*d); 102 LDSymbol* ee = LDSymbol::Create(*e); 103 104 a->setSymPtr(aa); 105 b->setSymPtr(bb); 106 c->setSymPtr(cc); 107 d->setSymPtr(dd); 108 e->setSymPtr(ee); 109 110 m_pTestee->add(*ee); 111 m_pTestee->add(*dd); 112 m_pTestee->add(*cc); 113 m_pTestee->add(*bb); 114 m_pTestee->add(*aa); 115 116 SymbolCategory::iterator sym = m_pTestee->begin(); 117 ASSERT_STREQ("c", (*sym)->name()); 118 ++sym; 119 ASSERT_STREQ("b", (*sym)->name()); 120 ++sym; 121 ASSERT_STREQ("a", (*sym)->name()); 122 ++sym; 123 ASSERT_STREQ("d", (*sym)->name()); 124 ++sym; 125 ASSERT_STREQ("e", (*sym)->name()); 126 127 m_pTestee->changeToDynamic(*bb); 128 129 sym = m_pTestee->begin(); 130 ASSERT_STREQ("c", (*sym)->name()); 131 ++sym; 132 ASSERT_STREQ("a", (*sym)->name()); 133 ++sym; 134 ASSERT_STREQ("b", (*sym)->name()); 135 ++sym; 136 ASSERT_STREQ("d", (*sym)->name()); 137 ++sym; 138 ASSERT_STREQ("e", (*sym)->name()); 139 } 140