This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #87708] $tied + $tied
[perl5.git] / t / op / while_readdir.t
CommitLineData
114c60ec
BG
1#!./perl
2
3BEGIN {
4 chdir 't' if -d 't';
5 @INC = '../lib';
6 require './test.pl';
7}
8
9use strict;
10use warnings;
11
b7781c7e
NC
12plan 10;
13
14# Need to run this in a quiet private directory as it assumes that it can read
15# the contents twice and get the same result.
16my $tempdir = tempfile;
17
18mkdir $tempdir, 0700 or die "Can't mkdir '$tempdir': $!";
19chdir $tempdir or die die "Can't chdir '$tempdir': $!";
20
21my $cleanup = 1;
22my %tempfiles;
23
24END {
25 if ($cleanup) {
26 foreach my $file (keys %tempfiles) {
27 # We only wrote each of these once so 1 delete should work:
28 if (unlink $file) {
29 warn "unlink tempfile '$file' passed but it's still there"
30 if -e $file;
31 } else {
32 warn "Couldn't unlink tempfile '$file': $!";
33 }
34 }
35 chdir '..' or die "Couldn't chdir .. for cleanup: $!";
36 rmdir $tempdir or die "Couldn't unlink tempdir '$tempdir': $!";
37 }
38}
39
40# This is intentionally not random (per run), but intentionally will try to
41# give different file names for different people running this test.
42srand $< * $];
43
44my @chars = ('A' .. 'Z', 'a' .. 'z', 0 .. 9);
45
46sub make_file {
47 my $name = shift;
48
49 return if $tempfiles{$name}++;
50
51 print "# Writing to $name in $tempdir\n";
52
53 open my $fh, '>', $name or die "Can't open '$name' for writing: $!\n";
54 print $fh <<'FILE0';
d1c21cec 55This file is here for testing
114c60ec 56
d1c21cec
RGS
57while(readdir $dir){...}
58... while readdir $dir
114c60ec 59
d1c21cec
RGS
60etc
61FILE0
b7781c7e
NC
62 close $fh or die "Can't close '$name': $!";
63}
114c60ec 64
b7781c7e
NC
65sub make_some_files {
66 for (1..int rand 10) {
67 my $name;
68 $name .= $chars[rand $#chars] for 1..int(1 + rand 5);
69 make_file($name);
70 }
71}
72
73make_some_files();
74make_file('0');
75make_some_files();
114c60ec 76
d1c21cec
RGS
77ok(-f '0', "'0' file is here");
78
79opendir my $dirhandle, '.'
80 or die "Failed test: unable to open directory: $!\n";
81
82my @dir = readdir $dirhandle;
83rewinddir $dirhandle;
114c60ec
BG
84
85{
86 my @list;
87 while(readdir $dirhandle){
88 push @list, $_;
89 }
90 ok( eq_array( \@dir, \@list ), 'while(readdir){push}' );
91 rewinddir $dirhandle;
92}
93
94{
95 my @list;
96 push @list, $_ while readdir $dirhandle;
97 ok( eq_array( \@dir, \@list ), 'push while readdir' );
98 rewinddir $dirhandle;
99}
100
101{
102 my $tmp;
103 my @list;
104 push @list, $tmp while $tmp = readdir $dirhandle;
105 ok( eq_array( \@dir, \@list ), 'push $dir while $dir = readdir' );
106 rewinddir $dirhandle;
107}
108
109{
110 my @list;
111 while( my $dir = readdir $dirhandle){
112 push @list, $dir;
113 }
114 ok( eq_array( \@dir, \@list ), 'while($dir=readdir){push}' );
115 rewinddir $dirhandle;
116}
117
118
119{
120 my @list;
121 my $sub = sub{
122 push @list, $_;
123 };
124 $sub->($_) while readdir $dirhandle;
125 ok( eq_array( \@dir, \@list ), '$sub->($_) while readdir' );
126 rewinddir $dirhandle;
127}
128
d1c21cec
RGS
129{
130 my $works = 0;
131 while(readdir $dirhandle){
df251d1f 132 $_ =~ s/\.$// if defined $_ && $^O eq 'VMS'; # may have zero-length extension
d1c21cec
RGS
133 if( defined $_ && $_ eq '0'){
134 $works = 1;
135 last;
136 }
114c60ec 137 }
d1c21cec
RGS
138 ok( $works, 'while(readdir){} with file named "0"' );
139 rewinddir $dirhandle;
140}
114c60ec 141
d1c21cec
RGS
142{
143 my $works = 0;
144 my $sub = sub{
df251d1f 145 $_ =~ s/\.$// if defined $_ && $^O eq 'VMS'; # may have zero-length extension
d1c21cec
RGS
146 if( defined $_ && $_ eq '0' ){
147 $works = 1;
148 }
149 };
150 $sub->($_) while readdir $dirhandle;
151 ok( $works, '$sub->($_) while readdir; with file named "0"' );
152 rewinddir $dirhandle;
153}
154
155{
156 my $works = 0;
157 while( my $dir = readdir $dirhandle ){
df251d1f 158 $dir =~ s/\.$// if defined $dir && $^O eq 'VMS'; # may have zero-length extension
d1c21cec
RGS
159 if( defined $dir && $dir eq '0'){
160 $works = 1;
161 last;
162 }
114c60ec 163 }
d1c21cec
RGS
164 ok( $works, 'while($dir=readdir){} with file named "0"');
165 rewinddir $dirhandle;
166}
114c60ec 167
d1c21cec
RGS
168{
169 my $tmp;
170 my $ok;
171 my @list;
df251d1f
CB
172 while( $tmp = readdir $dirhandle ){
173 $tmp =~ s/\.$// if defined $tmp && $^O eq 'VMS'; # may have zero-length extension
174 last if defined($tmp)&& !$tmp && ($ok=1)
175 }
d1c21cec
RGS
176 ok( $ok, '$dir while $dir = readdir; with file named "0"' );
177 rewinddir $dirhandle;
114c60ec
BG
178}
179
180closedir $dirhandle;