The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#! perl

use strict;
use warnings;
use Test::More tests => 21;

-d 't' && chdir 't';

my $id = "01-ref";

open(my $f, '>', "$id.tmp")
  or die("$id.tmp: $!\n");
print { $f } "Hello, World!\n";
close($f);

@ARGV = ( "$id.tmp" );
# @ARGV = ( "$id.tmp", "/dev/null" );

# $ARGV will not be set until an IO op (either <> or eof(), not eof) is done.
ok(!defined $ARGV, "\$ARGV not set yet");
ok(@ARGV != 0, "\@ARGV pristine");

# Initially, eof is false, $ARGV and @ARGV untouched.
SKIP: {
    skip( "Unreliable test", 1 );
    ok(eof, "eof at start");
}
ok(!defined $ARGV, "\$ARGV not set yet");
ok(@ARGV != 0, "\@ARGV pristine");

# Testing eof() will set things going.
ok(!eof(), "has next at start");
is($ARGV, "$id.tmp", "\$ARGV");
ok(@ARGV == 0, "\@ARGV exhausted");

my $line = <>;
is($line, "Hello, World!\n", "line1");
is($ARGV, "$id.tmp", "\$ARGV");

ok(eof, "eof");
ok(eof(), "no next");

$line = <>;
ok(!defined $line, "nothing left");

undef $f;
open($f, '>', "$id.tmp")
  or die("$id.tmp: $!\n");
print { $f } "Hello, World1!\n";
print { $f } "Hello, World2!\n";
print { $f } "Hello, World3!\n";
close($f);

@ARGV = ( "$id.tmp" );

$line = <>;
is($line, "Hello, World1!\n", "line1");
is($ARGV, "$id.tmp", "\$ARGV");
ok(@ARGV == 0, "\@ARGV exhausted");

ok(!eof, "!eof");
ok(!eof(), "has next");

my @lines = <>;
is($lines[0], "Hello, World2!\n", "line2");
is($lines[1], "Hello, World3!\n", "line3");

# NOTE <> is reset, since all lines were read and the EOF was sensed
# once,

ok(eof, "eof");

# Anything more will restart, and use STDIN as input...

unlink( "$id.tmp" );