blob: adad1384a5bfe2d9221e4622b7e8e0a142f7de16 [file] [log] [blame]
Shih-wei Liao5460a1f2012-03-16 22:41:16 -07001//===- 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
Stephen Hines37b74a32014-11-26 18:48:20 -080011#include "mcld/ADT/TypeTraits.h"
12#include "mcld/InputTree.h"
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070013#include <string>
14
15using namespace mcld;
16using namespace mcldtest;
17
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070018// Constructor can do set-up work for all test here.
Stephen Hines37b74a32014-11-26 18:48:20 -080019BinTreeTest::BinTreeTest() {
20 // create testee. modify it if need
21 m_pTestee = new BinaryTree<int>();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070022}
23
24// Destructor can do clean-up work that doesn't throw exceptions here.
Stephen Hines37b74a32014-11-26 18:48:20 -080025BinTreeTest::~BinTreeTest() {
26 delete m_pTestee;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070027}
28
29// SetUp() will be called immediately before each test.
Stephen Hines37b74a32014-11-26 18:48:20 -080030void BinTreeTest::SetUp() {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070031}
32
33// TearDown() will be called immediately after each test.
Stephen Hines37b74a32014-11-26 18:48:20 -080034void BinTreeTest::TearDown() {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070035}
36
37//==========================================================================//
38// Testcases
39//
40
Shih-wei Liao22add6f2012-12-15 17:21:00 -080041/// General
Stephen Hines37b74a32014-11-26 18:48:20 -080042TEST_F(BinTreeTest, Two_non_null_tree_merge) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070043 BinaryTree<int>::iterator pos = m_pTestee->root();
Stephen Hines37b74a32014-11-26 18:48:20 -080044 m_pTestee->join<TreeIteratorBase::Rightward>(pos, 0);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070045 --pos;
Stephen Hines37b74a32014-11-26 18:48:20 -080046 m_pTestee->join<TreeIteratorBase::Rightward>(pos, 1);
47 m_pTestee->join<TreeIteratorBase::Leftward>(pos, 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070048 --pos;
Stephen Hines37b74a32014-11-26 18:48:20 -080049 m_pTestee->join<TreeIteratorBase::Rightward>(pos, 2);
50 m_pTestee->join<TreeIteratorBase::Leftward>(pos, 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070051
Stephen Hines37b74a32014-11-26 18:48:20 -080052 BinaryTree<int>* mergeTree = new BinaryTree<int>;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070053 BinaryTree<int>::iterator pos2 = mergeTree->root();
Stephen Hines37b74a32014-11-26 18:48:20 -080054 mergeTree->join<TreeIteratorBase::Rightward>(pos2, 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070055 --pos2;
Stephen Hines37b74a32014-11-26 18:48:20 -080056 mergeTree->join<TreeIteratorBase::Rightward>(pos2, 1);
57 mergeTree->join<TreeIteratorBase::Leftward>(pos2, 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070058
Stephen Hines37b74a32014-11-26 18:48:20 -080059 m_pTestee->merge<TreeIteratorBase::Rightward>(pos, *mergeTree);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070060 delete mergeTree;
Stephen Hines37b74a32014-11-26 18:48:20 -080061 EXPECT_TRUE(m_pTestee->size() == 8);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070062}
63
64/// ---- TEST - 2 ----
Stephen Hines37b74a32014-11-26 18:48:20 -080065TEST_F(BinTreeTest, A_null_tree_merge_a_non_null_tree) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070066 BinaryTree<int>::iterator pos = m_pTestee->root();
Shih-wei Liao22add6f2012-12-15 17:21:00 -080067
Stephen Hines37b74a32014-11-26 18:48:20 -080068 BinaryTree<int>* mergeTree = new BinaryTree<int>;
69 mergeTree->join<TreeIteratorBase::Rightward>(pos, 0);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070070 --pos;
Stephen Hines37b74a32014-11-26 18:48:20 -080071 mergeTree->join<TreeIteratorBase::Rightward>(pos, 1);
72 mergeTree->join<TreeIteratorBase::Leftward>(pos, 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070073 --pos;
Stephen Hines37b74a32014-11-26 18:48:20 -080074 mergeTree->join<TreeIteratorBase::Rightward>(pos, 2);
75 mergeTree->join<TreeIteratorBase::Leftward>(pos, 2);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070076
Stephen Hines37b74a32014-11-26 18:48:20 -080077 m_pTestee->merge<TreeIteratorBase::Rightward>(pos, *mergeTree);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070078
79 delete mergeTree;
Stephen Hines37b74a32014-11-26 18:48:20 -080080 EXPECT_TRUE(m_pTestee->size() == 5);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070081}
82
Stephen Hines37b74a32014-11-26 18:48:20 -080083TEST_F(BinTreeTest, A_non_null_tree_merge_a_null_tree) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070084 BinaryTree<int>::iterator pos = m_pTestee->root();
Stephen Hines37b74a32014-11-26 18:48:20 -080085 m_pTestee->join<TreeIteratorBase::Rightward>(pos, 0);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070086 --pos;
Stephen Hines37b74a32014-11-26 18:48:20 -080087 m_pTestee->join<TreeIteratorBase::Rightward>(pos, 1);
88 m_pTestee->join<TreeIteratorBase::Leftward>(pos, 1);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070089 --pos;
Stephen Hines37b74a32014-11-26 18:48:20 -080090 m_pTestee->join<TreeIteratorBase::Rightward>(pos, 2);
91 m_pTestee->join<TreeIteratorBase::Leftward>(pos, 2);
Shih-wei Liao22add6f2012-12-15 17:21:00 -080092
Stephen Hines37b74a32014-11-26 18:48:20 -080093 BinaryTree<int>* mergeTree = new BinaryTree<int>;
Shih-wei Liao22add6f2012-12-15 17:21:00 -080094 BinaryTree<int>::iterator pos2 = mergeTree->root();
Stephen Hines37b74a32014-11-26 18:48:20 -080095 mergeTree->merge<TreeIteratorBase::Rightward>(pos2, *m_pTestee);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070096
Stephen Hines37b74a32014-11-26 18:48:20 -080097 // delete m_pTestee;
98 EXPECT_TRUE(mergeTree->size() == 5);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -070099 delete mergeTree;
100}
101
Stephen Hines37b74a32014-11-26 18:48:20 -0800102TEST_F(BinTreeTest, Two_null_tree_merge) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700103 BinaryTree<int>::iterator pos = m_pTestee->root();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700104
Stephen Hines37b74a32014-11-26 18:48:20 -0800105 BinaryTree<int>* mergeTree = new BinaryTree<int>;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800106 BinaryTree<int>::iterator pos2 = mergeTree->root();
107
Stephen Hines37b74a32014-11-26 18:48:20 -0800108 mergeTree->merge<TreeIteratorBase::Rightward>(pos2, *m_pTestee);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700109
Stephen Hines37b74a32014-11-26 18:48:20 -0800110 // delete m_pTestee;
111 EXPECT_TRUE(mergeTree->size() == 0);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700112 delete mergeTree;
113}
114
Stephen Hines37b74a32014-11-26 18:48:20 -0800115TEST_F(BinTreeTest, DFSIterator_BasicTraversal) {
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800116 int a = 111, b = 10, c = 9, d = 8, e = 7;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700117 BinaryTree<int>::iterator pos = m_pTestee->root();
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800118
Stephen Hines37b74a32014-11-26 18:48:20 -0800119 m_pTestee->join<InputTree::Inclusive>(pos, a);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700120 pos.move<InputTree::Inclusive>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800121 m_pTestee->join<InputTree::Positional>(pos, b);
122 m_pTestee->join<InputTree::Inclusive>(pos, c);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700123 pos.move<InputTree::Inclusive>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800124 m_pTestee->join<InputTree::Positional>(pos, d);
125 m_pTestee->join<InputTree::Inclusive>(pos, e);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800126
127 BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin();
128 BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700129
130 ASSERT_EQ(111, **dfs_it);
131 ++dfs_it;
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800132 EXPECT_EQ(9, **dfs_it);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700133 ++dfs_it;
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800134 EXPECT_EQ(7, **dfs_it);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700135 ++dfs_it;
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800136 EXPECT_EQ(8, **dfs_it);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700137 ++dfs_it;
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800138 EXPECT_EQ(10, **dfs_it);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700139 ++dfs_it;
Stephen Hines37b74a32014-11-26 18:48:20 -0800140 EXPECT_TRUE(dfs_it == dfs_end);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700141}
142
Stephen Hines37b74a32014-11-26 18:48:20 -0800143TEST_F(BinTreeTest, DFSIterator_RightMostTree) {
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800144 int a = 0, b = 1, c = 2, d = 3, e = 4;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700145 BinaryTree<int>::iterator pos = m_pTestee->root();
Stephen Hines37b74a32014-11-26 18:48:20 -0800146 m_pTestee->join<InputTree::Inclusive>(pos, a);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700147 pos.move<InputTree::Inclusive>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800148 m_pTestee->join<InputTree::Positional>(pos, b);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700149 pos.move<InputTree::Positional>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800150 m_pTestee->join<InputTree::Positional>(pos, c);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700151 pos.move<InputTree::Positional>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800152 m_pTestee->join<InputTree::Positional>(pos, d);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700153 pos.move<InputTree::Positional>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800154 m_pTestee->join<InputTree::Positional>(pos, e);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800155
156 BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin();
157 BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700158
159 ASSERT_EQ(0, **dfs_it);
160 ++dfs_it;
161 ASSERT_EQ(1, **dfs_it);
162 ++dfs_it;
163 ASSERT_EQ(2, **dfs_it);
164 ++dfs_it;
165 ASSERT_EQ(3, **dfs_it);
166 ++dfs_it;
167 ASSERT_EQ(4, **dfs_it);
168 ++dfs_it;
Stephen Hines37b74a32014-11-26 18:48:20 -0800169 ASSERT_TRUE(dfs_it == dfs_end);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700170}
171
Stephen Hines37b74a32014-11-26 18:48:20 -0800172TEST_F(BinTreeTest, DFSIterator_SingleNode) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700173 BinaryTree<int>::iterator pos = m_pTestee->root();
Stephen Hines37b74a32014-11-26 18:48:20 -0800174 m_pTestee->join<InputTree::Inclusive>(pos, 0);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800175 BinaryTree<int>::dfs_iterator dfs_it = m_pTestee->dfs_begin();
176 BinaryTree<int>::dfs_iterator dfs_end = m_pTestee->dfs_end();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700177 int counter = 0;
Stephen Hines37b74a32014-11-26 18:48:20 -0800178 while (dfs_it != dfs_end) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700179 ++counter;
180 ++dfs_it;
181 }
182 ASSERT_EQ(1, counter);
183}
184
Stephen Hines37b74a32014-11-26 18:48:20 -0800185TEST_F(BinTreeTest, BFSIterator_BasicTraversal) {
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800186 int a = 111, b = 10, c = 9, d = 8, e = 7;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700187 BinaryTree<int>::iterator pos = m_pTestee->root();
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800188
Stephen Hines37b74a32014-11-26 18:48:20 -0800189 m_pTestee->join<InputTree::Inclusive>(pos, a);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700190 pos.move<InputTree::Inclusive>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800191 m_pTestee->join<InputTree::Positional>(pos, b);
192 m_pTestee->join<InputTree::Inclusive>(pos, c);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700193 pos.move<InputTree::Inclusive>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800194 m_pTestee->join<InputTree::Positional>(pos, d);
195 m_pTestee->join<InputTree::Inclusive>(pos, e);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800196
197 BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin();
198 BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700199
200 ASSERT_EQ(111, **bfs_it);
201 ++bfs_it;
202 ASSERT_EQ(10, **bfs_it);
203 ++bfs_it;
204 ASSERT_EQ(9, **bfs_it);
205 ++bfs_it;
206 ASSERT_EQ(8, **bfs_it);
207 ++bfs_it;
208 ASSERT_EQ(7, **bfs_it);
209 ++bfs_it;
Stephen Hines37b74a32014-11-26 18:48:20 -0800210 ASSERT_TRUE(bfs_it == bfs_end);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800211 bfs_it = m_pTestee->bfs_begin();
212 bfs_end = m_pTestee->bfs_end();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700213}
214
Stephen Hines37b74a32014-11-26 18:48:20 -0800215TEST_F(BinTreeTest, BFSIterator_RightMostTree) {
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800216 int a = 0, b = 1, c = 2, d = 3, e = 4;
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700217 BinaryTree<int>::iterator pos = m_pTestee->root();
Stephen Hines37b74a32014-11-26 18:48:20 -0800218 m_pTestee->join<InputTree::Inclusive>(pos, a);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700219 pos.move<InputTree::Inclusive>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800220 m_pTestee->join<InputTree::Positional>(pos, b);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700221 pos.move<InputTree::Positional>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800222 m_pTestee->join<InputTree::Positional>(pos, c);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700223 pos.move<InputTree::Positional>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800224 m_pTestee->join<InputTree::Positional>(pos, d);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700225 pos.move<InputTree::Positional>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800226 m_pTestee->join<InputTree::Positional>(pos, e);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800227
228 BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin();
229 BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700230
231 ASSERT_EQ(0, **bfs_it);
232 ++bfs_it;
233 ASSERT_EQ(1, **bfs_it);
234 ++bfs_it;
235 ASSERT_EQ(2, **bfs_it);
236 ++bfs_it;
237 ASSERT_EQ(3, **bfs_it);
238 ++bfs_it;
239 ASSERT_EQ(4, **bfs_it);
240 ++bfs_it;
Stephen Hines37b74a32014-11-26 18:48:20 -0800241 ASSERT_TRUE(bfs_it == bfs_end);
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700242}
243
Stephen Hines37b74a32014-11-26 18:48:20 -0800244TEST_F(BinTreeTest, BFSIterator_SingleNode) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700245 BinaryTree<int>::iterator pos = m_pTestee->root();
Stephen Hines37b74a32014-11-26 18:48:20 -0800246 m_pTestee->join<InputTree::Inclusive>(pos, 0);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800247 BinaryTree<int>::bfs_iterator bfs_it = m_pTestee->bfs_begin();
248 BinaryTree<int>::bfs_iterator bfs_end = m_pTestee->bfs_end();
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700249 int counter = 0;
Stephen Hines37b74a32014-11-26 18:48:20 -0800250 while (bfs_it != bfs_end) {
Shih-wei Liao5460a1f2012-03-16 22:41:16 -0700251 ++counter;
252 ++bfs_it;
253 }
254 ASSERT_EQ(1, counter);
255}
256
Stephen Hines37b74a32014-11-26 18:48:20 -0800257TEST_F(BinTreeTest, TreeIterator) {
Stephen Hinesf33f6de2014-02-14 18:00:16 -0800258 int a = 0, b = 1, c = 2, d = 3, e = 4, f = 5;
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800259 BinaryTree<int>::iterator pos = m_pTestee->root();
Stephen Hines37b74a32014-11-26 18:48:20 -0800260 m_pTestee->join<InputTree::Inclusive>(pos, a);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800261 pos.move<InputTree::Inclusive>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800262 m_pTestee->join<InputTree::Positional>(pos, b);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800263 pos.move<InputTree::Positional>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800264 m_pTestee->join<InputTree::Inclusive>(pos, c);
265 m_pTestee->join<InputTree::Positional>(pos, f);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800266 pos.move<InputTree::Inclusive>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800267 m_pTestee->join<InputTree::Positional>(pos, d);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800268 pos.move<InputTree::Positional>();
Stephen Hines37b74a32014-11-26 18:48:20 -0800269 m_pTestee->join<InputTree::Positional>(pos, e);
Shih-wei Liao22add6f2012-12-15 17:21:00 -0800270
271 BinaryTree<int>::iterator it = m_pTestee->begin();
272 BinaryTree<int>::iterator end = m_pTestee->end();
273
274 ASSERT_EQ(0, **it);
275 ++it;
276 ASSERT_EQ(1, **it);
277 --it;
278 ASSERT_EQ(2, **it);
279 ++it;
280 ASSERT_EQ(3, **it);
281 ++it;
282 ASSERT_EQ(4, **it);
283 ++it;
284 ASSERT_TRUE(it == end);
285
286 it = m_pTestee->begin();
287 ++it;
288 ++it;
289 ASSERT_EQ(5, **it);
290 ++it;
291 ASSERT_TRUE(it == end);
292}