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