Home | History | Annotate | Download | only in unittests
      1 //===- 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 //===----------------------------------------------------------------------===//
      9 #include <mcld/MC/SymbolCategory.h>
     10 #include <mcld/LD/ResolveInfo.h>
     11 #include <mcld/LD/LDSymbol.h>
     12 #include <iostream>
     13 #include "SymbolCategoryTest.h"
     14 
     15 using namespace std;
     16 using namespace mcld;
     17 using namespace mcldtest;
     18 
     19 
     20 // Constructor can do set-up work for all test here.
     21 SymbolCategoryTest::SymbolCategoryTest()
     22 {
     23   // create testee. modify it if need
     24   m_pTestee = new SymbolCategory();
     25 }
     26 
     27 // Destructor can do clean-up work that doesn't throw exceptions here.
     28 SymbolCategoryTest::~SymbolCategoryTest()
     29 {
     30   delete m_pTestee;
     31 }
     32 
     33 // SetUp() will be called immediately before each test.
     34 void SymbolCategoryTest::SetUp()
     35 {
     36 }
     37 
     38 // TearDown() will be called immediately after each test.
     39 void SymbolCategoryTest::TearDown()
     40 {
     41 }
     42 
     43 //==========================================================================//
     44 // Testcases
     45 //
     46 
     47 TEST_F(SymbolCategoryTest, upward_test) {
     48   ResolveInfo* a = ResolveInfo::Create("a");
     49   ResolveInfo* b = ResolveInfo::Create("b");
     50   ResolveInfo* c = ResolveInfo::Create("c");
     51   ResolveInfo* d = ResolveInfo::Create("d");
     52   ResolveInfo* e = ResolveInfo::Create("e");
     53   e->setBinding(ResolveInfo::Global);
     54   d->setBinding(ResolveInfo::Weak);
     55   c->setDesc(ResolveInfo::Common);
     56   c->setBinding(ResolveInfo::Global);
     57   b->setBinding(ResolveInfo::Local);
     58   a->setType(ResolveInfo::File);
     59 
     60   LDSymbol* aa = LDSymbol::Create(*a);
     61   LDSymbol* bb = LDSymbol::Create(*b);
     62   LDSymbol* cc = LDSymbol::Create(*c);
     63   LDSymbol* dd = LDSymbol::Create(*d);
     64   LDSymbol* ee = LDSymbol::Create(*e);
     65 
     66   m_pTestee->add(*ee);
     67   m_pTestee->add(*dd);
     68   m_pTestee->add(*cc);
     69   m_pTestee->add(*bb);
     70   m_pTestee->add(*aa);
     71 
     72   SymbolCategory::iterator sym = m_pTestee->begin();
     73   ASSERT_STREQ("a", (*sym)->name());
     74   ++sym;
     75   ASSERT_STREQ("b", (*sym)->name());
     76   ++sym;
     77   ASSERT_STREQ("c", (*sym)->name());
     78   ++sym;
     79   ASSERT_STREQ("d", (*sym)->name());
     80   ++sym;
     81   ASSERT_STREQ("e", (*sym)->name());
     82 
     83   ASSERT_TRUE(1 == m_pTestee->numOfLocals());
     84   ASSERT_TRUE(1 == m_pTestee->numOfCommons());
     85   ASSERT_TRUE(2 == m_pTestee->numOfDynamics());
     86   ASSERT_TRUE(5 == m_pTestee->numOfSymbols());
     87 }
     88 
     89 TEST_F(SymbolCategoryTest, change_local_to_dynamic) {
     90   ResolveInfo* a = ResolveInfo::Create("a");
     91   ResolveInfo* b = ResolveInfo::Create("b");
     92   ResolveInfo* c = ResolveInfo::Create("c");
     93   ResolveInfo* d = ResolveInfo::Create("d");
     94   ResolveInfo* e = ResolveInfo::Create("e");
     95 
     96   a->setBinding(ResolveInfo::Local);
     97   b->setBinding(ResolveInfo::Local);
     98   c->setBinding(ResolveInfo::Local);
     99   d->setDesc(ResolveInfo::Common);
    100   d->setBinding(ResolveInfo::Global);
    101   e->setBinding(ResolveInfo::Global);
    102 
    103   LDSymbol* aa = LDSymbol::Create(*a);
    104   LDSymbol* bb = LDSymbol::Create(*b);
    105   LDSymbol* cc = LDSymbol::Create(*c);
    106   LDSymbol* dd = LDSymbol::Create(*d);
    107   LDSymbol* ee = LDSymbol::Create(*e);
    108 
    109   a->setSymPtr(aa);
    110   b->setSymPtr(bb);
    111   c->setSymPtr(cc);
    112   d->setSymPtr(dd);
    113   e->setSymPtr(ee);
    114 
    115   m_pTestee->add(*ee);
    116   m_pTestee->add(*dd);
    117   m_pTestee->add(*cc);
    118   m_pTestee->add(*bb);
    119   m_pTestee->add(*aa);
    120 
    121   SymbolCategory::iterator sym = m_pTestee->begin();
    122   ASSERT_STREQ("c", (*sym)->name());
    123   ++sym;
    124   ASSERT_STREQ("b", (*sym)->name());
    125   ++sym;
    126   ASSERT_STREQ("a", (*sym)->name());
    127   ++sym;
    128   ASSERT_STREQ("d", (*sym)->name());
    129   ++sym;
    130   ASSERT_STREQ("e", (*sym)->name());
    131 
    132   m_pTestee->changeToDynamic(*bb);
    133 
    134   sym = m_pTestee->begin();
    135   ASSERT_STREQ("c", (*sym)->name());
    136   ++sym;
    137   ASSERT_STREQ("a", (*sym)->name());
    138   ++sym;
    139   ASSERT_STREQ("b", (*sym)->name());
    140   ++sym;
    141   ASSERT_STREQ("d", (*sym)->name());
    142   ++sym;
    143   ASSERT_STREQ("e", (*sym)->name());
    144 }
    145