xref: /openbsd-src/gnu/usr.bin/perl/t/io/argv.t (revision d13be5d47e4149db2549a9828e244d59dbc43f15)
1#!./perl
2
3BEGIN {
4    chdir 't' if -d 't';
5    @INC = '../lib';
6}
7
8BEGIN { require "./test.pl"; }
9
10plan(tests => 23);
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{
42    # 5.10 stopped autovivifying scalars in globs leading to a
43    # segfault when $ARGV is written to.
44    runperl( prog => 'eof()', stdin => "nothing\n" );
45    is( 0+$?, 0, q(eof() doesn't segfault) );
46}
47
48@ARGV = ('Io_argv1.tmp', 'Io_argv1.tmp', $devnull, 'Io_argv1.tmp');
49while (<>) {
50    $y .= $. . $_;
51    if (eof()) {
52	is($., 3, '$. counts <>');
53    }
54}
55
56is($y, "1a line\n2a line\n3a line\n", '<> from @ARGV');
57
58
59open(TRY, '>Io_argv1.tmp') or die "Can't open temp file: $!";
60close TRY or die "Could not close: $!";
61open(TRY, '>Io_argv2.tmp') or die "Can't open temp file: $!";
62close TRY or die "Could not close: $!";
63@ARGV = ('Io_argv1.tmp', 'Io_argv2.tmp');
64$^I = '_bak';   # not .bak which confuses VMS
65$/ = undef;
66my $i = 7;
67while (<>) {
68    s/^/ok $i\n/;
69    ++$i;
70    print;
71    next_test();
72}
73open(TRY, '<Io_argv1.tmp') or die "Can't open temp file: $!";
74print while <TRY>;
75open(TRY, '<Io_argv2.tmp') or die "Can't open temp file: $!";
76print while <TRY>;
77close TRY or die "Could not close: $!";
78undef $^I;
79
80ok( eof TRY );
81
82{
83    no warnings 'once';
84    ok( eof NEVEROPENED,    'eof() true on unopened filehandle' );
85}
86
87open STDIN, 'Io_argv1.tmp' or die $!;
88@ARGV = ();
89ok( !eof(),     'STDIN has something' );
90
91is( <>, "ok 7\n" );
92
93open STDIN, $devnull or die $!;
94@ARGV = ();
95ok( eof(),      'eof() true with empty @ARGV' );
96
97@ARGV = ('Io_argv1.tmp');
98ok( !eof() );
99
100@ARGV = ($devnull, $devnull);
101ok( !eof() );
102
103close ARGV or die $!;
104ok( eof(),      'eof() true after closing ARGV' );
105
106{
107    local $/;
108    open F, 'Io_argv1.tmp' or die "Could not open Io_argv1.tmp: $!";
109    <F>;	# set $. = 1
110    is( <F>, undef );
111
112    open F, $devnull or die;
113    ok( defined(<F>) );
114
115    is( <F>, undef );
116    is( <F>, undef );
117
118    open F, $devnull or die;	# restart cycle again
119    ok( defined(<F>) );
120    is( <F>, undef );
121    close F or die "Could not close: $!";
122}
123
124# This used to dump core
125fresh_perl_is( <<'**PROG**', "foobar", {}, "ARGV aliasing and eof()" );
126open OUT, ">Io_argv3.tmp" or die "Can't open temp file: $!";
127print OUT "foo";
128close OUT;
129open IN, "Io_argv3.tmp" or die "Can't open temp file: $!";
130*ARGV = *IN;
131while (<>) {
132    print;
133    print "bar" if eof();
134}
135close IN;
136unlink "Io_argv3.tmp";
137**PROG**
138
139END {
140    1 while unlink 'Io_argv1.tmp', 'Io_argv1.tmp_bak',
141	'Io_argv2.tmp', 'Io_argv2.tmp_bak', 'Io_argv3.tmp';
142}
143