xref: /openbsd-src/gnu/usr.bin/perl/dist/IO/t/io_getline.t (revision de8cc8edbc71bd3e3bc7fbffa27ba0e564c37d8b)
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