//===- 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(2 == m_pTestee->numOfLocals());
  ASSERT_TRUE(1 == m_pTestee->numOfCommons());
  ASSERT_TRUE(2 == m_pTestee->numOfRegulars());
  ASSERT_TRUE(5 == m_pTestee->numOfSymbols());
}

TEST_F(SymbolCategoryTest, change_local_to_tls) {
  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->changeLocalToTLS(*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());
}
