//===- implTest.cpp -------------------------------------------------------===//
//
// The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/MC/SymbolCategory.h>
#include <mcld/LD/ResolveInfo.h>
#include <mcld/LD/LDSymbol.h>
#include <iostream>
#include "SymbolCategoryTest.h"
using namespace std;
using namespace mcld;
using namespace mcldtest;
// Constructor can do set-up work for all test here.
SymbolCategoryTest::SymbolCategoryTest()
{
// create testee. modify it if need
m_pTestee = new SymbolCategory();
}
// Destructor can do clean-up work that doesn't throw exceptions here.
SymbolCategoryTest::~SymbolCategoryTest()
{
delete m_pTestee;
}
// SetUp() will be called immediately before each test.
void SymbolCategoryTest::SetUp()
{
}
// TearDown() will be called immediately after each test.
void SymbolCategoryTest::TearDown()
{
}
//==========================================================================//
// Testcases
//
TEST_F(SymbolCategoryTest, upward_test) {
ResolveInfo* a = ResolveInfo::Create("a");
ResolveInfo* b = ResolveInfo::Create("b");
ResolveInfo* c = ResolveInfo::Create("c");
ResolveInfo* d = ResolveInfo::Create("d");
ResolveInfo* e = ResolveInfo::Create("e");
e->setBinding(ResolveInfo::Global);
d->setBinding(ResolveInfo::Weak);
c->setDesc(ResolveInfo::Common);
c->setBinding(ResolveInfo::Global);
b->setBinding(ResolveInfo::Local);
a->setType(ResolveInfo::File);
LDSymbol* aa = LDSymbol::Create(*a);
LDSymbol* bb = LDSymbol::Create(*b);
LDSymbol* cc = LDSymbol::Create(*c);
LDSymbol* dd = LDSymbol::Create(*d);
LDSymbol* ee = LDSymbol::Create(*e);
m_pTestee->add(*ee);
m_pTestee->add(*dd);
m_pTestee->add(*cc);
m_pTestee->add(*bb);
m_pTestee->add(*aa);
SymbolCategory::iterator sym = m_pTestee->begin();
ASSERT_STREQ("a", (*sym)->name());
++sym;
ASSERT_STREQ("b", (*sym)->name());
++sym;
ASSERT_STREQ("c", (*sym)->name());
++sym;
ASSERT_STREQ("d", (*sym)->name());
++sym;
ASSERT_STREQ("e", (*sym)->name());
ASSERT_TRUE(1 == m_pTestee->numOfLocals());
ASSERT_TRUE(1 == m_pTestee->numOfCommons());
ASSERT_TRUE(2 == m_pTestee->numOfDynamics());
ASSERT_TRUE(5 == m_pTestee->numOfSymbols());
}
TEST_F(SymbolCategoryTest, change_local_to_dynamic) {
ResolveInfo* a = ResolveInfo::Create("a");
ResolveInfo* b = ResolveInfo::Create("b");
ResolveInfo* c = ResolveInfo::Create("c");
ResolveInfo* d = ResolveInfo::Create("d");
ResolveInfo* e = ResolveInfo::Create("e");
a->setBinding(ResolveInfo::Local);
b->setBinding(ResolveInfo::Local);
c->setBinding(ResolveInfo::Local);
d->setDesc(ResolveInfo::Common);
d->setBinding(ResolveInfo::Global);
e->setBinding(ResolveInfo::Global);
LDSymbol* aa = LDSymbol::Create(*a);
LDSymbol* bb = LDSymbol::Create(*b);
LDSymbol* cc = LDSymbol::Create(*c);
LDSymbol* dd = LDSymbol::Create(*d);
LDSymbol* ee = LDSymbol::Create(*e);
a->setSymPtr(aa);
b->setSymPtr(bb);
c->setSymPtr(cc);
d->setSymPtr(dd);
e->setSymPtr(ee);
m_pTestee->add(*ee);
m_pTestee->add(*dd);
m_pTestee->add(*cc);
m_pTestee->add(*bb);
m_pTestee->add(*aa);
SymbolCategory::iterator sym = m_pTestee->begin();
ASSERT_STREQ("c", (*sym)->name());
++sym;
ASSERT_STREQ("b", (*sym)->name());
++sym;
ASSERT_STREQ("a", (*sym)->name());
++sym;
ASSERT_STREQ("d", (*sym)->name());
++sym;
ASSERT_STREQ("e", (*sym)->name());
m_pTestee->changeLocalToDynamic(*bb);
sym = m_pTestee->begin();
ASSERT_STREQ("c", (*sym)->name());
++sym;
ASSERT_STREQ("a", (*sym)->name());
++sym;
ASSERT_STREQ("b", (*sym)->name());
++sym;
ASSERT_STREQ("d", (*sym)->name());
++sym;
ASSERT_STREQ("e", (*sym)->name());
}