Group
Extension

kurila/t/io/dup.t

#!./perl

BEGIN {
    require "./test.pl";
}

use Config;
no warnings 'once';

my $test = 1;
print $^STDOUT, "1..29\n";
print $^STDOUT, "ok 1\n";

open(my $dupout, ">&", $^STDOUT);
open(my $duperr, ">&", $^STDERR);

open($^STDOUT, ">","Io.dup")  || die "Can't open stdout";
open($^STDERR, ">&", $^STDOUT) || die "Can't open stderr";

iohandle::output_autoflush($^STDERR, 1);
iohandle::output_autoflush($^STDOUT, 1);

print $^STDOUT, "ok 2\n";
print $^STDERR, "ok 3\n";

# Since some systems don't have echo, we use Perl.
my $echo = qq{$^EXECUTABLE_NAME -le "print \\\$^STDOUT, q(ok \%d)"};

my $cmd = sprintf $echo, 4;
print $^STDOUT, `$cmd`;

$cmd = sprintf "$echo 1>&2", 5;
$cmd = sprintf $echo, 5 if $^OS_NAME eq 'MacOS';  # don't know if we can do this ...
print $^STDOUT, `$cmd`;

# KNOWN BUG system() does not honor STDOUT redirections on VMS.
if( $^OS_NAME eq 'VMS' ) {
    print $^STDOUT, "not ok $_ # TODO system() not honoring STDOUT redirect on VMS\n"
      for 6..7;
}
else {
    system sprintf $echo, 6;
    if ($^OS_NAME eq 'MacOS') {
        system sprintf $echo, 7;
    }
    else {
        system sprintf "$echo 1>&2", 7;
    }
}

close($^STDOUT) or die "Could not close: $^OS_ERROR";
close($^STDERR) or die "Could not close: $^OS_ERROR";

open($^STDOUT, ">&", $dupout) or die "Could not open: $^OS_ERROR";
open($^STDERR, ">&", $duperr) or die "Could not open: $^OS_ERROR";

if (($^OS_NAME eq 'MSWin32') || ($^OS_NAME eq 'NetWare') || ($^OS_NAME eq 'VMS')) { print $^STDOUT, `type Io.dup` }
elsif ($^OS_NAME eq 'MacOS') { system 'catenate Io.dup' }
else                   { system 'cat Io.dup' }
unlink 'Io.dup';

print $^STDOUT, "ok 8\n";

open(my $f,">&",1) or die "Cannot dup to numeric 1: $^OS_ERROR";
print $f, "ok 9\n";
close($f);

open($f,">&",'1') or die "Cannot dup to string '1': $^OS_ERROR";
print $f, "ok 10\n";
close($f);

open($f,">&=",1) or die "Cannot dup to numeric 1: $^OS_ERROR";
print $f, "ok 11\n";
close($f);

if (config_value("useperlio")) {
    open($f,">&=",'1') or die "Cannot dup to string '1': $^OS_ERROR";
    print $f, "ok 12\n";
    close($f);
} else {
    open($f, ">&", $dupout) or die "Cannot dup stdout back: $^OS_ERROR";
    print $f, "ok 12\n";
    close($f);
}

# To get STDOUT back.
open($f, ">&", $dupout) or die "Cannot dup stdout back: $^OS_ERROR";

curr_test(13);

SKIP: do {
    skip("need perlio", 14) unless config_value("useperlio");
    
    ok(open($f, ">&", $^STDOUT));
    isnt(fileno($f), fileno($^STDOUT));
    close $f;

    ok(open($f, "<&=", $^STDIN)) or _diag $^OS_ERROR;
    is(fileno($f), fileno($^STDIN));
    close $f;

    ok(open($f, ">&=", $^STDOUT));
    is(fileno($f), fileno($^STDOUT));
    close $f;

    ok(open($f, ">&=", $^STDERR));
    is(fileno($f), fileno($^STDERR));
    close $f;

    open(my $gfh, ">", "dup$^PID") or die;
    my $g = fileno($gfh);

    ok(open($f, ">&=", "$g"));
    is(fileno($f), $g);
    close $f;

    ok(open($f, ">&=", $gfh));
    is(fileno($f), $g);

    print $gfh, "ggg\n";
    print $f, "fff\n";

    close $gfh; # flush first
    close $f; # flush second

    open($gfh, "<", "dup$^PID") or die;
    do {
	my $line;
	$line = ~< *$gfh; chomp $line; is($line, "ggg");
	$line = ~< *$gfh; chomp $line; is($line, "fff");
    };
    close $gfh;

    open my $utfout, '>:utf8', "dup$^PID" or die $^OS_ERROR;
    open my $utfdup, ">&", \*$utfout or die $^OS_ERROR;
    # some old greek saying.
    my $message = "\x{03A0}\x{0391}\x{039D}\x{03A4}\x{0391} \x{03A1}\x{0395}\x{0399}\n";
    print $utfout, $message;
    print $utfdup, $message;
    binmode $utfdup, ':utf8';
    print $utfdup, $message;
    close $utfout;
    close $utfdup;
    open(my $utfin, "<:utf8", "dup$^PID") or die $^OS_ERROR;
    do {
	my $line;
	$line = ~< *$utfin; is($line, $message);
	$line = ~< *$utfin; is($line, $message);
	$line = ~< *$utfin; is($line, $message);
    };
    close $utfin;

    END { 1 while unlink "dup$^PID" }
};


Powered by Groonga
Maintained by Kenichi Ishigaki <ishigaki@cpan.org>. If you find anything, submit it on GitHub.