Commit | Line | Data |
378cc40b |
1 | #!./perl |
2 | |
ba553610 |
3 | BEGIN { |
4 | chdir 't' if -d 't'; |
ff8b5bfb |
5 | @INC = qw(. ../lib); |
6 | require "./test.pl"; |
ba553610 |
7 | } |
378cc40b |
8 | |
1bb0a50f |
9 | use Config; |
1031ca5c |
10 | no warnings 'once'; |
1bb0a50f |
11 | |
ba553610 |
12 | my $test = 1; |
1d341aad |
13 | my $tests_needing_perlio = 17; |
14 | plan(12 + $tests_needing_perlio); |
378cc40b |
15 | print "ok 1\n"; |
16 | |
ba553610 |
17 | open(DUPOUT,">&STDOUT"); |
18 | open(DUPERR,">&STDERR"); |
378cc40b |
19 | |
62a28c97 |
20 | my $tempfile = tempfile(); |
21 | |
22 | open(STDOUT,">$tempfile") || die "Can't open stdout"; |
a687059c |
23 | open(STDERR,">&STDOUT") || die "Can't open stderr"; |
378cc40b |
24 | |
a687059c |
25 | select(STDERR); $| = 1; |
26 | select(STDOUT); $| = 1; |
378cc40b |
27 | |
a687059c |
28 | print STDOUT "ok 2\n"; |
29 | print STDERR "ok 3\n"; |
ba553610 |
30 | |
31 | # Since some systems don't have echo, we use Perl. |
dc459aad |
32 | $echo = qq{$^X -le "print q(ok %d)"}; |
ba553610 |
33 | |
dc459aad |
34 | $cmd = sprintf $echo, 4; |
ba553610 |
35 | print `$cmd`; |
36 | |
dc459aad |
37 | $cmd = sprintf "$echo 1>&2", 5; |
38 | $cmd = sprintf $echo, 5 if $^O eq 'MacOS'; # don't know if we can do this ... |
ba553610 |
39 | print `$cmd`; |
40 | |
41 | # KNOWN BUG system() does not honor STDOUT redirections on VMS. |
42 | if( $^O eq 'VMS' ) { |
31775886 |
43 | print "not ok $_ # TODO system() not honoring STDOUT redirect on VMS\n" |
ba553610 |
44 | for 6..7; |
45 | } |
46 | else { |
47 | system sprintf $echo, 6; |
dc459aad |
48 | if ($^O eq 'MacOS') { |
49 | system sprintf $echo, 7; |
50 | } |
51 | else { |
52 | system sprintf "$echo 1>&2", 7; |
53 | } |
ba553610 |
54 | } |
378cc40b |
55 | |
d1e4d418 |
56 | close(STDOUT) or die "Could not close: $!"; |
57 | close(STDERR) or die "Could not close: $!"; |
378cc40b |
58 | |
d1e4d418 |
59 | open(STDOUT,">&DUPOUT") or die "Could not open: $!"; |
60 | open(STDERR,">&DUPERR") or die "Could not open: $!"; |
378cc40b |
61 | |
62a28c97 |
62 | if (($^O eq 'MSWin32') || ($^O eq 'NetWare') || ($^O eq 'VMS')) { print `type $tempfile` } |
63 | elsif ($^O eq 'MacOS') { system "catenate $tempfile" } |
64 | else { system "cat $tempfile" } |
378cc40b |
65 | |
e4a4387c |
66 | print STDOUT "ok 8\n"; |
9394203c |
67 | |
1bb0a50f |
68 | open(F,">&",1) or die "Cannot dup to numeric 1: $!"; |
31775886 |
69 | print F "ok 9\n"; |
70 | close(F); |
71 | |
1bb0a50f |
72 | open(F,">&",'1') or die "Cannot dup to string '1': $!"; |
31775886 |
73 | print F "ok 10\n"; |
74 | close(F); |
75 | |
1bb0a50f |
76 | open(F,">&=",1) or die "Cannot dup to numeric 1: $!"; |
31775886 |
77 | print F "ok 11\n"; |
78 | close(F); |
79 | |
1bb0a50f |
80 | if ($Config{useperlio}) { |
81 | open(F,">&=",'1') or die "Cannot dup to string '1': $!"; |
82 | print F "ok 12\n"; |
83 | close(F); |
84 | } else { |
85 | open(F, ">&DUPOUT") or die "Cannot dup stdout back: $!"; |
86 | print F "ok 12\n"; |
87 | close(F); |
88 | } |
31775886 |
89 | |
939b405b |
90 | # To get STDOUT back. |
91 | open(F, ">&DUPOUT") or die "Cannot dup stdout back: $!"; |
92 | |
ff8b5bfb |
93 | curr_test(13); |
94 | |
95 | SKIP: { |
1d341aad |
96 | skip("need perlio", $tests_needing_perlio) unless $Config{useperlio}; |
ff8b5bfb |
97 | |
98 | ok(open(F, ">&", STDOUT)); |
99 | isnt(fileno(F), fileno(STDOUT)); |
100 | close F; |
101 | |
0685228b |
102 | ok(open(F, "<&=STDIN")) or _diag $!; |
ff8b5bfb |
103 | is(fileno(F), fileno(STDIN)); |
104 | close F; |
105 | |
106 | ok(open(F, ">&=STDOUT")); |
107 | is(fileno(F), fileno(STDOUT)); |
108 | close F; |
109 | |
110 | ok(open(F, ">&=STDERR")); |
111 | is(fileno(F), fileno(STDERR)); |
112 | close F; |
113 | |
62a28c97 |
114 | open(G, ">$tempfile") or die; |
ff8b5bfb |
115 | my $g = fileno(G); |
116 | |
117 | ok(open(F, ">&=$g")); |
118 | is(fileno(F), $g); |
119 | close F; |
120 | |
121 | ok(open(F, ">&=G")); |
122 | is(fileno(F), $g); |
123 | |
124 | print G "ggg\n"; |
125 | print F "fff\n"; |
126 | |
127 | close G; # flush first |
128 | close F; # flush second |
129 | |
62a28c97 |
130 | open(G, "<$tempfile") or die; |
ad1c9500 |
131 | { |
132 | my $line; |
133 | $line = <G>; chomp $line; is($line, "ggg"); |
134 | $line = <G>; chomp $line; is($line, "fff"); |
135 | } |
ff8b5bfb |
136 | close G; |
137 | |
62a28c97 |
138 | open UTFOUT, '>:utf8', $tempfile or die $!; |
f0720f70 |
139 | open UTFDUP, '>&UTFOUT' or die $!; |
40986f42 |
140 | # some old greek saying. |
141 | my $message = "\x{03A0}\x{0391}\x{039D}\x{03A4}\x{0391} \x{03A1}\x{0395}\x{0399}\n"; |
f0720f70 |
142 | print UTFOUT $message; |
143 | print UTFDUP $message; |
144 | binmode UTFDUP, ':utf8'; |
145 | print UTFDUP $message; |
146 | close UTFOUT; |
147 | close UTFDUP; |
62a28c97 |
148 | open(UTFIN, "<:utf8", $tempfile) or die $!; |
f0720f70 |
149 | { |
150 | my $line; |
151 | $line = <UTFIN>; is($line, $message); |
152 | $line = <UTFIN>; is($line, $message); |
153 | $line = <UTFIN>; is($line, $message); |
154 | } |
155 | close UTFIN; |
f0720f70 |
156 | |
ff8b5bfb |
157 | } |