This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add a note in perldelta about undefining *ISA
[perl5.git] / t / lib / compress / tied.pl
CommitLineData
1a6a8453
PM
1
2use lib 't';
3use strict;
4use warnings;
5use bytes;
6
7use Test::More ;
25f0751f 8use CompTestUtils;
1a6a8453
PM
9
10our ($BadPerl, $UncompressClass);
11
12BEGIN
13{
14 plan(skip_all => "Tied Filehandle needs Perl 5.005 or better" )
15 if $] < 5.005 ;
16
17 # use Test::NoWarnings, if available
18 my $extra = 0 ;
19 $extra = 1
20 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
21
22 my $tests ;
23 $BadPerl = ($] >= 5.006 and $] <= 5.008) ;
24
25 if ($BadPerl) {
cb7abd7f 26 $tests = 241 ;
1a6a8453
PM
27 }
28 else {
cb7abd7f 29 $tests = 249 ;
1a6a8453
PM
30 }
31
32 plan tests => $tests + $extra ;
33
1a6a8453
PM
34}
35
36
37use IO::Handle qw(SEEK_SET SEEK_CUR SEEK_END);
38
39
40
41sub myGZreadFile
42{
43 my $filename = shift ;
44 my $init = shift ;
45
46
47 my $fil = new $UncompressClass $filename,
48 -Strict => 1,
49 -Append => 1
50 ;
51
52 my $data ;
53 $data = $init if defined $init ;
54 1 while $fil->read($data) > 0;
55
56 $fil->close ;
57 return $data ;
58}
59
60sub run
61{
62
63 my $CompressClass = identify();
64 $UncompressClass = getInverse($CompressClass);
65 my $Error = getErrorRef($CompressClass);
66 my $UnError = getErrorRef($UncompressClass);
67
68 {
69 next if $BadPerl ;
70
71
72 title "Testing $CompressClass";
73
74
75 my $x ;
76 my $gz = new $CompressClass(\$x);
77
78 my $buff ;
79
80 eval { getc($gz) } ;
81 like $@, mkErr("^getc Not Available: File opened only for output");
82
83 eval { read($gz, $buff, 1) } ;
84 like $@, mkErr("^read Not Available: File opened only for output");
85
86 eval { <$gz> } ;
87 like $@, mkErr("^readline Not Available: File opened only for output");
88
89 }
90
91 {
92 next if $BadPerl;
93 $UncompressClass = getInverse($CompressClass);
94
95 title "Testing $UncompressClass";
96
97 my $gc ;
98 my $guz = new $CompressClass(\$gc);
99 $guz->write("abc") ;
100 $guz->close();
101
102 my $x ;
103 my $gz = new $UncompressClass(\$gc);
104
105 my $buff ;
106
107 eval { print $gz "abc" } ;
108 like $@, mkErr("^print Not Available: File opened only for intput");
109
110 eval { printf $gz "fmt", "abc" } ;
111 like $@, mkErr("^printf Not Available: File opened only for intput");
112
113 #eval { write($gz, $buff, 1) } ;
114 #like $@, mkErr("^write Not Available: File opened only for intput");
115
116 }
117
118 {
119 $UncompressClass = getInverse($CompressClass);
120
121 title "Testing $CompressClass and $UncompressClass";
122
123
124 {
125 # Write
126 # these tests come almost 100% from IO::String
127
128 my $lex = new LexFile my $name ;
129
130 my $io = $CompressClass->new($name);
131
132 is $io->tell(), 0 ;
133
134 my $heisan = "Heisan\n";
135 print $io $heisan ;
136
137 ok ! $io->eof;
138
139 is $io->tell(), length($heisan) ;
140
141 print($io "a", "b", "c");
142
143 {
144 local($\) = "\n";
145 print $io "d", "e";
146 local($,) = ",";
147 print $io "f", "g", "h";
148 }
149
150 my $foo = "1234567890";
151
152 ok syswrite($io, $foo, length($foo)) == length($foo) ;
153 if ( $[ < 5.6 )
154 { is $io->syswrite($foo, length $foo), length $foo }
155 else
156 { is $io->syswrite($foo), length $foo }
157 ok $io->syswrite($foo, length($foo)) == length $foo;
158 ok $io->write($foo, length($foo), 5) == 5;
159 ok $io->write("xxx\n", 100, -1) == 1;
160
161 for (1..3) {
162 printf $io "i(%d)", $_;
163 $io->printf("[%d]\n", $_);
164 }
165 select $io;
166 print "\n";
167 select STDOUT;
168
169 close $io ;
170
171 ok $io->eof;
172
173 is myGZreadFile($name), "Heisan\nabcde\nf,g,h\n" .
174 ("1234567890" x 3) . "67890\n" .
175 "i(1)[1]\ni(2)[2]\ni(3)[3]\n\n";
176
177
178 }
179
180 {
181 # Read
182 my $str = <<EOT;
183This is an example
184of a paragraph
185
186
187and a single line.
188
189EOT
190
191 my $lex = new LexFile my $name ;
192
193 my $iow = new $CompressClass $name ;
194 print $iow $str ;
195 close $iow;
196
197 my @tmp;
198 my $buf;
199 {
200 my $io = new $UncompressClass $name ;
201
93d092e2
PM
202 ok ! $io->eof, " Not EOF";
203 is $io->tell(), 0, " Tell is 0" ;
1a6a8453 204 my @lines = <$io>;
93d092e2 205 is @lines, 6, " Line is 6"
1a6a8453
PM
206 or print "# Got " . scalar(@lines) . " lines, expected 6\n" ;
207 is $lines[1], "of a paragraph\n" ;
208 is join('', @lines), $str ;
209 is $., 6;
210 is $io->tell(), length($str) ;
211
212 ok $io->eof;
213
214 ok ! ( defined($io->getline) ||
215 (@tmp = $io->getlines) ||
216 defined(<$io>) ||
217 defined($io->getc) ||
218 read($io, $buf, 100) != 0) ;
219 }
220
221
222 {
223 local $/; # slurp mode
224 my $io = $UncompressClass->new($name);
225 ok !$io->eof;
226 my @lines = $io->getlines;
227 ok $io->eof;
228 ok @lines == 1 && $lines[0] eq $str;
229
230 $io = $UncompressClass->new($name);
231 ok ! $io->eof;
232 my $line = <$io>;
233 ok $line eq $str;
234 ok $io->eof;
235 }
236
237 {
238 local $/ = ""; # paragraph mode
239 my $io = $UncompressClass->new($name);
240 ok ! $io->eof;
241 my @lines = <$io>;
242 ok $io->eof;
243 ok @lines == 2
244 or print "# Got " . scalar(@lines) . " lines, expected 2\n" ;
245 ok $lines[0] eq "This is an example\nof a paragraph\n\n\n"
246 or print "# $lines[0]\n";
247 ok $lines[1] eq "and a single line.\n\n";
248 }
249
250 {
251 local $/ = "is";
252 my $io = $UncompressClass->new($name);
253 my @lines = ();
254 my $no = 0;
255 my $err = 0;
256 ok ! $io->eof;
257 while (<$io>) {
258 push(@lines, $_);
259 $err++ if $. != ++$no;
260 }
261
262 ok $err == 0 ;
263 ok $io->eof;
264
265 ok @lines == 3
266 or print "# Got " . scalar(@lines) . " lines, expected 3\n" ;
267 ok join("-", @lines) eq
268 "This- is- an example\n" .
269 "of a paragraph\n\n\n" .
270 "and a single line.\n\n";
271 }
272
273
274 # Test read
275
276 {
277 my $io = $UncompressClass->new($name);
278
279
280 if (! $BadPerl) {
281 eval { read($io, $buf, -1) } ;
282 like $@, mkErr("length parameter is negative");
283 }
284
285 is read($io, $buf, 0), 0, "Requested 0 bytes" ;
286
287 ok read($io, $buf, 3) == 3 ;
288 ok $buf eq "Thi";
289
290 ok sysread($io, $buf, 3, 2) == 3 ;
291 ok $buf eq "Ths i"
292 or print "# [$buf]\n" ;;
293 ok ! $io->eof;
294
295 # $io->seek(-4, 2);
296 #
297 # ok ! $io->eof;
298 #
299 # ok read($io, $buf, 20) == 4 ;
300 # ok $buf eq "e.\n\n";
301 #
302 # ok read($io, $buf, 20) == 0 ;
303 # ok $buf eq "";
304 #
305 # ok ! $io->eof;
306 }
307
308 }
309
310 {
311 # Read from non-compressed file
312
313 my $str = <<EOT;
314This is an example
315of a paragraph
316
317
318and a single line.
319
320EOT
321
322 my $lex = new LexFile my $name ;
323
324 writeFile($name, $str);
325 my @tmp;
326 my $buf;
327 {
328 my $io = new $UncompressClass $name, -Transparent => 1 ;
329
330 ok defined $io;
331 ok ! $io->eof;
332 ok $io->tell() == 0 ;
333 my @lines = <$io>;
334 ok @lines == 6;
335 ok $lines[1] eq "of a paragraph\n" ;
336 ok join('', @lines) eq $str ;
337 ok $. == 6;
338 ok $io->tell() == length($str) ;
339
340 ok $io->eof;
341
342 ok ! ( defined($io->getline) ||
343 (@tmp = $io->getlines) ||
344 defined(<$io>) ||
345 defined($io->getc) ||
346 read($io, $buf, 100) != 0) ;
347 }
348
349
350 {
351 local $/; # slurp mode
352 my $io = $UncompressClass->new($name);
353 ok ! $io->eof;
354 my @lines = $io->getlines;
355 ok $io->eof;
356 ok @lines == 1 && $lines[0] eq $str;
357
358 $io = $UncompressClass->new($name);
359 ok ! $io->eof;
360 my $line = <$io>;
361 ok $line eq $str;
362 ok $io->eof;
363 }
364
365 {
366 local $/ = ""; # paragraph mode
367 my $io = $UncompressClass->new($name);
368 ok ! $io->eof;
369 my @lines = <$io>;
370 ok $io->eof;
371 ok @lines == 2
372 or print "# exected 2 lines, got " . scalar(@lines) . "\n";
373 ok $lines[0] eq "This is an example\nof a paragraph\n\n\n"
374 or print "# [$lines[0]]\n" ;
375 ok $lines[1] eq "and a single line.\n\n";
376 }
377
378 {
379 local $/ = "is";
380 my $io = $UncompressClass->new($name);
381 my @lines = ();
382 my $no = 0;
383 my $err = 0;
384 ok ! $io->eof;
385 while (<$io>) {
386 push(@lines, $_);
387 $err++ if $. != ++$no;
388 }
389
390 ok $err == 0 ;
391 ok $io->eof;
392
393 ok @lines == 3 ;
394 ok join("-", @lines) eq
395 "This- is- an example\n" .
396 "of a paragraph\n\n\n" .
397 "and a single line.\n\n";
398 }
399
400
401 # Test read
402
403 {
404 my $io = $UncompressClass->new($name);
405
406 ok read($io, $buf, 3) == 3 ;
407 ok $buf eq "Thi";
408
409 ok sysread($io, $buf, 3, 2) == 3 ;
410 ok $buf eq "Ths i";
411 ok ! $io->eof;
412
413 # $io->seek(-4, 2);
414 #
415 # ok ! $io->eof;
416 #
417 # ok read($io, $buf, 20) == 4 ;
418 # ok $buf eq "e.\n\n";
419 #
420 # ok read($io, $buf, 20) == 0 ;
421 # ok $buf eq "";
422 #
423 # ok ! $io->eof;
424 }
425
426
427 }
428
429 {
430 # Vary the length parameter in a read
431
432 my $str = <<EOT;
433x
434x
435This is an example
436of a paragraph
437
438
439and a single line.
440
441EOT
442 $str = $str x 100 ;
443
444
445 foreach my $bufsize (1, 3, 512, 4096, length($str)-1, length($str), length($str)+1)
446 {
447 foreach my $trans (0, 1)
448 {
449 foreach my $append (0, 1)
450 {
451 title "Read Tests - buf length $bufsize, Transparent $trans, Append $append" ;
452
453 my $lex = new LexFile my $name ;
454
455 if ($trans) {
456 writeFile($name, $str) ;
457 }
458 else {
459 my $iow = new $CompressClass $name ;
460 print $iow $str ;
461 close $iow;
462 }
463
464
465 my $io = $UncompressClass->new($name,
466 -Append => $append,
467 -Transparent => $trans);
468
469 my $buf;
470
471 is $io->tell(), 0;
472
473 if ($append) {
474 1 while $io->read($buf, $bufsize) > 0;
475 }
476 else {
477 my $tmp ;
478 $buf .= $tmp while $io->read($tmp, $bufsize) > 0 ;
479 }
480 is length $buf, length $str;
481 ok $buf eq $str ;
482 ok ! $io->error() ;
483 ok $io->eof;
484 }
485 }
486 }
487 }
488
489 }
490}
491
4921;