1//===- InputTreeTest.cpp --------------------------------------------------===// 2// 3// The MCLinker Project 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9#include "mcld/MC/InputTree.h" 10#include "mcld/MC/MCLDInfo.h" 11#include <InputTreeTest.h> 12 13using namespace mcld; 14using namespace mcldtest; 15 16 17// Constructor can do set-up work for all test here. 18InputTreeTest::InputTreeTest() 19{ 20 // create testee. modify it if need 21 m_pAttr = new mcld::AttributeFactory(2); 22 m_pAlloc = new mcld::InputFactory(10, *m_pAttr); 23 m_pTestee = new InputTree(*m_pAlloc); 24} 25 26// Destructor can do clean-up work that doesn't throw exceptions here. 27InputTreeTest::~InputTreeTest() 28{ 29 delete m_pTestee; 30 delete m_pAlloc; 31 delete m_pAttr; 32} 33 34// SetUp() will be called immediately before each test. 35void InputTreeTest::SetUp() 36{ 37} 38 39// TearDown() will be called immediately after each test. 40void InputTreeTest::TearDown() 41{ 42} 43 44//==========================================================================// 45// Testcases 46// 47TEST_F( InputTreeTest, Basic_operation ) { 48 InputTree::iterator node = m_pTestee->root(); 49 m_pTestee->insert<InputTree::Inclusive>(node, "FileSpec", "path1"); 50 51 InputTree::const_iterator const_node = node; 52 53 ASSERT_TRUE(isGroup(node)); 54 ASSERT_TRUE(isGroup(const_node)); 55 ASSERT_TRUE(m_pTestee->hasInput()); 56 ASSERT_EQ(1, m_pTestee->numOfInputs()); 57 58 --node; 59 60 m_pTestee->enterGroup(node, InputTree::Downward); 61 62 InputTree::const_iterator const_node2 = node; 63 64 ASSERT_FALSE(node.isRoot()); 65 66 ASSERT_FALSE(isGroup(node)); 67 ASSERT_FALSE(isGroup(const_node2)); 68 ASSERT_TRUE(m_pTestee->hasInput()); 69 ASSERT_FALSE(m_pTestee->numOfInputs()==0); 70 71 ASSERT_TRUE(m_pTestee->size()==2); 72} 73 74TEST_F( InputTreeTest, forLoop_TEST ) { 75 InputTree::iterator node = m_pTestee->root(); 76 77 78 m_pTestee->insert<InputTree::Inclusive>(node, "FileSpec", "path1"); 79 InputTree::const_iterator const_node = node; 80 --node; 81 82 for(int i=0 ; i<100 ; ++i) 83 { 84 m_pTestee->insert<InputTree::Inclusive>(node,"FileSpec", "path1"); 85 ++node; 86 } 87 88 m_pTestee->enterGroup(node, InputTree::Downward); 89 --node; 90 91 ASSERT_FALSE(node.isRoot()); 92 ASSERT_TRUE(isGroup(node)); 93 ASSERT_TRUE(m_pTestee->hasInput()); 94 ASSERT_FALSE(m_pTestee->numOfInputs()==100); 95 96 ASSERT_TRUE(m_pTestee->size()==102); 97} 98 99TEST_F( InputTreeTest, Nesting_Case ) { 100 InputTree::iterator node = m_pTestee->root(); 101 102 for(int i=0 ; i<50 ; ++i) 103 { 104 m_pTestee->enterGroup(node, InputTree::Downward); 105 --node; 106 107 m_pTestee->insert(node, InputTree::Afterward, "FileSpec", "path1"); 108 ++node; 109 } 110 111 ASSERT_FALSE(node.isRoot()); 112 ASSERT_FALSE(isGroup(node)); 113 ASSERT_TRUE(m_pTestee->hasInput()); 114 ASSERT_TRUE(m_pTestee->numOfInputs()==50); 115 ASSERT_TRUE(m_pTestee->size()==100); 116} 117 118TEST_F( InputTreeTest, DFSIterator_BasicTraversal) 119{ 120 121 InputTree::iterator node = m_pTestee->root(); 122 m_pTestee->insert<InputTree::Inclusive>(node, "111", "/"); 123 node.move<InputTree::Inclusive>(); 124 125 m_pTestee->insert<InputTree::Positional>(node, "10", "/"); 126 m_pTestee->enterGroup<InputTree::Inclusive>(node); 127 node.move<InputTree::Inclusive>(); 128 m_pTestee->insert<InputTree::Inclusive>(node, "7", "/"); 129 m_pTestee->insert<InputTree::Positional>(node, "8", "/"); 130 131 InputTree::dfs_iterator dfs_it = m_pTestee->dfs_begin(); 132 InputTree::dfs_iterator dfs_end = m_pTestee->dfs_end(); 133 ASSERT_STREQ("111", (*dfs_it)->name().c_str()); 134 ++dfs_it; 135 ASSERT_STREQ("7", (**dfs_it).name().c_str()); 136 ++dfs_it; 137 ASSERT_STREQ("8", (**dfs_it).name().c_str()); 138 ++dfs_it; 139 ASSERT_STREQ("10", (**dfs_it).name().c_str()); 140 ++dfs_it; 141 ASSERT_TRUE(dfs_it == dfs_end); 142} 143 144