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