The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!./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;