The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

#!./perl
BEGIN {
chdir 't' if -d 't';
require './test.pl';
set_up_inc('../lib');
skip_all_if_miniperl("miniperl can't load PerlIO::scalar");
}
plan(tests => 2*11*29);
use Errno qw(EBADF ENOENT);
open(SCALARFILE, "<", \"wibble") or die $!; # needs PerlIO::scalar
open(CLOSEDFILE, "<", "./test.pl") or die $!;
close(CLOSEDFILE) or die $!;
opendir(CLOSEDDIR, "../lib") or die $!;
closedir(CLOSEDDIR) or die $!;
foreach my $op (
qw(stat lstat),
(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)),
) {
foreach my $arg (
(map { ($_, "\\*$_") }
qw(NEVEROPENED SCALARFILE CLOSEDFILE CLOSEDDIR _)),
"\"tmpnotexist\"",
) {
my $argdesc = $arg;
if ($arg eq "_") {
my @z = lstat "tmpnotexist";
$argdesc .= " with prior stat fail";
}
SKIP: {
if ($op eq "-l" && $arg =~ /\A\\/) {
# The op weirdly stringifies the globref and uses it as
# a filename, rather than treating it as a file handle.
# That might be a bug, but while that behaviour exists it
# needs to be exempted from these tests.
skip "-l on globref", 2;
}
if ($op eq "-t" && $arg eq "\"tmpnotexist\"") {
# The op doesn't operate on filenames.
skip "-t on filename", 2;
}
$! = 0;
my $res = eval "$op $arg";
my $err = $!;
is $res, $op =~ /\A-/ ? undef : !!0, "result of $op $arg";
is 0+$err,
$arg eq "\"tmpnotexist\"" ||
($op =~ /\A-[TB]\z/ && $arg =~ /_\z/) ? ENOENT : EBADF,
"error from $op $arg";
}
}
}
1;