This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
toke.c lex_stuff_pvn(): Use fcn, not handrolled code
[perl5.git] / t / op / stat_errors.t
1 #!./perl
2
3 BEGIN {
4     chdir 't' if -d 't';
5     require './test.pl';
6     set_up_inc('../lib');
7 }
8
9 plan(tests => 2*11*29);
10
11 use Errno qw(EBADF ENOENT);
12
13 open(SCALARFILE, "<", \"wibble") or die $!;
14 open(CLOSEDFILE, "<", "./test.pl") or die $!;
15 close(CLOSEDFILE) or die $!;
16 opendir(CLOSEDDIR, "../lib") or die $!;
17 closedir(CLOSEDDIR) or die $!;
18
19 foreach my $op (
20     qw(stat lstat),
21     (map { "-$_" } qw(r w x o R W X O e z s f d l p S b c t u g k T B M A C)),
22 ) {
23     foreach my $arg (
24         (map { ($_, "\\*$_") }
25             qw(NEVEROPENED SCALARFILE CLOSEDFILE CLOSEDDIR _)),
26         "\"tmpnotexist\"",
27     ) {
28         my $argdesc = $arg;
29         if ($arg eq "_") {
30             my @z = lstat "tmpnotexist";
31             $argdesc .= " with prior stat fail";
32         }
33         SKIP: {
34             if ($op eq "-l" && $arg =~ /\A\\/) {
35                 # The op weirdly stringifies the globref and uses it as
36                 # a filename, rather than treating it as a file handle.
37                 # That might be a bug, but while that behaviour exists it
38                 # needs to be exempted from these tests.
39                 skip "-l on globref", 2;
40             }
41             if ($op eq "-t" && $arg eq "\"tmpnotexist\"") {
42                 # The op doesn't operate on filenames.
43                 skip "-t on filename", 2;
44             }
45             $! = 0;
46             my $res = eval "$op $arg";
47             my $err = $!;
48             is $res, $op =~ /\A-/ ? undef : !!0, "result of $op $arg";
49             is 0+$err,
50                 $arg eq "\"tmpnotexist\"" ||
51                     ($op =~ /\A-[TB]\z/ && $arg =~ /_\z/) ? ENOENT : EBADF,
52                 "error from $op $arg";
53         }
54     }
55 }
56
57 1;