You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
8.6 KiB
293 lines
8.6 KiB
//===- 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);
|
|
}
|