blob: 7eb19882e87d2056bab96828e44560ae0fd6be2f [file] [log] [blame]
Shih-wei Liao5460a1f2012-03-16 22:41:16 -07001//===- 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//===----------------------------------------------------------------------===//
Stephen Hines37b74a32014-11-26 18:48:20 -08009#include "mcld/MC/SymbolCategory.h"
10#include "mcld/LD/ResolveInfo.h"
11#include "mcld/LD/LDSymbol.h"
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070012#include <iostream>
13#include "SymbolCategoryTest.h"
14
15using namespace std;
16using namespace mcld;
17using namespace mcldtest;
18
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070019// Constructor can do set-up work for all test here.
Stephen Hines37b74a32014-11-26 18:48:20 -080020SymbolCategoryTest::SymbolCategoryTest() {
Shih-wei Liao22add6f2012-12-15 17:21:00 -080021 // create testee. modify it if need
22 m_pTestee = new SymbolCategory();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070023}
24
25// Destructor can do clean-up work that doesn't throw exceptions here.
Stephen Hines37b74a32014-11-26 18:48:20 -080026SymbolCategoryTest::~SymbolCategoryTest() {
Shih-wei Liao22add6f2012-12-15 17:21:00 -080027 delete m_pTestee;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070028}
29
30// SetUp() will be called immediately before each test.
Stephen Hines37b74a32014-11-26 18:48:20 -080031void SymbolCategoryTest::SetUp() {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070032}
33
34// TearDown() will be called immediately after each test.
Stephen Hines37b74a32014-11-26 18:48:20 -080035void SymbolCategoryTest::TearDown() {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070036}
37
38//==========================================================================//
39// Testcases
40//
41
42TEST_F(SymbolCategoryTest, upward_test) {
Shih-wei Liao22add6f2012-12-15 17:21:00 -080043 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");
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070048 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);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070054
Shih-wei Liao22add6f2012-12-15 17:21:00 -080055 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);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070060
Shih-wei Liao22add6f2012-12-15 17:21:00 -080061 m_pTestee->add(*ee);
62 m_pTestee->add(*dd);
63 m_pTestee->add(*cc);
64 m_pTestee->add(*bb);
65 m_pTestee->add(*aa);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070066
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
Stephen Hines6f757552013-03-04 19:51:03 -080078 ASSERT_TRUE(1 == m_pTestee->numOfLocals());
Shih-wei Liao22add6f2012-12-15 17:21:00 -080079 ASSERT_TRUE(1 == m_pTestee->numOfCommons());
Stephen Hines6f757552013-03-04 19:51:03 -080080 ASSERT_TRUE(2 == m_pTestee->numOfDynamics());
Shih-wei Liao22add6f2012-12-15 17:21:00 -080081 ASSERT_TRUE(5 == m_pTestee->numOfSymbols());
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070082}
83
Stephen Hines6f757552013-03-04 19:51:03 -080084TEST_F(SymbolCategoryTest, change_local_to_dynamic) {
Shih-wei Liao22add6f2012-12-15 17:21:00 -080085 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
Stephen Hinesf7ac0f12013-05-03 19:09:24 -0700127 m_pTestee->changeToDynamic(*bb);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800128
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}