6 use VPIT::TestHelpers 'capture';
8 use Test::More tests => (4 + 4 * 2 + 2) * 4;
10 my $long_length = 32 * 4096;
14 $s =~ s/([^ a-zA-Z0-9_-])/sprintf '\x{%0*X}', (ord($1) <= 0xFF ? 2 : 4), ord $1/eg;
20 desc => 'STDOUT only',
21 cmd => [ $^X, '-e', 'print STDOUT qq[hello\n]' ],
29 desc => 'STDERR only',
30 cmd => [ $^X, '-e', 'print STDERR qq[hi\n]' ],
38 desc => 'STDOUT+STDERR',
39 cmd => [ $^X, '-e', 'print STDOUT qq[sup\n]; print STDERR qq[yo\n]' ],
48 cmd => [ $^X, '-e', "sleep 1; print STDOUT q[a] x $long_length; sleep 1; print STDERR q[b] x $long_length; sleep 1; print STDOUT q[c] x $long_length" ],
51 out => ('a' x $long_length) . ('c' x $long_length),
52 err => ('b' x $long_length),
57 for my $eol_spec (qw<0D 0A 0D0A 0A0D>) {
58 (my $eol = $eol_spec) =~ s/(..)/\\x{$1}/g;
63 $eol_exp = eval qq["$eol"];
67 desc => "End of line $eol",
68 cmd => [ $^X, '-e', "print STDOUT qq[out$eol]; print STDERR qq[err$eol]" ],
77 my $eol_bin_exp = ($^O eq 'MSWin32' && $eol_spec eq '0D0A')
78 ? chr 0x0A : $eol_exp;
80 desc => "End of line $eol (binary mode)",
81 cmd => [ $^X, '-e', "binmode *STDOUT; print STDOUT qq[out$eol]; binmode *STDERR; print STDERR qq[err$eol]" ],
84 out => "out$eol_bin_exp",
85 err => "err$eol_bin_exp",
92 desc => 'Non-existent',
93 cmd => [ 'nonexistentexecutable' ],
96 out => qr/open3.*exec.*failed/,
103 cmd => [ $^X, '-e', 'die q[carrot]' ],
107 err => qr/carrot at -e/,
111 for my $test (@tests) {
112 my $desc = $test->{desc};
113 my $expected = $test->{expect};
116 my ($status, $out, $err) = eval { capture @{ $test->{cmd} } };
118 is $@, '', "$desc: did not croak";
119 is $status, $expected->{status}, "$desc: status";
121 my ($exp_out, $exp_err) = @$expected{qw<out err>};
122 if ($test->{hexcmp}) {
123 $_ = hexdump($_) for $out, $err;
124 $exp_out = hexdump($exp_out) unless ref $exp_out;
125 $exp_err = hexdump($exp_err) unless ref $exp_err;
128 like $out, $exp_out, "$desc: out";
130 is $out, $exp_out, "$desc: out";
133 like $err, $exp_err, "$desc: err";
135 is $err, $exp_err, "$desc: err";