| //===- 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); |
| } |