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