This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
B::walksymtable improperly documented?
[perl5.git] / t / lib / filefind.t
1 ####!./perl
2
3
4 my %Expect;
5 my $symlink_exists = eval { symlink("",""); 1 };
6
7 BEGIN {
8     chdir 't' if -d 't';
9     @INC = '../lib';
10 }
11
12 if ( $symlink_exists ) { print "1..117\n"; }
13 else                   { print "1..61\n"; }
14
15 use File::Find;
16
17 find(sub { print "ok 1\n" if $_ eq 'filefind.t'; }, ".");
18 finddepth(sub { print "ok 2\n" if $_ eq 'filefind.t'; }, ".");
19
20
21 my $case = 2;
22 my $FastFileTests_OK = 0;
23
24 END {
25     unlink 'fa/fa_ord','fa/fsl','fa/faa/faa_ord',
26            'fa/fab/fab_ord','fa/fab/faba/faba_ord','fb/fb_ord','fb/fba/fba_ord';
27     rmdir 'fa/faa';
28     rmdir 'fa/fab/faba';
29     rmdir 'fa/fab';
30     rmdir 'fa';
31     rmdir 'fb/fba';
32     rmdir 'fb';
33     chdir '..';
34     rmdir 'for_find';
35 }
36
37 sub Check($) {
38   $case++;
39   if ($_[0]) { print "ok $case\n"; }
40   else       { print "not ok $case\n"; }
41 }
42
43 sub CheckDie($) {
44   $case++;
45   if ($_[0]) { print "ok $case\n"; }
46   else { print "not ok $case\n $!\n"; exit 0; }
47 }
48
49 sub touch {
50   CheckDie( open(my $T,'>',$_[0]) );
51 }
52
53 sub MkDir($$) {
54   CheckDie( mkdir($_[0],$_[1]) );
55 }
56
57 sub wanted {
58   print "# '$_' => 1\n";
59   s#\.$## if ($^O eq 'VMS' && $_ ne '.');
60   Check( $Expect{$_} );
61   if ( $FastFileTests_OK ) {
62     delete $Expect{$_} 
63       unless ( $Expect_Dir{$_} && ! -d _ );
64   } else {
65     delete $Expect{$_} 
66       unless ( $Expect_Dir{$_} && ! -d $_ );
67   }
68   $File::Find::prune=1 if  $_ eq 'faba';
69   
70 }
71
72 sub dn_wanted {
73   my $n = $File::Find::name;
74   $n =~ s#\.$## if ($^O eq 'VMS' && $n ne '.');
75   print "# '$n' => 1\n";
76   my $i = rindex($n,'/');
77   my $OK = exists($Expect{$n});
78   if ( $OK ) {
79       $OK= exists($Expect{substr($n,0,$i)})  if $i >= 0;
80   }
81   Check($OK);
82   delete $Expect{$n};
83 }
84
85 sub d_wanted {
86   print "# '$_' => 1\n";
87   s#\.$## if ($^O eq 'VMS' && $_ ne '.');
88   my $i = rindex($_,'/');
89   my $OK = exists($Expect{$_});
90   if ( $OK ) {
91       $OK= exists($Expect{substr($_,0,$i)})  if $i >= 0;
92   }
93   Check($OK);
94   delete $Expect{$_};
95 }
96
97 MkDir( 'for_find',0770 );
98 CheckDie(chdir(for_find));
99 MkDir( 'fa',0770 );
100 MkDir( 'fb',0770  );
101 touch('fb/fb_ord');
102 MkDir( 'fb/fba',0770  );
103 touch('fb/fba/fba_ord');
104 CheckDie( symlink('../fb','fa/fsl') ) if $symlink_exists;
105 touch('fa/fa_ord');
106
107 MkDir( 'fa/faa',0770  );
108 touch('fa/faa/faa_ord');
109 MkDir( 'fa/fab',0770  );
110 touch('fa/fab/fab_ord');
111 MkDir( 'fa/fab/faba',0770  );
112 touch('fa/fab/faba/faba_ord');
113
114 %Expect = ('.' => 1, 'fsl' => 1, 'fa_ord' => 1, 'fab' => 1, 'fab_ord' => 1,
115            'faba' => 1, 'faa' => 1, 'faa_ord' => 1);
116 delete $Expect{'fsl'} unless $symlink_exists;
117 %Expect_Dir = ('fa' => 1, 'faa' => 1, 'fab' => 1, 'faba' => 1, 
118                'fb' => 1, 'fba' => 1);
119 delete @Expect_Dir{'fb','fba'} unless $symlink_exists;
120 File::Find::find( {wanted => \&wanted, },'fa' );
121 Check( scalar(keys %Expect) == 0 );
122
123 %Expect=('fa' => 1, 'fa/fsl' => 1, 'fa/fa_ord' => 1, 'fa/fab' => 1,
124          'fa/fab/fab_ord' => 1, 'fa/fab/faba' => 1,
125          'fa/fab/faba/faba_ord' => 1, 'fa/faa' => 1, 'fa/faa/faa_ord' => 1);
126 delete $Expect{'fa/fsl'} unless $symlink_exists;
127 %Expect_Dir = ('fa' => 1, 'fa/faa' => 1, '/fa/fab' => 1, 'fa/fab/faba' => 1, 
128                'fb' => 1, 'fb/fba' => 1);
129 delete @Expect_Dir{'fb','fb/fba'} unless $symlink_exists;
130 File::Find::find( {wanted => \&wanted, no_chdir => 1},'fa' );
131
132 Check( scalar(keys %Expect) == 0 );
133
134 %Expect=('.' => 1, './fa' => 1, './fa/fsl' => 1, './fa/fa_ord' => 1, './fa/fab' => 1,
135          './fa/fab/fab_ord' => 1, './fa/fab/faba' => 1,
136          './fa/fab/faba/faba_ord' => 1, './fa/faa' => 1, './fa/faa/faa_ord' => 1,
137          './fb' => 1, './fb/fba' => 1, './fb/fba/fba_ord' => 1, './fb/fb_ord' => 1);
138 delete $Expect{'./fa/fsl'} unless $symlink_exists;
139 %Expect_Dir = ('./fa' => 1, './fa/faa' => 1, '/fa/fab' => 1, './fa/fab/faba' => 1, 
140                './fb' => 1, './fb/fba' => 1);
141 delete @Expect_Dir{'./fb','./fb/fba'} unless $symlink_exists;
142 File::Find::finddepth( {wanted => \&dn_wanted },'.' );
143 Check( scalar(keys %Expect) == 0 );
144
145 %Expect=('.' => 1, './fa' => 1, './fa/fsl' => 1, './fa/fa_ord' => 1, './fa/fab' => 1,
146          './fa/fab/fab_ord' => 1, './fa/fab/faba' => 1,
147          './fa/fab/faba/faba_ord' => 1, './fa/faa' => 1, './fa/faa/faa_ord' => 1,
148          './fb' => 1, './fb/fba' => 1, './fb/fba/fba_ord' => 1, './fb/fb_ord' => 1);
149 delete $Expect{'./fa/fsl'} unless $symlink_exists;
150 %Expect_Dir = ('./fa' => 1, './fa/faa' => 1, '/fa/fab' => 1, './fa/fab/faba' => 1, 
151                './fb' => 1, './fb/fba' => 1);
152 delete @Expect_Dir{'./fb','./fb/fba'} unless $symlink_exists;
153 File::Find::finddepth( {wanted => \&d_wanted, no_chdir => 1 },'.' );
154 Check( scalar(keys %Expect) == 0 );
155
156 if ( $symlink_exists ) {
157   $FastFileTests_OK= 1;
158   %Expect=('.' => 1, 'fa_ord' => 1, 'fsl' => 1, 'fb_ord' => 1, 'fba' => 1,
159            'fba_ord' => 1, 'fab' => 1, 'fab_ord' => 1, 'faba' => 1, 'faa' => 1,
160            'faa_ord' => 1);
161   %Expect_Dir = ('fa' => 1, 'fa/faa' => 1, '/fa/fab' => 1, 'fa/fab/faba' => 1, 
162                  'fb' => 1, 'fb/fba' => 1);
163
164   File::Find::find( {wanted => \&wanted, follow_fast => 1},'fa' );
165   Check( scalar(keys %Expect) == 0 );
166
167   %Expect=('fa' => 1, 'fa/fa_ord' => 1, 'fa/fsl' => 1, 'fa/fsl/fb_ord' => 1,
168            'fa/fsl/fba' => 1, 'fa/fsl/fba/fba_ord' => 1, 'fa/fab' => 1,
169            'fa/fab/fab_ord' => 1, 'fa/fab/faba' => 1, 'fa/fab/faba/faba_ord' => 1,
170            'fa/faa' => 1, 'fa/faa/faa_ord' => 1);
171   %Expect_Dir = ('fa' => 1, 'fa/faa' => 1, '/fa/fab' => 1, 'fa/fab/faba' => 1, 
172                  'fb' => 1, 'fb/fba' => 1);
173   File::Find::find( {wanted => \&wanted, follow_fast => 1, no_chdir => 1},'fa' );
174   Check( scalar(keys %Expect) == 0 );
175
176   %Expect=('fa' => 1, 'fa/fa_ord' => 1, 'fa/fsl' => 1, 'fa/fsl/fb_ord' => 1,
177            'fa/fsl/fba' => 1, 'fa/fsl/fba/fba_ord' => 1, 'fa/fab' => 1,
178            'fa/fab/fab_ord' => 1, 'fa/fab/faba' => 1, 'fa/fab/faba/faba_ord' => 1,
179            'fa/faa' => 1, 'fa/faa/faa_ord' => 1);
180   %Expect_Dir = ('fa' => 1, 'fa/faa' => 1, '/fa/fab' => 1, 'fa/fab/faba' => 1, 
181                  'fb' => 1, 'fb/fba' => 1);
182
183   File::Find::finddepth( {wanted => \&dn_wanted, follow_fast => 1},'fa' );
184   Check( scalar(keys %Expect) == 0 );
185
186   %Expect=('fa' => 1, 'fa/fa_ord' => 1, 'fa/fsl' => 1, 'fa/fsl/fb_ord' => 1,
187            'fa/fsl/fba' => 1, 'fa/fsl/fba/fba_ord' => 1, 'fa/fab' => 1,
188            'fa/fab/fab_ord' => 1, 'fa/fab/faba' => 1, 'fa/fab/faba/faba_ord' => 1,
189            'fa/faa' => 1, 'fa/faa/faa_ord' => 1);
190   %Expect_Dir = ('fa' => 1, 'fa/faa' => 1, '/fa/fab' => 1, 'fa/fab/faba' => 1, 
191                  'fb' => 1, 'fb/fba' => 1);
192
193   File::Find::finddepth( {wanted => \&d_wanted, follow_fast => 1, no_chdir => 1},'fa' );
194   Check( scalar(keys %Expect) == 0 );
195 }
196
197 print "# of cases: $case\n";