1
2use lib 't';
3use strict;
4use warnings;
5use bytes;
6
7use Test::More ;
8use CompTestUtils;
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) {
26        $tests = 241 ;
27    }
28    else {
29        $tests = 249 ;
30    }
31
32    plan tests => $tests + $extra ;
33
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
202                ok ! $io->eof, "  Not EOF";
203                is $io->tell(), 0, "  Tell is 0" ;
204                my @lines = <$io>;
205                is @lines, 6, "  Line is 6"
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 "# expected 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;
493