The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
use warnings;
use Test::More tests => 20;

use IO::Handle::unread;

use File::Spec;

use open IO => ':perlio';

ok open(my $null, '<', File::Spec->devnull), 'open';

is $null->unread("foo\n"), length("foo\n"), 'unread count';

ok !eof($null), 'eof after unread';
is scalar(<$null>), "foo\n", 'unread with a newline';
ok  eof($null), 'eof after read';

$null->unread('a');

ok !eof($null), 'eof after unread';
is scalar(<$null>), 'a', 'unread without newlines';
ok  eof($null), 'eof after read';

$null->unread("foo\nbar\nbaz");

is_deeply [<$null>], ["foo\n", "bar\n", "baz"], 'unread with newlines';
ok eof($null), 'eof';

$null->unread('X' x 5000);

is_deeply [<$null>], ['X' x 5000], 'unread large string';

$null->unread('foo');
$null->unread('bar');

is_deeply [<$null>], ['barfoo'], 'multi-call unread';
is_deeply [<$null>], [], 'null';


$null->unread('foo', 1);
is_deeply [<$null>], ['f'], 'length specified';

$null->unread('foo', 10000);
is_deeply [<$null>], ['foo'], 'length specified (too long)';

eval{
	$null->unread('foo', -1);
};
like $@, qr/Negative length/, 'negatie length';

ok close($null), 'close';

eval{
	use warnings FATAL => 'io';
	$null->unread('foo');
};
like $@, qr/closed/, 'closed filehandle';

eval{
	use warnings FATAL => 'io';
	select select my $unopened;
	$unopened->unread('foo');
};
like $@, qr/unopened/, 'unopened filehandle';


eval{
	use warnings FATAL => 'io';
	STDOUT->unread('foo');
};
like $@, qr/only for output/, 'only for output';