//===- BinTreeTest.cpp ----------------------------------------------------===// // // The MCLinker Project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "BinTreeTest.h" #include <mcld/ADT/TypeTraits.h> #include <mcld/InputTree.h> #include <string> using namespace mcld; using namespace mcldtest; // Constructor can do set-up work for all test here. BinTreeTest::BinTreeTest() { // create testee. modify it if need m_pTestee = new BinaryTree<int>(); } // Destructor can do clean-up work that doesn't throw exceptions here. BinTreeTest::~BinTreeTest() { delete m_pTestee; } // SetUp() will be called immediately before each test. void BinTreeTest::SetUp() { } // TearDown() will be called immediately after each test. void BinTreeTest::TearDown() { } //==========================================================================// // Testcases // /// General TEST_F( BinTreeTest,Two_non_null_tree_merge) { BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<TreeIteratorBase::Rightward>(pos,0); --pos; m_pTestee->join<TreeIteratorBase::Rightward>(pos,1); m_pTestee->join<TreeIteratorBase::Leftward>(pos,1); --pos; m_pTestee->join<TreeIteratorBase::Rightward>(pos,2); m_pTestee->join<TreeIteratorBase::Leftward>(pos,2); BinaryTree<int> *mergeTree = new BinaryTree<int>; BinaryTree<int>::iterator pos2 = mergeTree->root(); mergeTree->join<TreeIteratorBase::Rightward>(pos2,1); --pos2; mergeTree->join<TreeIteratorBase::Rightward>(pos2,1); mergeTree->join<TreeIteratorBase::Leftward>(pos2,1); m_pTestee->merge<TreeIteratorBase::Rightward>(pos,*mergeTree); delete mergeTree; EXPECT_TRUE(m_pTestee->size()==8); } /// ---- TEST - 2 ---- TEST_F( BinTreeTest, A_null_tree_merge_a_non_null_tree) { BinaryTree<int>::iterator pos = m_pTestee->root(); BinaryTree<int> *mergeTree = new BinaryTree<int>; mergeTree->join<TreeIteratorBase::Rightward>(pos,0); --pos; mergeTree->join<TreeIteratorBase::Rightward>(pos,1); mergeTree->join<TreeIteratorBase::Leftward>(pos,1); --pos; mergeTree->join<TreeIteratorBase::Rightward>(pos,2); mergeTree->join<TreeIteratorBase::Leftward>(pos,2); m_pTestee->merge<TreeIteratorBase::Rightward>(pos,*mergeTree); delete mergeTree; EXPECT_TRUE(m_pTestee->size()==5); } TEST_F( BinTreeTest, A_non_null_tree_merge_a_null_tree) { BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<TreeIteratorBase::Rightward>(pos,0); --pos; m_pTestee->join<TreeIteratorBase::Rightward>(pos,1); m_pTestee->join<TreeIteratorBase::Leftward>(pos,1); --pos; m_pTestee->join<TreeIteratorBase::Rightward>(pos,2); m_pTestee->join<TreeIteratorBase::Leftward>(pos,2); BinaryTree<int> *mergeTree = new BinaryTree<int>; BinaryTree<int>::iterator pos2 = mergeTree->root(); mergeTree->merge<TreeIteratorBase::Rightward>(pos2,*m_pTestee); //delete m_pTestee; EXPECT_TRUE(mergeTree->size()==5); delete mergeTree; } TEST_F( BinTreeTest, Two_null_tree_merge) { BinaryTree<int>::iterator pos = m_pTestee->root(); BinaryTree<int> *mergeTree = new BinaryTree<int>; BinaryTree<int>::iterator pos2 = mergeTree->root(); mergeTree->merge<TreeIteratorBase::Rightward>(pos2,*m_pTestee); //delete m_pTestee; EXPECT_TRUE(mergeTree->size()==0); delete mergeTree; } TEST_F( BinTreeTest, DFSIterator_BasicTraversal) { int a = 111, b = 10, c = 9, d = 8, e = 7; BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<InputTree::Inclusive>(pos,a); pos.move<InputTree::Inclusive>(); m_pTestee->join<InputTree::Positional>(pos,b); m_pTestee->join<InputTree::Inclusive>(pos,c); pos.move<InputTree::Inclusive>(); m_pTestee->join<InputTree::Positional>(pos,d); m_pTestee->join<InputTree::Inclusive>(pos,e); BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin(); BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end(); ASSERT_EQ(111, **dfs_it); ++dfs_it; EXPECT_EQ(9, **dfs_it); ++dfs_it; EXPECT_EQ(7, **dfs_it); ++dfs_it; EXPECT_EQ(8, **dfs_it); ++dfs_it; EXPECT_EQ(10, **dfs_it); ++dfs_it; EXPECT_TRUE( dfs_it == dfs_end); } TEST_F( BinTreeTest, DFSIterator_RightMostTree) { int a = 0, b = 1, c = 2, d = 3, e = 4; BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<InputTree::Inclusive>(pos,a); pos.move<InputTree::Inclusive>(); m_pTestee->join<InputTree::Positional>(pos,b); pos.move<InputTree::Positional>(); m_pTestee->join<InputTree::Positional>(pos,c); pos.move<InputTree::Positional>(); m_pTestee->join<InputTree::Positional>(pos,d); pos.move<InputTree::Positional>(); m_pTestee->join<InputTree::Positional>(pos,e); BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin(); BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end(); ASSERT_EQ(0, **dfs_it); ++dfs_it; ASSERT_EQ(1, **dfs_it); ++dfs_it; ASSERT_EQ(2, **dfs_it); ++dfs_it; ASSERT_EQ(3, **dfs_it); ++dfs_it; ASSERT_EQ(4, **dfs_it); ++dfs_it; ASSERT_TRUE( dfs_it == dfs_end); } TEST_F( BinTreeTest, DFSIterator_SingleNode) { BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<InputTree::Inclusive>(pos,0); BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin(); BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end(); int counter = 0; while( dfs_it != dfs_end ) { ++counter; ++dfs_it; } ASSERT_EQ(1, counter); } TEST_F( BinTreeTest, BFSIterator_BasicTraversal) { int a = 111, b = 10, c = 9, d = 8, e = 7; BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<InputTree::Inclusive>(pos,a); pos.move<InputTree::Inclusive>(); m_pTestee->join<InputTree::Positional>(pos,b); m_pTestee->join<InputTree::Inclusive>(pos,c); pos.move<InputTree::Inclusive>(); m_pTestee->join<InputTree::Positional>(pos,d); m_pTestee->join<InputTree::Inclusive>(pos,e); BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin(); BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end(); ASSERT_EQ(111, **bfs_it); ++bfs_it; ASSERT_EQ(10, **bfs_it); ++bfs_it; ASSERT_EQ(9, **bfs_it); ++bfs_it; ASSERT_EQ(8, **bfs_it); ++bfs_it; ASSERT_EQ(7, **bfs_it); ++bfs_it; ASSERT_TRUE(bfs_it == bfs_end); bfs_it = m_pTestee->bfs_begin(); bfs_end = m_pTestee->bfs_end(); } TEST_F( BinTreeTest, BFSIterator_RightMostTree) { int a = 0, b = 1, c = 2, d = 3, e = 4; BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<InputTree::Inclusive>(pos,a); pos.move<InputTree::Inclusive>(); m_pTestee->join<InputTree::Positional>(pos,b); pos.move<InputTree::Positional>(); m_pTestee->join<InputTree::Positional>(pos,c); pos.move<InputTree::Positional>(); m_pTestee->join<InputTree::Positional>(pos,d); pos.move<InputTree::Positional>(); m_pTestee->join<InputTree::Positional>(pos,e); BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin(); BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end(); ASSERT_EQ(0, **bfs_it); ++bfs_it; ASSERT_EQ(1, **bfs_it); ++bfs_it; ASSERT_EQ(2, **bfs_it); ++bfs_it; ASSERT_EQ(3, **bfs_it); ++bfs_it; ASSERT_EQ(4, **bfs_it); ++bfs_it; ASSERT_TRUE( bfs_it == bfs_end); } TEST_F( BinTreeTest, BFSIterator_SingleNode) { BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<InputTree::Inclusive>(pos,0); BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin(); BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end(); int counter = 0; while( bfs_it != bfs_end ) { ++counter; ++bfs_it; } ASSERT_EQ(1, counter); } TEST_F( BinTreeTest, TreeIterator) { int a = 0, b = 1, c = 2, d = 3, e = 4, f = 5; BinaryTree<int>::iterator pos = m_pTestee->root(); m_pTestee->join<InputTree::Inclusive>(pos,a); pos.move<InputTree::Inclusive>(); m_pTestee->join<InputTree::Positional>(pos,b); pos.move<InputTree::Positional>(); m_pTestee->join<InputTree::Inclusive>(pos,c); m_pTestee->join<InputTree::Positional>(pos,f); pos.move<InputTree::Inclusive>(); m_pTestee->join<InputTree::Positional>(pos,d); pos.move<InputTree::Positional>(); m_pTestee->join<InputTree::Positional>(pos,e); BinaryTree<int>::iterator it = m_pTestee->begin(); BinaryTree<int>::iterator end = m_pTestee->end(); ASSERT_EQ(0, **it); ++it; ASSERT_EQ(1, **it); --it; ASSERT_EQ(2, **it); ++it; ASSERT_EQ(3, **it); ++it; ASSERT_EQ(4, **it); ++it; ASSERT_TRUE(it == end); it = m_pTestee->begin(); ++it; ++it; ASSERT_EQ(5, **it); ++it; ASSERT_TRUE(it == end); }