The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! perl

$| = 1;

# not tested: symlink, readlink, link, utime, chown, chmod

BEGIN {
   print "1..37\n";
   print "ok 1 # MODEL=$AnyEvent::IO::MODEL\n";
}
use AnyEvent;
use AnyEvent::IO qw(:DEFAULT :flags);
BEGIN {
   print "ok 2 # MODEL=$AnyEvent::IO::MODEL\n";
}

our $t = 3;

sub t {
   my $ok = shift;
   my $f = "aio_" . shift;
   $f->(@_, my $cv = AE::cv);
   my @res = $cv->recv;

   print !@res != !$ok ? "not " : "", "ok ", $t++, " # $f (@_) = (@res)\n";

   wantarray ? @res : $res[0]
}

use File::Spec;

our $TMP = File::Spec->tmpdir;
our $DIR = "$TMP/ae_io_testdir_$$~";

t 1, mkdir => $DIR, 0777
   or do { print "Bail out! Cannot mkdir $DIR, skipping test.\n"; exit 0 };
t 0, mkdir => $DIR, 0777;

#############################################################################
# create file

my $fh = t 1, open => "$DIR/test", O_CREAT | O_EXCL | O_WRONLY, 0666;
         t 0, open => "$DIR/test", O_CREAT | O_EXCL | O_WRONLY, 0666;

t 0, rmdir => $DIR;

t 1, write => $fh, "tes--";
t 1, write => $fh, "test2";
t 1, write => $fh, "";

t 1, seek  => $fh, 3, 0;
t 1, write => $fh, "t1";

#t 1, truncate => $fh, 5+5; # not available on windows

t 1, stat => $fh;
print -s _ != 10 ? "not " : "", "ok ", $t++, " # stat size\n";

t 1, close => $fh;

t 1, stat => "$DIR/test";
print -s _ != 10 ? "not " : "", "ok ", $t++, " # stat size (", -s _,")\n";

t 1, lstat => "$DIR/test";
print -s _ != 10 ? "not " : "", "ok ", $t++, " # lstat size\n";

t 1, rename => "$DIR/test", "$DIR/test2";

#############################################################################
# test dir

t 0, readdir => "$DIR/nonexistent";
my $res = t 1, readdir => $DIR;
print @$res != 1           ? "not " : "", "ok ", $t++, " # res count\n";
print $res->[0] ne "test2" ? "not " : "", "ok ", $t++, " # res data (@$res)\n";

#############################################################################
# test file

$fh = t 1, open => "$DIR/test2", O_RDONLY, 0;

print +(t 1, read => $fh, 6) ne "test1t" ? "not " : "", "ok ", $t++, " # read 6\n";
print +(t 1, read => $fh, 7) ne "est2"   ? "not " : "", "ok ", $t++, " # read 7\n";
print +(t 1, read => $fh, 8) ne ""       ? "not " : "", "ok ", $t++, " # read 8\n";

t 1, close => $fh;

print +(t 1, load => "$DIR/test2") ne "test1test2" ? "not " : "", "ok ", $t++, " # load\n";

#############################################################################
# cleanup

t 0, unlink => "$DIR/test";
t 1, unlink => "$DIR/test2";

t 1, rmdir => $DIR;

1