1#!./perl
2
3BEGIN {
4    chdir 't' if -d 't';
5    @INC = '../lib';
6}
7
8require "./test.pl";
9
10plan(tests => 22);
11
12use File::Spec;
13
14my $devnull = File::Spec->devnull;
15
16open(TRY, '>Io_argv1.tmp') || (die "Can't open temp file: $!");
17print TRY "a line\n";
18close TRY or die "Could not close: $!";
19
20$x = runperl(
21    prog	=> 'while (<>) { print $., $_; }',
22    args	=> [ 'Io_argv1.tmp', 'Io_argv1.tmp' ],
23);
24is($x, "1a line\n2a line\n", '<> from two files');
25
26{
27    $x = runperl(
28	prog	=> 'while (<>) { print $_; }',
29	stdin	=> "foo\n",
30	args	=> [ 'Io_argv1.tmp', '-' ],
31    );
32    is($x, "a line\nfoo\n", '   from a file and STDIN');
33
34    $x = runperl(
35	prog	=> 'while (<>) { print $_; }',
36	stdin	=> "foo\n",
37    );
38    is($x, "foo\n", '   from just STDIN');
39}
40
41@ARGV = ('Io_argv1.tmp', 'Io_argv1.tmp', $devnull, 'Io_argv1.tmp');
42while (<>) {
43    $y .= $. . $_;
44    if (eof()) {
45	is($., 3, '$. counts <>');
46    }
47}
48
49is($y, "1a line\n2a line\n3a line\n", '<> from @ARGV');
50
51
52open(TRY, '>Io_argv1.tmp') or die "Can't open temp file: $!";
53close TRY or die "Could not close: $!";
54open(TRY, '>Io_argv2.tmp') or die "Can't open temp file: $!";
55close TRY or die "Could not close: $!";
56@ARGV = ('Io_argv1.tmp', 'Io_argv2.tmp');
57$^I = '_bak';   # not .bak which confuses VMS
58$/ = undef;
59my $i = 6;
60while (<>) {
61    s/^/ok $i\n/;
62    ++$i;
63    print;
64    next_test();
65}
66open(TRY, '<Io_argv1.tmp') or die "Can't open temp file: $!";
67print while <TRY>;
68open(TRY, '<Io_argv2.tmp') or die "Can't open temp file: $!";
69print while <TRY>;
70close TRY or die "Could not close: $!";
71undef $^I;
72
73ok( eof TRY );
74
75ok( eof NEVEROPENED,    'eof() true on unopened filehandle' );
76
77open STDIN, 'Io_argv1.tmp' or die $!;
78@ARGV = ();
79ok( !eof(),     'STDIN has something' );
80
81is( <>, "ok 6\n" );
82
83open STDIN, $devnull or die $!;
84@ARGV = ();
85ok( eof(),      'eof() true with empty @ARGV' );
86
87@ARGV = ('Io_argv1.tmp');
88ok( !eof() );
89
90@ARGV = ($devnull, $devnull);
91ok( !eof() );
92
93close ARGV or die $!;
94ok( eof(),      'eof() true after closing ARGV' );
95
96{
97    local $/;
98    open F, 'Io_argv1.tmp' or die "Could not open Io_argv1.tmp: $!";
99    <F>;	# set $. = 1
100    is( <F>, undef );
101
102    open F, $devnull or die;
103    ok( defined(<F>) );
104
105    is( <F>, undef );
106    is( <F>, undef );
107
108    open F, $devnull or die;	# restart cycle again
109    ok( defined(<F>) );
110    is( <F>, undef );
111    close F or die "Could not close: $!";
112}
113
114# This used to dump core
115fresh_perl_is( <<'**PROG**', "foobar", {}, "ARGV aliasing and eof()" ); 
116open OUT, ">Io_argv3.tmp" or die "Can't open temp file: $!";
117print OUT "foo";
118close OUT;
119open IN, "Io_argv3.tmp" or die "Can't open temp file: $!";
120*ARGV = *IN;
121while (<>) {
122    print;
123    print "bar" if eof();
124}
125close IN;
126unlink "Io_argv3.tmp";
127**PROG**
128
129END {
130    1 while unlink 'Io_argv1.tmp', 'Io_argv1.tmp_bak',
131	'Io_argv2.tmp', 'Io_argv2.tmp_bak', 'Io_argv3.tmp';
132}
133