15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- InputTreeTest.cpp --------------------------------------------------===//
25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//                     The MCLinker Project
45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source
65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details.
75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===//
922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include "InputTreeTest.h"
1022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <vector>
1222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <iostream>
1322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
1422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/InputTree.h>
1522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/InputFactory.h>
1622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/LinkerConfig.h>
1722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/InputBuilder.h>
1822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/FileAction.h>
1922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao#include <mcld/MC/CommandAction.h>
205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld;
2222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaousing namespace mcld::test;
235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Constructor can do set-up work for all test here.
265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoInputTreeTest::InputTreeTest()
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  : m_MemFactory(10), m_ContextFactory(4) {
2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
2922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create testee. modify it if need
3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pConfig = new mcld::LinkerConfig("arm-none-linux-gnueabi");
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pAlloc  = new mcld::InputFactory(10, *m_pConfig);
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pBuilder = new mcld::InputBuilder(*m_pConfig,
3322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                      *m_pAlloc,
34551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines                                      m_ContextFactory,
3522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                      m_MemFactory,
3622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao                                      false);
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee = new mcld::InputTree();
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pBuilder->setCurrentTree(*m_pTestee);
395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Destructor can do clean-up work that doesn't throw exceptions here.
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoInputTreeTest::~InputTreeTest()
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
4422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pTestee;
4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pAlloc;
4622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pBuilder;
4722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pConfig;
485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SetUp() will be called immediately before each test.
515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid InputTreeTest::SetUp()
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// TearDown() will be called immediately after each test.
565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid InputTreeTest::TearDown()
575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Testcases
625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( InputTreeTest, Basic_operation ) {
645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::vector<InputAction*> actions;
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t position = 0;
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  actions.push_back(new StartGroupAction(position++));
6922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  actions.push_back(new InputFileAction(position++, "path1"));
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  actions.push_back(new EndGroupAction(position++));
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
7222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::vector<InputAction*>::iterator action;
7322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (action = actions.begin(); action != actions.end(); ++action) {
7422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    (*action)->activate(*m_pBuilder);
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    delete *action;
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
77551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
7822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  InputTree::iterator node = m_pTestee->root();
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InputTree::const_iterator const_node = node;
8022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  --node;
8122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  --const_node;
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(isGroup(node));
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(isGroup(const_node));
8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->empty());
8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(1 == m_pAlloc->size());
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  --node;
895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pTestee->enterGroup(node, InputTree::Downward);
915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InputTree::const_iterator const_node2 = node;
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(node.isRoot());
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(isGroup(node));
975460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(isGroup(const_node2));
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->empty());
9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->size()==0);
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
10122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(m_pTestee->size()==3);
1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( InputTreeTest, forLoop_TEST ) {
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InputTree::iterator node = m_pTestee->root();
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
107551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
10822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input* input = m_pAlloc->produce("FileSpec", "path1");
10922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Inclusive>(node, *input);
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InputTree::const_iterator const_node = node;
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  --node;
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
113551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  for(int i=0 ; i<100 ; ++i)
1145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
11522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Input* input = m_pAlloc->produce("FileSpec", "path1");
11622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pTestee->insert<InputTree::Inclusive>(node, *input);
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++node;
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pTestee->enterGroup(node, InputTree::Downward);
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  --node;
1225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(node.isRoot());
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(isGroup(node));
12522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->empty());
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->size()==100);
1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(m_pTestee->size()==102);
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( InputTreeTest, Nesting_Case ) {
132551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  InputTree::iterator node = m_pTestee->root();
1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
134551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  for(int i=0 ; i<50 ; ++i)
1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  {
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pTestee->enterGroup(node, InputTree::Downward);
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    --node;
1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
13922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Input* input = m_pAlloc->produce("FileSpec", "path1");
14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pTestee->insert(node, InputTree::Afterward, *input);
1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++node;
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
143551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(node.isRoot());
1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(isGroup(node));
14622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->empty());
14722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(m_pAlloc->size()==50);
1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(m_pTestee->size()==100);
1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( InputTreeTest, DFSIterator_BasicTraversal)
1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{
153551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
154551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  InputTree::iterator node = m_pTestee->root();
15522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input* input = m_pAlloc->produce("111", "/");
15622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Inclusive>(node, *input);
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  node.move<InputTree::Inclusive>();
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
15922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  input = m_pAlloc->produce("10", "/");
16022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Positional>(node, *input);
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pTestee->enterGroup<InputTree::Inclusive>(node);
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  node.move<InputTree::Inclusive>();
16322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
16422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  input = m_pAlloc->produce("7", "/");
16522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Inclusive>(node, *input);
16622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  input = m_pAlloc->produce("8", "/");
16722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Positional>(node, *input);
1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
169551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  InputTree::dfs_iterator dfs_it = m_pTestee->dfs_begin();
170551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  InputTree::dfs_iterator dfs_end = m_pTestee->dfs_end();
1715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_STREQ("111", (*dfs_it)->name().c_str());
1725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++dfs_it;
1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_STREQ("7", (**dfs_it).name().c_str());
1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++dfs_it;
1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_STREQ("8", (**dfs_it).name().c_str());
1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++dfs_it;
1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_STREQ("10", (**dfs_it).name().c_str());
1785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++dfs_it;
1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(dfs_it ==  dfs_end);
1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
182