C++程序  |  95行  |  2.35 KB

//===- 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 = m_InfoFactory.produce("a");
  ResolveInfo* b = m_InfoFactory.produce("b");
  ResolveInfo* c = m_InfoFactory.produce("c");
  ResolveInfo* d = m_InfoFactory.produce("d");
  ResolveInfo* e = m_InfoFactory.produce("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 bb;
  LDSymbol cc;
  LDSymbol dd;
  LDSymbol ee;

  aa.setResolveInfo(*a);
  bb.setResolveInfo(*b);
  cc.setResolveInfo(*c);
  dd.setResolveInfo(*d);
  ee.setResolveInfo(*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_EQ(2, m_pTestee->numOfLocals());
  ASSERT_EQ(1, m_pTestee->numOfCommons());
  ASSERT_EQ(2, m_pTestee->numOfRegulars());
  ASSERT_EQ(5, m_pTestee->numOfSymbols());
}