6 use Test::More tests => 67;
9 use_ok('t::lib::BinaryTree');
12 ## ----------------------------------------------------------------------------
13 ## These are all tests which are derived from the Tree::Binary test suite
14 ## ----------------------------------------------------------------------------
16 ## ----------------------------------------------------------------------------
17 ## t/10_Tree_Binary_test.t
19 can_ok("BinaryTree", 'new');
20 can_ok("BinaryTree", 'setLeft');
21 can_ok("BinaryTree", 'setRight');
23 my $btree = BinaryTree->new("/")
42 isa_ok($btree, 'BinaryTree');
44 ## informational methods
46 can_ok($btree, 'isRoot');
47 ok($btree->isRoot(), '... this is the root');
49 can_ok($btree, 'isLeaf');
50 ok(!$btree->isLeaf(), '... this is not a leaf node');
51 ok($btree->getLeft()->getLeft()->isLeaf(), '... this is a leaf node');
53 can_ok($btree, 'hasLeft');
54 ok($btree->hasLeft(), '... this has a left node');
56 can_ok($btree, 'hasRight');
57 ok($btree->hasRight(), '... this has a right node');
61 can_ok($btree, 'getUID');
64 my $UID = $btree->getUID();
65 is(("$btree" =~ /\((.*?)\)$/), $UID, '... our UID is derived from the stringified object');
68 can_ok($btree, 'getNodeValue');
69 is($btree->getNodeValue(), '/', '... got what we expected');
72 can_ok($btree, 'getLeft');
73 my $left = $btree->getLeft();
75 isa_ok($left, 'BinaryTree');
77 is($left->getNodeValue(), '+', '... got what we expected');
79 can_ok($left, 'getParent');
81 my $parent = $left->getParent();
82 isa_ok($parent, 'BinaryTree');
84 is($parent, $btree, '.. got what we expected');
88 can_ok($btree, 'getRight');
89 my $right = $btree->getRight();
91 isa_ok($right, 'BinaryTree');
93 is($right->getNodeValue(), '*', '... got what we expected');
95 can_ok($right, 'getParent');
97 my $parent = $right->getParent();
98 isa_ok($parent, 'BinaryTree');
100 is($parent, $btree, '.. got what we expected');
105 can_ok($btree, 'setUID');
106 $btree->setUID("Our UID for this tree");
108 is($btree->getUID(), 'Our UID for this tree', '... our UID is not what we expected');
110 can_ok($btree, 'setNodeValue');
111 $btree->setNodeValue('*');
113 is($btree->getNodeValue(), '*', '... got what we expected');
117 can_ok($btree, 'removeLeft');
118 my $left = $btree->removeLeft();
119 isa_ok($left, 'BinaryTree');
121 ok(!$btree->hasLeft(), '... we dont have a left node anymore');
122 ok(!$btree->isLeaf(), '... and we are not a leaf node');
124 $btree->setLeft($left);
126 ok($btree->hasLeft(), '... we have our left node again');
127 is($btree->getLeft(), $left, '... and it is what we told it to be');
132 my $left_leaf = $btree->getLeft()->removeLeft();
133 isa_ok($left_leaf, 'BinaryTree');
135 ok($left_leaf->isLeaf(), '... our left leaf is a leaf');
137 ok(!$btree->getLeft()->hasLeft(), '... we dont have a left leaf node anymore');
139 $btree->getLeft()->setLeft($left_leaf);
141 ok($btree->getLeft()->hasLeft(), '... we have our left leaf node again');
142 is($btree->getLeft()->getLeft(), $left_leaf, '... and it is what we told it to be');
146 can_ok($btree, 'removeRight');
147 my $right = $btree->removeRight();
148 isa_ok($right, 'BinaryTree');
150 ok(!$btree->hasRight(), '... we dont have a right node anymore');
151 ok(!$btree->isLeaf(), '... and we are not a leaf node');
153 $btree->setRight($right);
155 ok($btree->hasRight(), '... we have our right node again');
156 is($btree->getRight(), $right, '... and it is what we told it to be')
161 my $right_leaf = $btree->getRight()->removeRight();
162 isa_ok($right_leaf, 'BinaryTree');
164 ok($right_leaf->isLeaf(), '... our right leaf is a leaf');
166 ok(!$btree->getRight()->hasRight(), '... we dont have a right leaf node anymore');
168 $btree->getRight()->setRight($right_leaf);
170 ok($btree->getRight()->hasRight(), '... we have our right leaf node again');
171 is($btree->getRight()->getRight(), $right_leaf, '... and it is what we told it to be');
174 # some of the recursive informational methods
178 my $btree = BinaryTree->new("o")
190 ->setRight(BinaryTree->new("o"))
211 ->setRight(BinaryTree->new("o"))
214 isa_ok($btree, 'BinaryTree');
216 can_ok($btree, 'size');
217 cmp_ok($btree->size(), '==', 14, '... we have 14 nodes in the tree');
219 can_ok($btree, 'height');
220 cmp_ok($btree->height(), '==', 6, '... the tree is 6 nodes tall');
224 ## ----------------------------------------------------------------------------
225 ## t/13_Tree_Binary_mirror_test.t
227 sub inOrderTraverse {
230 my $_inOrderTraverse = sub {
231 my ($tree, $traversal_function) = @_;
232 $traversal_function->($tree->getLeft(), $traversal_function) if $tree->hasLeft();
233 push @results => $tree->getNodeValue();
234 $traversal_function->($tree->getRight(), $traversal_function) if $tree->hasRight();
236 $_inOrderTraverse->($tree, $_inOrderTraverse);
240 # test it on a simple well balanaced tree
242 my $btree = BinaryTree->new(4)
261 isa_ok($btree, 'BinaryTree');
264 [ inOrderTraverse($btree) ],
266 '... check that our tree starts out correctly');
268 can_ok($btree, 'mirror');
272 [ inOrderTraverse($btree) ],
274 '... check that our tree ends up correctly');
277 # test is on a more chaotic tree
279 my $btree = BinaryTree->new(4)
310 isa_ok($btree, 'BinaryTree');
312 my @results = inOrderTraverse($btree);
317 [ inOrderTraverse($btree) ],
318 [ reverse(@results) ],
319 '... this should be the reverse of the original');