Linkloader improvement: mclinker.
Change-Id: I8805e39ccbc2ee204234fb3e71c70c906f3990bb
diff --git a/unittests/BinTreeTest.cpp b/unittests/BinTreeTest.cpp
new file mode 100644
index 0000000..bce4b24
--- /dev/null
+++ b/unittests/BinTreeTest.cpp
@@ -0,0 +1,275 @@
+//===- 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/MC/MCLDInputTree.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;
+ BinaryTree<int>::iterator pos = m_pTestee->root();
+
+ m_pTestee->join<InputTree::Inclusive>(pos,a);
+ pos.move<InputTree::Inclusive>();
+ m_pTestee->join<InputTree::Positional>(pos,10);
+ m_pTestee->join<InputTree::Inclusive>(pos,9);
+ pos.move<InputTree::Inclusive>();
+ m_pTestee->join<InputTree::Positional>(pos,8);
+ m_pTestee->join<InputTree::Inclusive>(pos,7);
+
+ 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;
+ ASSERT_EQ(9, **dfs_it);
+ ++dfs_it;
+ ASSERT_EQ(7, **dfs_it);
+ ++dfs_it;
+ ASSERT_EQ(8, **dfs_it);
+ ++dfs_it;
+ ASSERT_EQ(10, **dfs_it);
+ ++dfs_it;
+ ASSERT_TRUE( dfs_it == dfs_end);
+ BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin();
+ BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end();
+}
+
+TEST_F( BinTreeTest, DFSIterator_RightMostTree)
+{
+ BinaryTree<int>::iterator pos = m_pTestee->root();
+ m_pTestee->join<InputTree::Inclusive>(pos,0);
+ pos.move<InputTree::Inclusive>();
+ m_pTestee->join<InputTree::Positional>(pos,1);
+ pos.move<InputTree::Positional>();
+ m_pTestee->join<InputTree::Positional>(pos,2);
+ pos.move<InputTree::Positional>();
+ m_pTestee->join<InputTree::Positional>(pos,3);
+ pos.move<InputTree::Positional>();
+ m_pTestee->join<InputTree::Positional>(pos,4);
+
+ 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;
+ BinaryTree<int>::iterator pos = m_pTestee->root();
+
+ m_pTestee->join<InputTree::Inclusive>(pos,a);
+ pos.move<InputTree::Inclusive>();
+ m_pTestee->join<InputTree::Positional>(pos,10);
+ m_pTestee->join<InputTree::Inclusive>(pos,9);
+ pos.move<InputTree::Inclusive>();
+ m_pTestee->join<InputTree::Positional>(pos,8);
+ m_pTestee->join<InputTree::Inclusive>(pos,7);
+
+ 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)
+{
+ BinaryTree<int>::iterator pos = m_pTestee->root();
+ m_pTestee->join<InputTree::Inclusive>(pos,0);
+ pos.move<InputTree::Inclusive>();
+ m_pTestee->join<InputTree::Positional>(pos,1);
+ pos.move<InputTree::Positional>();
+ m_pTestee->join<InputTree::Positional>(pos,2);
+ pos.move<InputTree::Positional>();
+ m_pTestee->join<InputTree::Positional>(pos,3);
+ pos.move<InputTree::Positional>();
+ m_pTestee->join<InputTree::Positional>(pos,4);
+
+ 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);
+}
+
+