C++程序  |  144行  |  3.71 KB

//===- InputTreeTest.cpp --------------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include "mcld/MC/InputTree.h"
#include "mcld/MC/MCLDInfo.h"
#include <InputTreeTest.h>

using namespace mcld;
using namespace mcldtest;


// Constructor can do set-up work for all test here.
InputTreeTest::InputTreeTest()
{
	// create testee. modify it if need
	m_pAttr = new mcld::AttributeFactory(2);
        m_pAlloc = new mcld::InputFactory(10, *m_pAttr);
	m_pTestee = new InputTree(*m_pAlloc);
}

// Destructor can do clean-up work that doesn't throw exceptions here.
InputTreeTest::~InputTreeTest()
{
	delete m_pTestee;
	delete m_pAlloc;
	delete m_pAttr;
}

// SetUp() will be called immediately before each test.
void InputTreeTest::SetUp()
{
}

// TearDown() will be called immediately after each test.
void InputTreeTest::TearDown()
{
}

//==========================================================================//
// Testcases
//
TEST_F( InputTreeTest, Basic_operation ) {
  InputTree::iterator node = m_pTestee->root();
  m_pTestee->insert<InputTree::Inclusive>(node, "FileSpec", "path1");

  InputTree::const_iterator const_node = node;

  ASSERT_TRUE(isGroup(node));
  ASSERT_TRUE(isGroup(const_node));
  ASSERT_TRUE(m_pTestee->hasInput());
  ASSERT_EQ(1, m_pTestee->numOfInputs());

  --node;

  m_pTestee->enterGroup(node, InputTree::Downward);

  InputTree::const_iterator const_node2 = node;

  ASSERT_FALSE(node.isRoot());

  ASSERT_FALSE(isGroup(node));
  ASSERT_FALSE(isGroup(const_node2));
  ASSERT_TRUE(m_pTestee->hasInput());
  ASSERT_FALSE(m_pTestee->numOfInputs()==0);

  ASSERT_TRUE(m_pTestee->size()==2);
}

TEST_F( InputTreeTest, forLoop_TEST ) {
  InputTree::iterator node = m_pTestee->root();

  
  m_pTestee->insert<InputTree::Inclusive>(node, "FileSpec", "path1");
  InputTree::const_iterator const_node = node;
  --node;

  for(int i=0 ; i<100 ; ++i) 
  {
    m_pTestee->insert<InputTree::Inclusive>(node,"FileSpec", "path1");
    ++node;
  }

  m_pTestee->enterGroup(node, InputTree::Downward);
  --node;

  ASSERT_FALSE(node.isRoot());
  ASSERT_TRUE(isGroup(node));
  ASSERT_TRUE(m_pTestee->hasInput());
  ASSERT_FALSE(m_pTestee->numOfInputs()==100);

  ASSERT_TRUE(m_pTestee->size()==102);
}

TEST_F( InputTreeTest, Nesting_Case ) {
  InputTree::iterator node = m_pTestee->root(); 

  for(int i=0 ; i<50 ; ++i) 
  {
    m_pTestee->enterGroup(node, InputTree::Downward);
    --node;

    m_pTestee->insert(node, InputTree::Afterward, "FileSpec", "path1");
    ++node;
  }
  
  ASSERT_FALSE(node.isRoot());
  ASSERT_FALSE(isGroup(node));
  ASSERT_TRUE(m_pTestee->hasInput());
  ASSERT_TRUE(m_pTestee->numOfInputs()==50);
  ASSERT_TRUE(m_pTestee->size()==100);
}

TEST_F( InputTreeTest, DFSIterator_BasicTraversal)
{
  
  InputTree::iterator node = m_pTestee->root(); 
  m_pTestee->insert<InputTree::Inclusive>(node, "111", "/");
  node.move<InputTree::Inclusive>();

  m_pTestee->insert<InputTree::Positional>(node, "10", "/");
  m_pTestee->enterGroup<InputTree::Inclusive>(node);
  node.move<InputTree::Inclusive>();
  m_pTestee->insert<InputTree::Inclusive>(node, "7", "/");
  m_pTestee->insert<InputTree::Positional>(node, "8", "/");

  InputTree::dfs_iterator dfs_it = m_pTestee->dfs_begin(); 
  InputTree::dfs_iterator dfs_end = m_pTestee->dfs_end(); 
  ASSERT_STREQ("111", (*dfs_it)->name().c_str());
  ++dfs_it;
  ASSERT_STREQ("7", (**dfs_it).name().c_str());
  ++dfs_it;
  ASSERT_STREQ("8", (**dfs_it).name().c_str());
  ++dfs_it;
  ASSERT_STREQ("10", (**dfs_it).name().c_str());
  ++dfs_it;
  ASSERT_TRUE(dfs_it ==  dfs_end);
}