1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
6use Test::More tests => 32;
7use Test::Exception;
8
9BEGIN { 
10    use_ok('Tree::Simple::Visitor::LoadDirectoryTree');
11    use_ok('Tree::Simple::Visitor::GetAllDescendents');
12}
13
14use Tree::Simple;
15use File::Spec;
16
17can_ok("Tree::Simple::Visitor::LoadDirectoryTree", 'new');
18
19my @normal = qw(
20    Changes
21    lib
22        Tree
23            Simple
24                Visitor
25                    BreadthFirstTraversal.pm
26                    CreateDirectoryTree.pm
27                    FindByPath.pm
28                    FindByUID.pm
29                    FindByNodeValue.pm
30                    FromNestedArray.pm                        
31                    FromNestedHash.pm                  
32                    GetAllDescendents.pm
33                    LoadClassHierarchy.pm
34                    LoadDirectoryTree.pm
35                    PathToRoot.pm
36                    PostOrderTraversal.pm 
37                    PreOrderTraversal.pm 
38                    Sort.pm 
39                    ToNestedArray.pm
40                    ToNestedHash.pm
41                    VariableDepthClone.pm
42                VisitorFactory.pm   
43    Makefile.PL
44    MANIFEST
45    README
46    t
47        10_Tree_Simple_VisitorFactory_test.t
48    	20_Tree_Simple_Visitor_PathToRoot_test.t
49    	30_Tree_Simple_Visitor_FindByPath_test.t
50        32_Tree_Simple_Visitor_FindByNodeValue_test.t
51        35_Tree_Simple_Visitor_FindByUID_test.t
52    	40_Tree_Simple_Visitor_GetAllDescendents_test.t
53    	50_Tree_Simple_Visitor_BreadthFirstTraversal_test.t
54    	60_Tree_Simple_Visitor_PostOrderTraversal_test.t
55        65_Tree_Simple_Visitor_PreOrederTraversal_test.t
56    	70_Tree_Simple_Visitor_LoadDirectoryTree_test.t
57        75_Tree_Simple_Visitor_CreateDirectoryTree_test.t
58        80_Tree_Simple_Visitor_Sort_test.t
59        90_Tree_Simple_Visitor_FromNestedHash_test.t
60        91_Tree_Simple_Visitor_FromNestedArray_test.t
61        92_Tree_Simple_Visitor_ToNestedHash_test.t 
62        93_Tree_Simple_Visitor_ToNestedArray_test.t  
63        95_Tree_Simple_Visitor_LoadClassHierarchy_test.t 
64        96_Tree_Simple_Visitor_VariableDepthClone_test.t       
65    	pod.t
66    	pod_coverage.t
67);
68my %normal = map { $_ => undef } @normal;
69
70my $node_filter = sub {
71    my ($item) = @_;
72    return 0 unless exists $normal{$item};
73    return 1;
74};
75
76# normal order
77{
78    my $dir_tree = Tree::Simple->new(File::Spec->curdir(), Tree::Simple->ROOT);
79    isa_ok($dir_tree, 'Tree::Simple');
80
81    my $visitor = Tree::Simple::Visitor::LoadDirectoryTree->new();
82    isa_ok($visitor, 'Tree::Simple::Visitor::LoadDirectoryTree');
83    isa_ok($visitor, 'Tree::Simple::Visitor');
84    
85    # just examine the files in the MANIFEST
86    # not the ones created by the makefile
87    $visitor->setNodeFilter($node_filter);
88    
89    $dir_tree->accept($visitor);
90
91    my $visitor_check = Tree::Simple::Visitor::GetAllDescendents->new();
92    isa_ok($visitor_check, 'Tree::Simple::Visitor::GetAllDescendents');
93    
94    $dir_tree->accept($visitor_check);
95    
96    # we have to sort these because different OSes
97    # will return the results in different orders.
98    is_deeply(
99            [ sort $visitor_check->getResults() ],
100            [ sort @normal ],
101            '... our tree is in the proper order'); 
102}
103
104# file first order
105{
106    my $dir_tree = Tree::Simple->new(File::Spec->curdir(), Tree::Simple->ROOT);
107    isa_ok($dir_tree, 'Tree::Simple');
108
109    my $visitor = Tree::Simple::Visitor::LoadDirectoryTree->new();
110    isa_ok($visitor, 'Tree::Simple::Visitor::LoadDirectoryTree');
111    isa_ok($visitor, 'Tree::Simple::Visitor');
112    
113    # just examine the files in the MANIFEST
114    # not the ones created by the makefile 
115    $visitor->setNodeFilter($node_filter);
116    
117    can_ok($visitor, 'SORT_FILES_FIRST');
118    $visitor->setSortStyle($visitor->SORT_FILES_FIRST);
119    
120    $dir_tree->accept($visitor);
121    
122    my @files_first = qw(
123        Changes
124        Makefile.PL
125        MANIFEST
126        README        
127        lib
128            Tree
129                Simple
130                    VisitorFactory.pm                  
131                    Visitor
132                        BreadthFirstTraversal.pm
133                        CreateDirectoryTree.pm
134                        FindByNodeValue.pm
135                        FindByPath.pm                        
136                        FindByUID.pm
137                        FromNestedArray.pm                        
138                        FromNestedHash.pm                      
139                        GetAllDescendents.pm
140                        LoadClassHierarchy.pm                        
141                        LoadDirectoryTree.pm
142                        PathToRoot.pm
143                        PostOrderTraversal.pm    
144                        PreOrderTraversal.pm  
145                        Sort.pm  
146                        ToNestedArray.pm
147                        ToNestedHash.pm 
148                        VariableDepthClone.pm                                           
149        t
150            10_Tree_Simple_VisitorFactory_test.t
151        	20_Tree_Simple_Visitor_PathToRoot_test.t
152        	30_Tree_Simple_Visitor_FindByPath_test.t
153            32_Tree_Simple_Visitor_FindByNodeValue_test.t
154            35_Tree_Simple_Visitor_FindByUID_test.t
155        	40_Tree_Simple_Visitor_GetAllDescendents_test.t
156        	50_Tree_Simple_Visitor_BreadthFirstTraversal_test.t
157        	60_Tree_Simple_Visitor_PostOrderTraversal_test.t
158            65_Tree_Simple_Visitor_PreOrederTraversal_test.t
159        	70_Tree_Simple_Visitor_LoadDirectoryTree_test.t
160            75_Tree_Simple_Visitor_CreateDirectoryTree_test.t
161            80_Tree_Simple_Visitor_Sort_test.t
162            90_Tree_Simple_Visitor_FromNestedHash_test.t
163            91_Tree_Simple_Visitor_FromNestedArray_test.t 
164            92_Tree_Simple_Visitor_ToNestedHash_test.t 
165            93_Tree_Simple_Visitor_ToNestedArray_test.t  
166            95_Tree_Simple_Visitor_LoadClassHierarchy_test.t        
167            96_Tree_Simple_Visitor_VariableDepthClone_test.t 
168        	pod.t
169        	pod_coverage.t
170    );    
171
172    my $visitor_check = Tree::Simple::Visitor::GetAllDescendents->new();
173    isa_ok($visitor_check, 'Tree::Simple::Visitor::GetAllDescendents');
174    
175    $dir_tree->accept($visitor_check);
176        
177    is_deeply(
178            [ $visitor_check->getResults() ],
179            \@files_first,            
180            '... our tree is in the file first order'); 
181}
182
183
184# dir first order
185{
186    my $dir_tree = Tree::Simple->new(File::Spec->curdir(), Tree::Simple->ROOT);
187    isa_ok($dir_tree, 'Tree::Simple');
188
189    my $visitor = Tree::Simple::Visitor::LoadDirectoryTree->new();
190    isa_ok($visitor, 'Tree::Simple::Visitor::LoadDirectoryTree');
191    isa_ok($visitor, 'Tree::Simple::Visitor');
192    
193    # just examine the files in the MANIFEST
194    # not the ones created by the makefile   
195    $visitor->setNodeFilter($node_filter);
196    
197    can_ok($visitor, 'SORT_DIRS_FIRST');
198    $visitor->setSortStyle($visitor->SORT_DIRS_FIRST);
199    
200    $dir_tree->accept($visitor);
201    
202    my @dirs_first = qw(       
203        lib
204            Tree
205                Simple
206                    Visitor
207                        BreadthFirstTraversal.pm
208                        CreateDirectoryTree.pm
209                        FindByNodeValue.pm                        
210                        FindByPath.pm
211                        FindByUID.pm
212                        FromNestedArray.pm                        
213                        FromNestedHash.pm                        
214                        GetAllDescendents.pm
215                        LoadClassHierarchy.pm                        
216                        LoadDirectoryTree.pm
217                        PathToRoot.pm
218                        PostOrderTraversal.pm   
219                        PreOrderTraversal.pm 
220                        Sort.pm        
221                        ToNestedArray.pm
222                        ToNestedHash.pm   
223                        VariableDepthClone.pm                                    
224                    VisitorFactory.pm   
225        t
226            10_Tree_Simple_VisitorFactory_test.t
227        	20_Tree_Simple_Visitor_PathToRoot_test.t
228        	30_Tree_Simple_Visitor_FindByPath_test.t
229            32_Tree_Simple_Visitor_FindByNodeValue_test.t
230            35_Tree_Simple_Visitor_FindByUID_test.t
231        	40_Tree_Simple_Visitor_GetAllDescendents_test.t
232        	50_Tree_Simple_Visitor_BreadthFirstTraversal_test.t
233        	60_Tree_Simple_Visitor_PostOrderTraversal_test.t
234            65_Tree_Simple_Visitor_PreOrederTraversal_test.t
235        	70_Tree_Simple_Visitor_LoadDirectoryTree_test.t
236            75_Tree_Simple_Visitor_CreateDirectoryTree_test.t
237            80_Tree_Simple_Visitor_Sort_test.t
238            90_Tree_Simple_Visitor_FromNestedHash_test.t
239            91_Tree_Simple_Visitor_FromNestedArray_test.t   
240            92_Tree_Simple_Visitor_ToNestedHash_test.t 
241            93_Tree_Simple_Visitor_ToNestedArray_test.t   
242            95_Tree_Simple_Visitor_LoadClassHierarchy_test.t     
243            96_Tree_Simple_Visitor_VariableDepthClone_test.t               
244        	pod.t
245        	pod_coverage.t  
246        Changes
247        Makefile.PL
248        MANIFEST
249        README                             
250    );
251
252    my $visitor_check = Tree::Simple::Visitor::GetAllDescendents->new();
253    isa_ok($visitor_check, 'Tree::Simple::Visitor::GetAllDescendents');
254    
255    $dir_tree->accept($visitor_check);
256        
257    is_deeply(
258            [ $visitor_check->getResults() ],
259            \@dirs_first,
260            '... our tree is in the dir first order'); 
261}
262
263# test the errors
264{
265    my $visitor = Tree::Simple::Visitor::LoadDirectoryTree->new();
266    isa_ok($visitor, 'Tree::Simple::Visitor::LoadDirectoryTree');
267    isa_ok($visitor, 'Tree::Simple::Visitor');
268    
269    # check setSortStyle
270    can_ok($visitor, 'setSortStyle');
271    throws_ok {
272        $visitor->setSortStyle();
273    } qr/Insufficient Arguments/, '... got the error we expected';
274    
275    throws_ok {
276        $visitor->setSortStyle("Fail");
277    } qr/Insufficient Arguments/, '... got the error we expected';    
278    
279    throws_ok {
280        $visitor->setSortStyle([]);
281    } qr/Insufficient Arguments/, '... got the error we expected'; 
282    
283    # check visit
284    throws_ok {
285        $visitor->visit();
286    } qr/Insufficient Arguments/, '... got the error we expected';  
287    
288    throws_ok {
289        $visitor->visit("Fail");
290    } qr/Insufficient Arguments/, '... got the error we expected';                           
291
292    throws_ok {
293        $visitor->visit([]);
294    } qr/Insufficient Arguments/, '... got the error we expected'; 
295    
296    throws_ok {
297        $visitor->visit(bless({}, "Fail"));
298    } qr/Insufficient Arguments/, '... got the error we expected';     
299    
300    # check that tree is a leaf
301    
302    my $tree = Tree::Simple->new("test")->addChild(Tree::Simple->new("test 2"));
303    
304    throws_ok {
305        $visitor->visit($tree);
306    } qr/Illegal Operation/, '... got the error we expected';    
307    
308    throws_ok {
309        $visitor->visit($tree->getChild(0));
310    } qr/Incorrect Type/, '... got the error we expected';        
311                
312}
313