This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Test case for C<undef %File::Glob::>
[perl5.git] / t / op / magic.t
1 #!./perl
2
3 BEGIN {
4     $| = 1;
5     chdir 't' if -d 't';
6     @INC = '../lib';
7     $SIG{__WARN__} = sub { die "Dying on warning: ", @_ };
8 }
9
10 use warnings;
11
12 sub ok {
13     my ($n, $result, $info) = @_;
14     if ($result) {
15         print "ok $n\n";
16     }
17     else {
18         print "not ok $n\n";
19         print "# $info\n" if $info;
20     }
21 }
22
23 $Is_MSWin32 = $^O eq 'MSWin32';
24 $Is_VMS     = $^O eq 'VMS';
25 $Is_Dos   = $^O eq 'dos';
26 $Is_os2   = $^O eq 'os2';
27 $Is_Cygwin   = $^O eq 'cygwin';
28 $PERL = ($Is_MSWin32 ? '.\perl' : './perl');
29
30 print "1..38\n";
31
32 eval '$ENV{"FOO"} = "hi there";';       # check that ENV is inited inside eval
33 if ($Is_MSWin32) { ok 1, `cmd /x /c set FOO` eq "FOO=hi there\n"; }
34 else             { ok 1, `echo \$FOO` eq "hi there\n"; }
35
36 unlink 'ajslkdfpqjsjfk';
37 $! = 0;
38 open(FOO,'ajslkdfpqjsjfk');
39 ok 2, $!, $!;
40 close FOO; # just mention it, squelch used-only-once
41
42 if ($Is_MSWin32 || $Is_Dos) {
43     ok "3 # skipped",1;
44     ok "4 # skipped",1;
45 }
46 else {
47   # the next tests are embedded inside system simply because sh spits out
48   # a newline onto stderr when a child process kills itself with SIGINT.
49   system './perl', '-e', <<'END';
50
51     $| = 1;             # command buffering
52
53     $SIG{"INT"} = "ok3";     kill "INT",$$; sleep 1;
54     $SIG{"INT"} = "IGNORE";  kill "INT",$$; sleep 1; print "ok 4\n";
55     $SIG{"INT"} = "DEFAULT"; kill "INT",$$; sleep 1; print "not ok\n";
56
57     sub ok3 {
58         if (($x = pop(@_)) eq "INT") {
59             print "ok 3\n";
60         }
61         else {
62             print "not ok 3 ($x @_)\n";
63         }
64     }
65
66 END
67 }
68
69 # can we slice ENV?
70 @val1 = @ENV{keys(%ENV)};
71 @val2 = values(%ENV);
72 ok 5, join(':',@val1) eq join(':',@val2);
73 ok 6, @val1 > 1;
74
75 # regex vars
76 'foobarbaz' =~ /b(a)r/;
77 ok 7, $` eq 'foo', $`;
78 ok 8, $& eq 'bar', $&;
79 ok 9, $' eq 'baz', $';
80 ok 10, $+ eq 'a', $+;
81
82 # $"
83 @a = qw(foo bar baz);
84 ok 11, "@a" eq "foo bar baz", "@a";
85 {
86     local $" = ',';
87     ok 12, "@a" eq "foo,bar,baz", "@a";
88 }
89
90 # $;
91 %h = ();
92 $h{'foo', 'bar'} = 1;
93 ok 13, (keys %h)[0] eq "foo\034bar", (keys %h)[0];
94 {
95     local $; = 'x';
96     %h = ();
97     $h{'foo', 'bar'} = 1;
98     ok 14, (keys %h)[0] eq 'fooxbar', (keys %h)[0];
99 }
100
101 # $?, $@, $$
102 system qq[$PERL -e "exit(0)"];
103 ok 15, $? == 0, $?;
104 system qq[$PERL -e "exit(1)"];
105 ok 16, $? != 0, $?;
106
107 eval { die "foo\n" };
108 ok 17, $@ eq "foo\n", $@;
109
110 ok 18, $$ > 0, $$;
111
112 # $^X and $0
113 {
114     if ($^O eq 'qnx') {
115         chomp($wd = `/usr/bin/fullpath -t`);
116     }
117     elsif($Is_Cygwin) {
118        # Cygwin turns the symlink into the real file
119        chomp($wd = `pwd`);
120        $wd =~ s#/t$##;
121     }
122     elsif($Is_os2) {
123        $wd = Cwd::sys_cwd();
124     }
125     else {
126         $wd = '.';
127     }
128     my $perl = "$wd/perl";
129     my $headmaybe = '';
130     my $tailmaybe = '';
131     $script = "$wd/show-shebang";
132     if ($Is_MSWin32) {
133         chomp($wd = `cd`);
134         $wd =~ s|\\|/|g;
135         $perl = "$wd/perl.exe";
136         $script = "$wd/show-shebang.bat";
137         $headmaybe = <<EOH ;
138 \@rem ='
139 \@echo off
140 $perl -x \%0
141 goto endofperl
142 \@rem ';
143 EOH
144         $tailmaybe = <<EOT ;
145
146 __END__
147 :endofperl
148 EOT
149     }
150     elsif ($Is_os2) {
151       $script = "./show-shebang";
152     }
153     if ($^O eq 'os390' or $^O eq 'posix-bc' or $^O eq 'vmesa') {  # no shebang
154         $headmaybe = <<EOH ;
155     eval 'exec ./perl -S \$0 \${1+"\$\@"}'
156         if 0;
157 EOH
158     }
159     $s1 = "\$^X is $perl, \$0 is $script\n";
160     ok 19, open(SCRIPT, ">$script"), $!;
161     ok 20, print(SCRIPT $headmaybe . <<EOB . <<'EOF' . $tailmaybe), $!;
162 #!$wd/perl
163 EOB
164 print "\$^X is $^X, \$0 is $0\n";
165 EOF
166     ok 21, close(SCRIPT), $!;
167     ok 22, chmod(0755, $script), $!;
168     $_ = `$script`;
169     s/\.exe//i if $Is_Dos or $Is_Cygwin or $Is_os2;
170     s{\bminiperl\b}{perl}; # so that test doesn't fail with miniperl
171     s{is perl}{is $perl}; # for systems where $^X is only a basename
172     s{\\}{/}g;
173     ok 23, (($Is_MSWin32 || $Is_os2) ? uc($_) eq uc($s1) : $_ eq $s1), " :$_:!=:$s1:";
174     $_ = `$perl $script`;
175     s/\.exe//i if $Is_Dos or $Is_os2;
176     s{\\}{/}g;
177     ok 24, (($Is_MSWin32 || $Is_os2) ? uc($_) eq uc($s1) : $_ eq $s1), " :$_:!=:$s1: after `$perl $script`";
178     ok 25, unlink($script), $!;
179 }
180
181 # $], $^O, $^T
182 ok 26, $] >= 5.00319, $];
183 ok 27, $^O;
184 ok 28, $^T > 850000000, $^T;
185
186 if ($Is_VMS || $Is_Dos) {
187         ok "29 # skipped", 1;
188         ok "30 # skipped", 1;
189 }
190 else {
191         $PATH = $ENV{PATH};
192         $PDL = $ENV{PERL_DESTRUCT_LEVEL} || 0;
193         $ENV{foo} = "bar";
194         %ENV = ();
195         $ENV{PATH} = $PATH;
196         $ENV{PERL_DESTRUCT_LEVEL} = $PDL || 0;
197         ok 29, ($Is_MSWin32 ? (`cmd /x /c set foo 2>NUL` eq "")
198                                 : (`echo \$foo` eq "\n") );
199
200         $ENV{__NoNeSuCh} = "foo";
201         $0 = "bar";
202         ok 30, ($Is_MSWin32 ? (`cmd /x /c set __NoNeSuCh` eq "__NoNeSuCh=foo\n")
203                             : (`echo \$__NoNeSuCh` eq "foo\n") );
204 }
205
206 {
207     local $SIG{'__WARN__'} = sub { print "# @_\nnot " };
208     $! = undef;
209     print "ok 31\n";
210 }
211
212 # test case-insignificance of %ENV (these tests must be enabled only
213 # when perl is compiled with -DENV_IS_CASELESS)
214 if ($Is_MSWin32) {
215     %ENV = ();
216     $ENV{'Foo'} = 'bar';
217     $ENV{'fOo'} = 'baz';
218     ok 32, (scalar(keys(%ENV)) == 1);
219     ok 33, exists($ENV{'FOo'});
220     ok 34, (delete($ENV{'foO'}) eq 'baz');
221     ok 35, (scalar(keys(%ENV)) == 0);
222 }
223 else {
224     ok "32 # skipped: no caseless %ENV support",1;
225     ok "33 # skipped: no caseless %ENV support",1;
226     ok "34 # skipped: no caseless %ENV support",1;
227     ok "35 # skipped: no caseless %ENV support",1;
228 }
229
230 # Make sure Errno hasn't been prematurely autoloaded
231
232 ok 36, !defined %Errno::;
233
234 # Test auto-loading of Errno when %! is used
235
236 ok 37, scalar eval q{
237    my $errs = %!;
238    defined %Errno::;
239 }, $@;
240
241
242 # Make sure that Errno loading doesn't clobber $!
243
244 undef %Errno::;
245 delete $INC{"Errno.pm"};
246
247 open(FOO, "nonesuch"); # Generate ENOENT
248 my %errs = %{"!"}; # Cause Errno.pm to be loaded at run-time
249 ok 38, ${"!"}{ENOENT};