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
1437b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/InputTree.h"
1537b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/InputFactory.h"
1637b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h"
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/InputBuilder.h"
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/MC/FileAction.h"
1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#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// Constructor can do set-up work for all test here.
2537b74a387bb3993387029859c2d9d051c41c724eStephen HinesInputTreeTest::InputTreeTest() : m_MemFactory(10), m_ContextFactory(4) {
2622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  // create testee. modify it if need
2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pConfig = new mcld::LinkerConfig("arm-none-linux-gnueabi");
2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pAlloc = new mcld::InputFactory(10, *m_pConfig);
2937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  m_pBuilder = new mcld::InputBuilder(
3037b74a387bb3993387029859c2d9d051c41c724eStephen Hines      *m_pConfig, *m_pAlloc, m_ContextFactory, m_MemFactory, false);
3122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee = new mcld::InputTree();
3222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pBuilder->setCurrentTree(*m_pTestee);
335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Destructor can do clean-up work that doesn't throw exceptions here.
3637b74a387bb3993387029859c2d9d051c41c724eStephen HinesInputTreeTest::~InputTreeTest() {
3722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pTestee;
3822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pAlloc;
3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pBuilder;
4022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  delete m_pConfig;
415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SetUp() will be called immediately before each test.
4437b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid InputTreeTest::SetUp() {
455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// TearDown() will be called immediately after each test.
4837b74a387bb3993387029859c2d9d051c41c724eStephen Hinesvoid InputTreeTest::TearDown() {
495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===//
525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Testcases
535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//
5437b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(InputTreeTest, Basic_operation) {
5522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::vector<InputAction*> actions;
5622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  size_t position = 0;
5822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  actions.push_back(new StartGroupAction(position++));
5922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  actions.push_back(new InputFileAction(position++, "path1"));
6022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  actions.push_back(new EndGroupAction(position++));
6122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
6222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  std::vector<InputAction*>::iterator action;
6322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  for (action = actions.begin(); action != actions.end(); ++action) {
6422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    (*action)->activate(*m_pBuilder);
6522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    delete *action;
6622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  }
67551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  InputTree::iterator node = m_pTestee->root();
695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InputTree::const_iterator const_node = node;
7022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  --node;
7122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  --const_node;
725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(isGroup(node));
745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(isGroup(const_node));
7522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->empty());
7622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_TRUE(1 == m_pAlloc->size());
775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  --node;
795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pTestee->enterGroup(node, InputTree::Downward);
815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InputTree::const_iterator const_node2 = node;
835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(node.isRoot());
855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(isGroup(node));
875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(isGroup(const_node2));
8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->empty());
8937b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_FALSE(m_pAlloc->size() == 0);
905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9137b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_TRUE(m_pTestee->size() == 3);
925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9437b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(InputTreeTest, forLoop_TEST) {
955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InputTree::iterator node = m_pTestee->root();
965460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
9722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input* input = m_pAlloc->produce("FileSpec", "path1");
9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Inclusive>(node, *input);
995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  InputTree::const_iterator const_node = node;
1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  --node;
1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
10237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 100; ++i) {
10322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Input* input = m_pAlloc->produce("FileSpec", "path1");
10422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pTestee->insert<InputTree::Inclusive>(node, *input);
1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++node;
1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pTestee->enterGroup(node, InputTree::Downward);
1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  --node;
1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(node.isRoot());
1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_TRUE(isGroup(node));
11322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->empty());
11437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_FALSE(m_pAlloc->size() == 100);
1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
11637b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_TRUE(m_pTestee->size() == 102);
1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
11937b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(InputTreeTest, Nesting_Case) {
120551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  InputTree::iterator node = m_pTestee->root();
1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
12237b74a387bb3993387029859c2d9d051c41c724eStephen Hines  for (int i = 0; i < 50; ++i) {
1235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    m_pTestee->enterGroup(node, InputTree::Downward);
1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    --node;
1255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
12622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    Input* input = m_pAlloc->produce("FileSpec", "path1");
12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao    m_pTestee->insert(node, InputTree::Afterward, *input);
1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao    ++node;
1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  }
130551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines
1315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(node.isRoot());
1325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_FALSE(isGroup(node));
13322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  ASSERT_FALSE(m_pAlloc->empty());
13437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_TRUE(m_pAlloc->size() == 50);
13537b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_TRUE(m_pTestee->size() == 100);
1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
13837b74a387bb3993387029859c2d9d051c41c724eStephen HinesTEST_F(InputTreeTest, DFSIterator_BasicTraversal) {
139551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  InputTree::iterator node = m_pTestee->root();
14022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  Input* input = m_pAlloc->produce("111", "/");
14122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Inclusive>(node, *input);
1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  node.move<InputTree::Inclusive>();
1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
14422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  input = m_pAlloc->produce("10", "/");
14522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Positional>(node, *input);
1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  m_pTestee->enterGroup<InputTree::Inclusive>(node);
1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  node.move<InputTree::Inclusive>();
14822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao
14922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  input = m_pAlloc->produce("7", "/");
15022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Inclusive>(node, *input);
15122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  input = m_pAlloc->produce("8", "/");
15222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao  m_pTestee->insert<InputTree::Positional>(node, *input);
1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao
154551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  InputTree::dfs_iterator dfs_it = m_pTestee->dfs_begin();
155551ae4ebd3e9d137ea668fb83ae4a55b8cfba451Stephen Hines  InputTree::dfs_iterator dfs_end = m_pTestee->dfs_end();
1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_STREQ("111", (*dfs_it)->name().c_str());
1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++dfs_it;
1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_STREQ("7", (**dfs_it).name().c_str());
1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++dfs_it;
1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_STREQ("8", (**dfs_it).name().c_str());
1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++dfs_it;
1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ASSERT_STREQ("10", (**dfs_it).name().c_str());
1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao  ++dfs_it;
16437b74a387bb3993387029859c2d9d051c41c724eStephen Hines  ASSERT_TRUE(dfs_it == dfs_end);
1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}
166