package Preempt::Stdin; use strict; use Carp; sub TIEHANDLE { my $class = shift; my @lines = @_; bless \@lines, $class; } sub READLINE { my $self = shift; if (@$self) { shift @$self; } else { croak "List of prompt responses has been exhausted: $!"; } } 1; #### package main; use strict; use warnings; use Test::More tests => 3; my (@lines, $room); # 1st pass: valid data reached at $lines[4] @lines = ( 'a string with numbers and letters 4678', '5678', '46789', ' 4678', '4678', ); tie *STDIN, 'Preempt::Stdin', @lines; ok($room = enter_number(), 'enter_number executed'); is(4678, $room, 'predicted value achieved'); untie *STDIN; # 2nd pass: never reached valid data @lines = ( 'a string with numbers and letters 4678', '5678', '46789', ); { tie *STDIN, 'Preempt::Stdin', @lines; my $room; eval { $room = enter_number(); }; like($@, qr/^List of prompt responses has been exhausted/, "Prompt responses exhausted") || print STDERR "$@\n"; untie *STDIN; } sub enter_number { # no change from yesterday local $_; while () { print "Enter new room number: "; chomp ($_ = ); if ($_ =~ /^4\d\d\d$/) { return $_; } else { print "\nMust be a 4-digit number beginning with '4'; try again.\n"; next; } } } #### local $SIG{__WARN__} = \&_capture; tie *STDIN, 'Preempt::Stdin', @lines; ... # as before