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// Constructor can do set-up work for all test here.
20SymbolCategoryTest::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.
26SymbolCategoryTest::~SymbolCategoryTest() {
27  delete m_pTestee;
28}
29
30// SetUp() will be called immediately before each test.
31void SymbolCategoryTest::SetUp() {
32}
33
34// TearDown() will be called immediately after each test.
35void SymbolCategoryTest::TearDown() {
36}
37
38//==========================================================================//
39// Testcases
40//
41
42TEST_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
84TEST_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