1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 67;
7
8BEGIN { 
9	use_ok('Tree::Simple'); 
10};
11
12
13{ # test height (with pictures)
14    
15    my $tree = Tree::Simple->new();
16    isa_ok($tree, 'Tree::Simple');
17    
18    my $D = Tree::Simple->new('D');
19    isa_ok($D, 'Tree::Simple');
20    
21    $tree->addChild($D);
22    
23    #   |
24    #  <D>
25    
26    cmp_ok($D->getHeight(), '==', 1, '... D has a height of 1');
27    
28    my $E = Tree::Simple->new('E');
29    isa_ok($E, 'Tree::Simple');
30    
31    $D->addChild($E);
32    
33    #   |
34    #  <D>
35    #    \
36    #    <E>
37    
38    cmp_ok($D->getHeight(), '==', 2, '... D has a height of 2');
39    cmp_ok($E->getHeight(), '==', 1, '... E has a height of 1');
40    
41    my $F = Tree::Simple->new('F');
42    isa_ok($F, 'Tree::Simple');
43    
44    $E->addChild($F);
45    
46    #   |
47    #  <D>
48    #    \
49    #    <E>
50    #      \
51    #      <F>
52    
53    cmp_ok($D->getHeight(), '==', 3, '... D has a height of 3');
54    cmp_ok($E->getHeight(), '==', 2, '... E has a height of 2');
55    cmp_ok($F->getHeight(), '==', 1, '... F has a height of 1');
56    
57    my $C = Tree::Simple->new('C');
58    isa_ok($C, 'Tree::Simple');
59    
60    $D->addChild($C);
61    
62    #    |
63    #   <D>
64    #   / \
65    # <C> <E>
66    #       \
67    #       <F>
68    
69    cmp_ok($D->getHeight(), '==', 3, '... D has a height of 3');
70    cmp_ok($E->getHeight(), '==', 2, '... E has a height of 2');
71    cmp_ok($F->getHeight(), '==', 1, '... F has a height of 1');
72    cmp_ok($C->getHeight(), '==', 1, '... C has a height of 1');
73    
74    my $B = Tree::Simple->new('B');
75    isa_ok($B, 'Tree::Simple');
76    
77    $C->addChild($B);
78    
79    #      |
80    #     <D>
81    #     / \
82    #   <C> <E>
83    #   /     \
84    # <B>     <F>
85    
86    
87    cmp_ok($D->getHeight(), '==', 3, '... D has a height of 3');
88    cmp_ok($E->getHeight(), '==', 2, '... E has a height of 2');
89    cmp_ok($F->getHeight(), '==', 1, '... F has a height of 1');
90    cmp_ok($C->getHeight(), '==', 2, '... C has a height of 2');
91    cmp_ok($B->getHeight(), '==', 1, '... B has a height of 1');
92    
93    my $A = Tree::Simple->new('A');
94    isa_ok($A, 'Tree::Simple');
95    
96    $B->addChild($A);
97    
98    #        |
99    #       <D>
100    #       / \
101    #     <C> <E>
102    #     /     \
103    #   <B>     <F>
104    #   /         
105    # <A>         
106    
107    cmp_ok($D->getHeight(), '==', 4, '... D has a height of 4');
108    cmp_ok($E->getHeight(), '==', 2, '... E has a height of 2');
109    cmp_ok($F->getHeight(), '==', 1, '... F has a height of 1');
110    cmp_ok($C->getHeight(), '==', 3, '... C has a height of 3');
111    cmp_ok($B->getHeight(), '==', 2, '... B has a height of 2');
112    cmp_ok($A->getHeight(), '==', 1, '... A has a height of 1');
113    
114    my $G = Tree::Simple->new('G');
115    isa_ok($G, 'Tree::Simple');
116    
117    $E->insertChild(0, $G);
118    
119    #        |
120    #       <D>
121    #       / \
122    #     <C> <E>
123    #     /   / \
124    #   <B> <G> <F>
125    #   /         
126    # <A>         
127    
128    cmp_ok($D->getHeight(), '==', 4, '... D has a height of 4');
129    cmp_ok($E->getHeight(), '==', 2, '... E has a height of 2');
130    cmp_ok($F->getHeight(), '==', 1, '... F has a height of 1');
131    cmp_ok($G->getHeight(), '==', 1, '... G has a height of 1');
132    cmp_ok($C->getHeight(), '==', 3, '... C has a height of 3');
133    cmp_ok($B->getHeight(), '==', 2, '... B has a height of 2');
134    cmp_ok($A->getHeight(), '==', 1, '... A has a height of 1');
135    
136    my $H = Tree::Simple->new('H');
137    isa_ok($H, 'Tree::Simple');
138    
139    $G->addChild($H);
140    
141    #        |
142    #       <D>
143    #       / \
144    #     <C> <E>
145    #     /   / \
146    #   <B> <G> <F>
147    #   /     \    
148    # <A>     <H>    
149    
150    cmp_ok($D->getHeight(), '==', 4, '... D has a height of 4');
151    cmp_ok($E->getHeight(), '==', 3, '... E has a height of 3');
152    cmp_ok($F->getHeight(), '==', 1, '... F has a height of 1');
153    cmp_ok($G->getHeight(), '==', 2, '... G has a height of 2');
154    cmp_ok($H->getHeight(), '==', 1, '... H has a height of 1');
155    cmp_ok($C->getHeight(), '==', 3, '... C has a height of 3');
156    cmp_ok($B->getHeight(), '==', 2, '... B has a height of 2');
157    cmp_ok($A->getHeight(), '==', 1, '... A has a height of 1');
158
159    ok($B->removeChild($A), '... removed A subtree from B tree');
160
161    #        |
162    #       <D>
163    #       / \
164    #     <C> <E>
165    #     /   / \
166    #   <B> <G> <F>
167    #         \    
168    #         <H> 
169
170    cmp_ok($D->getHeight(), '==', 4, '... D has a height of 4');
171    cmp_ok($E->getHeight(), '==', 3, '... E has a height of 3');
172    cmp_ok($F->getHeight(), '==', 1, '... F has a height of 1');
173    cmp_ok($G->getHeight(), '==', 2, '... G has a height of 2');
174    cmp_ok($H->getHeight(), '==', 1, '... H has a height of 1');
175    cmp_ok($C->getHeight(), '==', 2, '... C has a height of 2');
176    cmp_ok($B->getHeight(), '==', 1, '... B has a height of 1');
177    
178    # and the removed tree is ok
179    cmp_ok($A->getHeight(), '==', 1, '... A has a height of 1');
180    
181    ok($D->removeChild($E), '... removed E subtree from D tree');
182
183    #        |
184    #       <D>
185    #       / 
186    #     <C> 
187    #     /     
188    #   <B>
189
190    cmp_ok($D->getHeight(), '==', 3, '... D has a height of 3');
191    cmp_ok($C->getHeight(), '==', 2, '... C has a height of 2');
192    cmp_ok($B->getHeight(), '==', 1, '... B has a height of 1');
193    
194    # and the removed trees are ok
195    cmp_ok($E->getHeight(), '==', 3, '... E has a height of 3');
196    cmp_ok($F->getHeight(), '==', 1, '... F has a height of 1');
197    cmp_ok($G->getHeight(), '==', 2, '... G has a height of 2');
198    cmp_ok($H->getHeight(), '==', 1, '... H has a height of 1');    
199    
200    ok($D->removeChild($C), '... removed C subtree from D tree');
201
202    #        |
203    #       <D>
204
205    cmp_ok($D->getHeight(), '==', 1, '... D has a height of 1');
206    
207    # and the removed tree is ok
208    cmp_ok($C->getHeight(), '==', 2, '... C has a height of 2');
209    cmp_ok($B->getHeight(), '==', 1, '... B has a height of 1');      
210}
211