#!perl
use warnings;
use strict;

use Test::More tests => 43;

BEGIN{ use_ok('Ruby') }

use IO::Handle;
use SelectSaver;

{
	my $s = '';
	open my($sfh), ">:scalar", \$s;
	my $ss = SelectSaver->new($sfh);

	$sfh->autoflush;

	puts 'foo';

	is $s, "foo\n", "puts() to the default filehandle";

	puts 'bar';

	is $s, "foo\nbar\n";

	close $sfh;
	$s = '';
	open $sfh, ">:scalar", \$s;

	p "foo";

	is $s, qq{"foo"\n}, "p() to the default filehandle";
}

no warnings 'io';

rb_eval <<'EOT', __PACKAGE__, __FILE__, 0;


ok defined?(Perl::STDIN),  "defined? STDIN";
ok defined?(Perl::STDOUT), "defined? STDOUT";
ok defined?(Perl::STDERR), "defined? STDERR";

is STDIN.fileno,  Perl::STDIN.fileno,  "stdin  fileno";
is STDOUT.fileno, Perl::STDOUT.fileno, "stdout fileno";
is STDERR.fileno, Perl::STDERR.fileno, "stderr fileno";

io = Perl.open('foo', 'w+', 0666);


ok(io, "Perl.open");
ok(!io.closed?, "closed?");

ok(io.path, 'foo', "Perl::IO path");

io.binmode(:raw);

begin
	io.binmode('UnknownLayer');
rescue
	is $!.class, ArgumentError, "binmode UnknownLayer";
end

is io.pos,  0, "pos";
is io.tell, 0, "tell";

io.putc(?f);
io.putc(?o);
io.putc(?o);
io.putc("\n");

io.puts("bar");

is io.pos, 8, "pos";

io.rewind;

is(io.gets, "foo\n", "putc/puts/rewind/gets");
is(io.gets, "bar\n");

io.seek(0, IO::SEEK_SET);

is(io.pos, 0, "seek/pos");


io.each { |line|
	ok line, "each";
}

io.pos = 0;

is(io.pos, 0, "pos=");

io.rewind;

is(io.read(), "foo\nbar\n", "read all");

io.rewind;

is(io.readline, "foo\n", "readline");
is(io.read(),   "bar\n", "read remain");

ok io.eof?, "eof?";

ok(!io.closed?, "closed?");

rubyio = io.to_io;
is rubyio.class, IO, "to_io";
rubyio.close;

io.close;

ok(io.closed?, "close/closed?");

Perl.open("foo", "<:crlf") do |io|
	a = io.readlines;

	is a.length, 2, "open BLOCK/readlines";
	is a[0], "foo\n", "readlines[0]";
	is a[1], "bar\n", "readlines[1]";

	ok a[0].tainted?, "tainted?";

	io.rewind;

	is io.read(2), "fo", "read(size)";
	is io.getc, ?o, "getc";

	io.ungetc(?o);

	is io.getc, ?o, "ungetc";

	begin
		while(line = io.readline)
			;
		end
	rescue
		is $!.class, EOFError, "End of file reached";
	end
end

ok io.closed?, "open BLOCK; autoclose";


io = Perl.open("foo", "r+");
io.truncate(0);

io.seek(0, IO::SEEK_END);
is io.pos, 0, "truncate";

ok io.read.nil?, "read empty file";

io.close;


begin
	Perl.open("foobar", "<");
rescue
	is $!.class, Errno::ENOENT, "no such file or directory";
end

GC.start;

File.unlink("foo");

EOT

END{
	pass "test end";
}