BinTreeTest.cpp revision f33f6de54db174aa679a4b6d1e040d37e95541c0
1//===- BinTreeTest.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 "BinTreeTest.h" 10 11#include <mcld/ADT/TypeTraits.h> 12#include <mcld/InputTree.h> 13#include <string> 14 15using namespace mcld; 16using namespace mcldtest; 17 18 19// Constructor can do set-up work for all test here. 20BinTreeTest::BinTreeTest() 21{ 22 // create testee. modify it if need 23 m_pTestee = new BinaryTree<int>(); 24} 25 26// Destructor can do clean-up work that doesn't throw exceptions here. 27BinTreeTest::~BinTreeTest() 28{ 29 delete m_pTestee; 30} 31 32// SetUp() will be called immediately before each test. 33void BinTreeTest::SetUp() 34{ 35} 36 37// TearDown() will be called immediately after each test. 38void BinTreeTest::TearDown() 39{ 40} 41 42//==========================================================================// 43// Testcases 44// 45 46 47/// General 48TEST_F( BinTreeTest,Two_non_null_tree_merge) 49{ 50 BinaryTree<int>::iterator pos = m_pTestee->root(); 51 m_pTestee->join<TreeIteratorBase::Rightward>(pos,0); 52 --pos; 53 m_pTestee->join<TreeIteratorBase::Rightward>(pos,1); 54 m_pTestee->join<TreeIteratorBase::Leftward>(pos,1); 55 --pos; 56 m_pTestee->join<TreeIteratorBase::Rightward>(pos,2); 57 m_pTestee->join<TreeIteratorBase::Leftward>(pos,2); 58 59 BinaryTree<int> *mergeTree = new BinaryTree<int>; 60 BinaryTree<int>::iterator pos2 = mergeTree->root(); 61 mergeTree->join<TreeIteratorBase::Rightward>(pos2,1); 62 --pos2; 63 mergeTree->join<TreeIteratorBase::Rightward>(pos2,1); 64 mergeTree->join<TreeIteratorBase::Leftward>(pos2,1); 65 66 m_pTestee->merge<TreeIteratorBase::Rightward>(pos,*mergeTree); 67 delete mergeTree; 68 EXPECT_TRUE(m_pTestee->size()==8); 69} 70 71/// ---- TEST - 2 ---- 72TEST_F( BinTreeTest, A_null_tree_merge_a_non_null_tree) 73{ 74 BinaryTree<int>::iterator pos = m_pTestee->root(); 75 76 BinaryTree<int> *mergeTree = new BinaryTree<int>; 77 mergeTree->join<TreeIteratorBase::Rightward>(pos,0); 78 --pos; 79 mergeTree->join<TreeIteratorBase::Rightward>(pos,1); 80 mergeTree->join<TreeIteratorBase::Leftward>(pos,1); 81 --pos; 82 mergeTree->join<TreeIteratorBase::Rightward>(pos,2); 83 mergeTree->join<TreeIteratorBase::Leftward>(pos,2); 84 85 m_pTestee->merge<TreeIteratorBase::Rightward>(pos,*mergeTree); 86 87 delete mergeTree; 88 EXPECT_TRUE(m_pTestee->size()==5); 89} 90 91TEST_F( BinTreeTest, A_non_null_tree_merge_a_null_tree) 92{ 93 BinaryTree<int>::iterator pos = m_pTestee->root(); 94 m_pTestee->join<TreeIteratorBase::Rightward>(pos,0); 95 --pos; 96 m_pTestee->join<TreeIteratorBase::Rightward>(pos,1); 97 m_pTestee->join<TreeIteratorBase::Leftward>(pos,1); 98 --pos; 99 m_pTestee->join<TreeIteratorBase::Rightward>(pos,2); 100 m_pTestee->join<TreeIteratorBase::Leftward>(pos,2); 101 102 BinaryTree<int> *mergeTree = new BinaryTree<int>; 103 BinaryTree<int>::iterator pos2 = mergeTree->root(); 104 mergeTree->merge<TreeIteratorBase::Rightward>(pos2,*m_pTestee); 105 106 //delete m_pTestee; 107 EXPECT_TRUE(mergeTree->size()==5); 108 delete mergeTree; 109} 110 111TEST_F( BinTreeTest, Two_null_tree_merge) 112{ 113 BinaryTree<int>::iterator pos = m_pTestee->root(); 114 115 BinaryTree<int> *mergeTree = new BinaryTree<int>; 116 BinaryTree<int>::iterator pos2 = mergeTree->root(); 117 118 mergeTree->merge<TreeIteratorBase::Rightward>(pos2,*m_pTestee); 119 120 //delete m_pTestee; 121 EXPECT_TRUE(mergeTree->size()==0); 122 delete mergeTree; 123} 124 125TEST_F( BinTreeTest, DFSIterator_BasicTraversal) 126{ 127 int a = 111, b = 10, c = 9, d = 8, e = 7; 128 BinaryTree<int>::iterator pos = m_pTestee->root(); 129 130 m_pTestee->join<InputTree::Inclusive>(pos,a); 131 pos.move<InputTree::Inclusive>(); 132 m_pTestee->join<InputTree::Positional>(pos,b); 133 m_pTestee->join<InputTree::Inclusive>(pos,c); 134 pos.move<InputTree::Inclusive>(); 135 m_pTestee->join<InputTree::Positional>(pos,d); 136 m_pTestee->join<InputTree::Inclusive>(pos,e); 137 138 BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin(); 139 BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end(); 140 141 ASSERT_EQ(111, **dfs_it); 142 ++dfs_it; 143 EXPECT_EQ(9, **dfs_it); 144 ++dfs_it; 145 EXPECT_EQ(7, **dfs_it); 146 ++dfs_it; 147 EXPECT_EQ(8, **dfs_it); 148 ++dfs_it; 149 EXPECT_EQ(10, **dfs_it); 150 ++dfs_it; 151 EXPECT_TRUE( dfs_it == dfs_end); 152} 153 154TEST_F( BinTreeTest, DFSIterator_RightMostTree) 155{ 156 int a = 0, b = 1, c = 2, d = 3, e = 4; 157 BinaryTree<int>::iterator pos = m_pTestee->root(); 158 m_pTestee->join<InputTree::Inclusive>(pos,a); 159 pos.move<InputTree::Inclusive>(); 160 m_pTestee->join<InputTree::Positional>(pos,b); 161 pos.move<InputTree::Positional>(); 162 m_pTestee->join<InputTree::Positional>(pos,c); 163 pos.move<InputTree::Positional>(); 164 m_pTestee->join<InputTree::Positional>(pos,d); 165 pos.move<InputTree::Positional>(); 166 m_pTestee->join<InputTree::Positional>(pos,e); 167 168 BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin(); 169 BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end(); 170 171 ASSERT_EQ(0, **dfs_it); 172 ++dfs_it; 173 ASSERT_EQ(1, **dfs_it); 174 ++dfs_it; 175 ASSERT_EQ(2, **dfs_it); 176 ++dfs_it; 177 ASSERT_EQ(3, **dfs_it); 178 ++dfs_it; 179 ASSERT_EQ(4, **dfs_it); 180 ++dfs_it; 181 ASSERT_TRUE( dfs_it == dfs_end); 182} 183 184 185TEST_F( BinTreeTest, DFSIterator_SingleNode) 186{ 187 BinaryTree<int>::iterator pos = m_pTestee->root(); 188 m_pTestee->join<InputTree::Inclusive>(pos,0); 189 BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin(); 190 BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end(); 191 int counter = 0; 192 while( dfs_it != dfs_end ) { 193 ++counter; 194 ++dfs_it; 195 } 196 ASSERT_EQ(1, counter); 197} 198 199TEST_F( BinTreeTest, BFSIterator_BasicTraversal) 200{ 201 int a = 111, b = 10, c = 9, d = 8, e = 7; 202 BinaryTree<int>::iterator pos = m_pTestee->root(); 203 204 m_pTestee->join<InputTree::Inclusive>(pos,a); 205 pos.move<InputTree::Inclusive>(); 206 m_pTestee->join<InputTree::Positional>(pos,b); 207 m_pTestee->join<InputTree::Inclusive>(pos,c); 208 pos.move<InputTree::Inclusive>(); 209 m_pTestee->join<InputTree::Positional>(pos,d); 210 m_pTestee->join<InputTree::Inclusive>(pos,e); 211 212 BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin(); 213 BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end(); 214 215 ASSERT_EQ(111, **bfs_it); 216 ++bfs_it; 217 ASSERT_EQ(10, **bfs_it); 218 ++bfs_it; 219 ASSERT_EQ(9, **bfs_it); 220 ++bfs_it; 221 ASSERT_EQ(8, **bfs_it); 222 ++bfs_it; 223 ASSERT_EQ(7, **bfs_it); 224 ++bfs_it; 225 ASSERT_TRUE(bfs_it == bfs_end); 226 bfs_it = m_pTestee->bfs_begin(); 227 bfs_end = m_pTestee->bfs_end(); 228} 229 230TEST_F( BinTreeTest, BFSIterator_RightMostTree) 231{ 232 int a = 0, b = 1, c = 2, d = 3, e = 4; 233 BinaryTree<int>::iterator pos = m_pTestee->root(); 234 m_pTestee->join<InputTree::Inclusive>(pos,a); 235 pos.move<InputTree::Inclusive>(); 236 m_pTestee->join<InputTree::Positional>(pos,b); 237 pos.move<InputTree::Positional>(); 238 m_pTestee->join<InputTree::Positional>(pos,c); 239 pos.move<InputTree::Positional>(); 240 m_pTestee->join<InputTree::Positional>(pos,d); 241 pos.move<InputTree::Positional>(); 242 m_pTestee->join<InputTree::Positional>(pos,e); 243 244 BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin(); 245 BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end(); 246 247 ASSERT_EQ(0, **bfs_it); 248 ++bfs_it; 249 ASSERT_EQ(1, **bfs_it); 250 ++bfs_it; 251 ASSERT_EQ(2, **bfs_it); 252 ++bfs_it; 253 ASSERT_EQ(3, **bfs_it); 254 ++bfs_it; 255 ASSERT_EQ(4, **bfs_it); 256 ++bfs_it; 257 ASSERT_TRUE( bfs_it == bfs_end); 258} 259 260 261TEST_F( BinTreeTest, BFSIterator_SingleNode) 262{ 263 BinaryTree<int>::iterator pos = m_pTestee->root(); 264 m_pTestee->join<InputTree::Inclusive>(pos,0); 265 BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin(); 266 BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end(); 267 int counter = 0; 268 while( bfs_it != bfs_end ) { 269 ++counter; 270 ++bfs_it; 271 } 272 ASSERT_EQ(1, counter); 273} 274 275TEST_F( BinTreeTest, TreeIterator) 276{ 277 int a = 0, b = 1, c = 2, d = 3, e = 4, f = 5; 278 BinaryTree<int>::iterator pos = m_pTestee->root(); 279 m_pTestee->join<InputTree::Inclusive>(pos,a); 280 pos.move<InputTree::Inclusive>(); 281 m_pTestee->join<InputTree::Positional>(pos,b); 282 pos.move<InputTree::Positional>(); 283 m_pTestee->join<InputTree::Inclusive>(pos,c); 284 m_pTestee->join<InputTree::Positional>(pos,f); 285 pos.move<InputTree::Inclusive>(); 286 m_pTestee->join<InputTree::Positional>(pos,d); 287 pos.move<InputTree::Positional>(); 288 m_pTestee->join<InputTree::Positional>(pos,e); 289 290 BinaryTree<int>::iterator it = m_pTestee->begin(); 291 BinaryTree<int>::iterator end = m_pTestee->end(); 292 293 ASSERT_EQ(0, **it); 294 ++it; 295 ASSERT_EQ(1, **it); 296 --it; 297 ASSERT_EQ(2, **it); 298 ++it; 299 ASSERT_EQ(3, **it); 300 ++it; 301 ASSERT_EQ(4, **it); 302 ++it; 303 ASSERT_TRUE(it == end); 304 305 it = m_pTestee->begin(); 306 ++it; 307 ++it; 308 ASSERT_EQ(5, **it); 309 ++it; 310 ASSERT_TRUE(it == end); 311} 312 313