//===- 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());
}
