1*de8cc8edSafresh1#!./perl -w 2*de8cc8edSafresh1use strict; 3*de8cc8edSafresh1 4*de8cc8edSafresh1use Test::More tests => 37; 5*de8cc8edSafresh1 6*de8cc8edSafresh1my $File = 'README'; 7*de8cc8edSafresh1 8*de8cc8edSafresh1use IO::File; 9*de8cc8edSafresh1 10*de8cc8edSafresh1my $io = IO::File->new($File); 11*de8cc8edSafresh1isa_ok($io, 'IO::File', "Opening $File"); 12*de8cc8edSafresh1 13*de8cc8edSafresh1my $line = $io->getline(); 14*de8cc8edSafresh1like($line, qr/^This is the/, "Read first line"); 15*de8cc8edSafresh1 16*de8cc8edSafresh1my ($list, $context) = $io->getline(); 17*de8cc8edSafresh1is($list, "\n", "Read second line"); 18*de8cc8edSafresh1is($context, undef, "Did not read third line with getline() in list context"); 19*de8cc8edSafresh1 20*de8cc8edSafresh1$line = $io->getline(); 21*de8cc8edSafresh1like($line, qr/^This distribution/, "Read third line"); 22*de8cc8edSafresh1 23*de8cc8edSafresh1my @lines = $io->getlines(); 24*de8cc8edSafresh1cmp_ok(@lines, '>', 3, "getlines reads lots of lines"); 25*de8cc8edSafresh1like($lines[-2], qr/^Share and Enjoy!/, "Share and Enjoy!"); 26*de8cc8edSafresh1 27*de8cc8edSafresh1$line = $io->getline(); 28*de8cc8edSafresh1is($line, undef, "geline reads no more at EOF"); 29*de8cc8edSafresh1 30*de8cc8edSafresh1@lines = $io->getlines(); 31*de8cc8edSafresh1is(@lines, 0, "gelines reads no more at EOF"); 32*de8cc8edSafresh1 33*de8cc8edSafresh1# And again 34*de8cc8edSafresh1$io = IO::File->new($File); 35*de8cc8edSafresh1isa_ok($io, 'IO::File', "Opening $File"); 36*de8cc8edSafresh1 37*de8cc8edSafresh1$line = $io->getline(); 38*de8cc8edSafresh1like($line, qr/^This is the/, "Read first line again"); 39*de8cc8edSafresh1 40*de8cc8edSafresh1is(eval { 41*de8cc8edSafresh1 $line = $io->getline("Boom"); 42*de8cc8edSafresh1 1; 43*de8cc8edSafresh1 }, undef, "eval caught an exception"); 44*de8cc8edSafresh1like($@, qr/^usage.*getline\(\) at .*\bio_getline\.t line /, 'getline usage'); 45*de8cc8edSafresh1like($line, qr/^This is the/, '$line unchanged'); 46*de8cc8edSafresh1 47*de8cc8edSafresh1is(eval { 48*de8cc8edSafresh1 ($list, $context) = $io->getlines("Boom"); 49*de8cc8edSafresh1 1; 50*de8cc8edSafresh1 }, undef, "eval caught an exception"); 51*de8cc8edSafresh1like($@, qr/^usage.*getlines\(\) at .*\bio_getline\.t line /, 'getlines usage'); 52*de8cc8edSafresh1is($list, "\n", '$list unchanged'); 53*de8cc8edSafresh1 54*de8cc8edSafresh1is(eval { 55*de8cc8edSafresh1 $line = $io->getlines(); 56*de8cc8edSafresh1 1; 57*de8cc8edSafresh1 }, undef, "eval caught an exception"); 58*de8cc8edSafresh1like($@, qr/^Can't call .*getlines in a scalar context.* at .*\bio_getline\.t line /, 59*de8cc8edSafresh1 'getlines in scalar context croaks'); 60*de8cc8edSafresh1like($line, qr/^This is the/, '$line unchanged'); 61*de8cc8edSafresh1 62*de8cc8edSafresh1is(eval { 63*de8cc8edSafresh1 $io->getlines(); 64*de8cc8edSafresh1 1; 65*de8cc8edSafresh1 }, undef, "eval caught an exception"); 66*de8cc8edSafresh1like($@, qr/^Can't call .*getlines in a scalar context.* at .*\bio_getline\.t line /, 67*de8cc8edSafresh1 'getlines in void context croaks'); 68*de8cc8edSafresh1like($line, qr/^This is the/, '$line unchanged'); 69*de8cc8edSafresh1 70*de8cc8edSafresh1($list, $context) = $io->getlines(); 71*de8cc8edSafresh1is($list, "\n", "Read second line"); 72*de8cc8edSafresh1like($context, qr/^This distribution/, "Read third line"); 73*de8cc8edSafresh1 74*de8cc8edSafresh1{ 75*de8cc8edSafresh1 package TiedHandle; 76*de8cc8edSafresh1 77*de8cc8edSafresh1 sub TIEHANDLE { 78*de8cc8edSafresh1 return bless ["Tick", "tick", "tick"]; 79*de8cc8edSafresh1 } 80*de8cc8edSafresh1 81*de8cc8edSafresh1 sub READLINE { 82*de8cc8edSafresh1 my $fh = shift; 83*de8cc8edSafresh1 die "Boom!" 84*de8cc8edSafresh1 unless @$fh; 85*de8cc8edSafresh1 return shift @$fh 86*de8cc8edSafresh1 unless wantarray; 87*de8cc8edSafresh1 return splice @$fh; 88*de8cc8edSafresh1 } 89*de8cc8edSafresh1} 90*de8cc8edSafresh1 91*de8cc8edSafresh1tie *FH, 'TiedHandle'; 92*de8cc8edSafresh1 93*de8cc8edSafresh1is(*FH->getline(), "Tick", "tied handle read works"); 94*de8cc8edSafresh1($list, $context) = *FH->getline(); 95*de8cc8edSafresh1is($list, "tick", "tied handle read works in list context 0"); 96*de8cc8edSafresh1is($context, undef, "tied handle read works in list context 1"); 97*de8cc8edSafresh1is(*FH->getline(), "tick", "tied handle read works again"); 98*de8cc8edSafresh1is(eval { 99*de8cc8edSafresh1 $line = *FH->getline(); 100*de8cc8edSafresh1 1; 101*de8cc8edSafresh1 }, undef, "eval on tied handle caught an exception"); 102*de8cc8edSafresh1like($@, qr/^Boom!/, 103*de8cc8edSafresh1 'getline on tied handle propagates exception'); 104*de8cc8edSafresh1like($line, qr/^This is the/, '$line unchanged'); 105*de8cc8edSafresh1 106*de8cc8edSafresh1tie *FH, 'TiedHandle'; 107*de8cc8edSafresh1 108*de8cc8edSafresh1($list, $context) = *FH->getlines(); 109*de8cc8edSafresh1is($list, "Tick", "tied handle read works in list context 2"); 110*de8cc8edSafresh1is($context, "tick", "tied handle read works in list context 3"); 111*de8cc8edSafresh1is(eval { 112*de8cc8edSafresh1 ($list, $context) = *FH->getlines(); 113*de8cc8edSafresh1 1; 114*de8cc8edSafresh1 }, undef, "eval on tied handle caught an exception again"); 115*de8cc8edSafresh1like($@, qr/^Boom!/, 116*de8cc8edSafresh1 'getlines on tied handle propagates exception'); 117*de8cc8edSafresh1is($list, "Tick", '$line unchanged'); 118