Upgrade to Compress::Zlib 2.000_05
[p5sagit/p5-mst-13.2.git] / ext / Compress / Zlib / t / 02zlib.t
CommitLineData
f4c6fd49 1
642e522c 2use lib 't';
3use strict;
4use warnings;
5use bytes;
f4c6fd49 6
642e522c 7use Test::More ;
8use ZlibTestUtils;
f4c6fd49 9
f4c6fd49 10
642e522c 11BEGIN
12{
13 # use Test::NoWarnings, if available
14 my $extra = 0 ;
15 $extra = 1
16 if eval { require Test::NoWarnings ; import Test::NoWarnings; 1 };
17
18
19 my $count = 0 ;
20 if ($] < 5.005) {
21 $count = 188 ;
22 }
23 elsif ($] >= 5.006) {
24 $count = 242 ;
25 }
26 else {
27 $count = 200 ;
28 }
f4c6fd49 29
642e522c 30 plan tests => $count + $extra;
f4c6fd49 31
642e522c 32 use_ok('Compress::Zlib', 2) ;
f4c6fd49 33}
34
642e522c 35
f4c6fd49 36
37my $hello = <<EOM ;
38hello world
39this is a test
40EOM
41
42my $len = length $hello ;
43
f4c6fd49 44# Check zlib_version and ZLIB_VERSION are the same.
642e522c 45is Compress::Zlib::zlib_version, ZLIB_VERSION,
46 "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
f4c6fd49 47
642e522c 48{
49 title "Error Cases" ;
f4c6fd49 50
642e522c 51 eval { new Compress::Zlib::Deflate(-Level) };
52 like $@, mkErr("^Compress::Zlib::Deflate::new: Expected even number of parameters, got 1") ;
f4c6fd49 53
642e522c 54 eval { new Compress::Zlib::Inflate(-Level) };
55 like $@, mkErr("^Compress::Zlib::Inflate::new: Expected even number of parameters, got 1");
f4c6fd49 56
642e522c 57 eval { new Compress::Zlib::Deflate(-Joe => 1) };
58 like $@, mkErr('^Compress::Zlib::Deflate::new: unknown key value\(s\) Joe');
f4c6fd49 59
642e522c 60 eval { new Compress::Zlib::Inflate(-Joe => 1) };
61 like $@, mkErr('^Compress::Zlib::Inflate::new: unknown key value\(s\) Joe');
f4c6fd49 62
642e522c 63 eval { new Compress::Zlib::Deflate(-Bufsize => 0) };
64 like $@, mkErr("^Compress::Zlib::Deflate::new: Bufsize must be >= 1, you specified 0");
f4c6fd49 65
642e522c 66 eval { new Compress::Zlib::Inflate(-Bufsize => 0) };
67 like $@, mkErr("^Compress::Zlib::Inflate::new: Bufsize must be >= 1, you specified 0");
f4c6fd49 68
642e522c 69 eval { new Compress::Zlib::Deflate(-Bufsize => -1) };
70 like $@, mkErr("^Compress::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
f4c6fd49 71
642e522c 72 eval { new Compress::Zlib::Inflate(-Bufsize => -1) };
73 like $@, mkErr("^Compress::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
f4c6fd49 74
642e522c 75 eval { new Compress::Zlib::Deflate(-Bufsize => "xxx") };
76 like $@, mkErr("^Compress::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
f4c6fd49 77
642e522c 78 eval { new Compress::Zlib::Inflate(-Bufsize => "xxx") };
79 like $@, mkErr("^Compress::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
f4c6fd49 80
642e522c 81 eval { new Compress::Zlib::Inflate(-Bufsize => 1, 2) };
82 like $@, mkErr("^Compress::Zlib::Inflate::new: Expected even number of parameters, got 3");
f4c6fd49 83
642e522c 84 eval { new Compress::Zlib::Deflate(-Bufsize => 1, 2) };
85 like $@, mkErr("^Compress::Zlib::Deflate::new: Expected even number of parameters, got 3");
f4c6fd49 86
642e522c 87}
f4c6fd49 88
642e522c 89{
f4c6fd49 90
642e522c 91 title "deflate/inflate - small buffer";
92 # ==============================
f4c6fd49 93
642e522c 94 my $hello = "I am a HAL 9000 computer" ;
95 my @hello = split('', $hello) ;
96 my ($err, $x, $X, $status);
f4c6fd49 97
642e522c 98 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1 ), "Create deflate object" );
99 ok $x, "Compress::Zlib::Deflate ok" ;
100 cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
101
102 ok ! defined $x->msg() ;
103 is $x->total_in(), 0, "total_in() == 0" ;
104 is $x->total_out(), 0, "total_out() == 0" ;
f4c6fd49 105
642e522c 106 $X = "" ;
107 my $Answer = '';
108 foreach (@hello)
109 {
110 $status = $x->deflate($_, $X) ;
111 last unless $status == Z_OK ;
112
113 $Answer .= $X ;
114 }
115
116 cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
117
118 cmp_ok $x->flush($X), '==', Z_OK, "flush returned Z_OK" ;
119 $Answer .= $X ;
120
121 ok ! defined $x->msg() ;
122 is $x->total_in(), length $hello, "total_in ok" ;
123 is $x->total_out(), length $Answer, "total_out ok" ;
124
125 my @Answer = split('', $Answer) ;
126
127 my $k;
128 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1}) );
129 ok $k, "Compress::Zlib::Inflate ok" ;
130 cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
131
132 ok ! defined $k->msg(), "No error messages" ;
133 is $k->total_in(), 0, "total_in() == 0" ;
134 is $k->total_out(), 0, "total_out() == 0" ;
135 my $GOT = '';
136 my $Z;
137 $Z = 1 ;#x 2000 ;
138 foreach (@Answer)
139 {
140 $status = $k->inflate($_, $Z) ;
141 $GOT .= $Z ;
142 last if $status == Z_STREAM_END or $status != Z_OK ;
143
144 }
145
146 cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
147 is $GOT, $hello, "uncompressed data matches ok" ;
148 ok ! defined $k->msg(), "No error messages" ;
149 is $k->total_in(), length $Answer, "total_in ok" ;
150 is $k->total_out(), length $hello , "total_out ok";
f4c6fd49 151
f4c6fd49 152}
f4c6fd49 153
f4c6fd49 154
642e522c 155{
156 # deflate/inflate - small buffer with a number
157 # ==============================
f4c6fd49 158
642e522c 159 my $hello = 6529 ;
160
161 ok my ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1, -AppendOutput => 1 ) ;
162 ok $x ;
163 cmp_ok $err, '==', Z_OK ;
164
165 my $status;
166 my $Answer = '';
167
168 cmp_ok $x->deflate($hello, $Answer), '==', Z_OK ;
169
170 cmp_ok $x->flush($Answer), '==', Z_OK ;
171
172 my @Answer = split('', $Answer) ;
173
174 my $k;
175 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}) );
176 ok $k ;
177 cmp_ok $err, '==', Z_OK ;
178
179 #my $GOT = '';
180 my $GOT ;
181 foreach (@Answer)
182 {
183 $status = $k->inflate($_, $GOT) ;
184 last if $status == Z_STREAM_END or $status != Z_OK ;
185
186 }
187
188 cmp_ok $status, '==', Z_STREAM_END ;
189 is $GOT, $hello ;
f4c6fd49 190
f4c6fd49 191}
f4c6fd49 192
642e522c 193{
f4c6fd49 194
642e522c 195# deflate/inflate options - AppendOutput
196# ================================
f4c6fd49 197
642e522c 198 # AppendOutput
199 # CRC
f4c6fd49 200
642e522c 201 my $hello = "I am a HAL 9000 computer" ;
202 my @hello = split('', $hello) ;
203
204 ok my ($x, $err) = new Compress::Zlib::Deflate ( {-Bufsize => 1, -AppendOutput =>1} ) ;
205 ok $x ;
206 cmp_ok $err, '==', Z_OK ;
207
208 my $status;
209 my $X;
210 foreach (@hello)
211 {
212 $status = $x->deflate($_, $X) ;
213 last unless $status == Z_OK ;
214 }
215
216 cmp_ok $status, '==', Z_OK ;
217
218 cmp_ok $x->flush($X), '==', Z_OK ;
219
220
221 my @Answer = split('', $X) ;
222
223 my $k;
224 ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}));
225 ok $k ;
226 cmp_ok $err, '==', Z_OK ;
227
228 my $Z;
229 foreach (@Answer)
230 {
231 $status = $k->inflate($_, $Z) ;
232 last if $status == Z_STREAM_END or $status != Z_OK ;
233
234 }
235
236 cmp_ok $status, '==', Z_STREAM_END ;
237 is $Z, $hello ;
238}
f4c6fd49 239
f4c6fd49 240
f4c6fd49 241{
f4c6fd49 242
642e522c 243 title "deflate/inflate - larger buffer";
244 # ==============================
f4c6fd49 245
642e522c 246 # generate a long random string
247 my $contents = '' ;
248 foreach (1 .. 50000)
249 { $contents .= chr int rand 255 }
250
251
252 ok my ($x, $err) = new Compress::Zlib::Deflate() ;
253 ok $x ;
254 cmp_ok $err, '==', Z_OK ;
255
256 my (%X, $Y, %Z, $X, $Z);
257 #cmp_ok $x->deflate($contents, $X{key}), '==', Z_OK ;
258 cmp_ok $x->deflate($contents, $X), '==', Z_OK ;
259
260 #$Y = $X{key} ;
261 $Y = $X ;
262
263
264 #cmp_ok $x->flush($X{key}), '==', Z_OK ;
265 #$Y .= $X{key} ;
266 cmp_ok $x->flush($X), '==', Z_OK ;
267 $Y .= $X ;
268
269
f4c6fd49 270
642e522c 271 my $keep = $Y ;
f4c6fd49 272
642e522c 273 my $k;
274 ok(($k, $err) = new Compress::Zlib::Inflate() );
275 ok $k ;
276 cmp_ok $err, '==', Z_OK ;
277
278 #cmp_ok $k->inflate($Y, $Z{key}), '==', Z_STREAM_END ;
279 #ok $contents eq $Z{key} ;
280 cmp_ok $k->inflate($Y, $Z), '==', Z_STREAM_END ;
281 ok $contents eq $Z ;
f4c6fd49 282
642e522c 283 # redo deflate with AppendOutput
f4c6fd49 284
642e522c 285 ok (($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1)) ;
286 ok $k ;
287 cmp_ok $err, '==', Z_OK ;
288
289 my $s ;
290 my $out ;
291 my @bits = split('', $keep) ;
292 foreach my $bit (@bits) {
293 $s = $k->inflate($bit, $out) ;
294 }
295
296 cmp_ok $s, '==', Z_STREAM_END ;
297
298 ok $contents eq $out ;
f4c6fd49 299
f4c6fd49 300
f4c6fd49 301}
f4c6fd49 302
642e522c 303{
f4c6fd49 304
642e522c 305 title "deflate/inflate - preset dictionary";
306 # ===================================
f4c6fd49 307
642e522c 308 my $dictionary = "hello" ;
309 ok my $x = new Compress::Zlib::Deflate({-Level => Z_BEST_COMPRESSION,
310 -Dictionary => $dictionary}) ;
f4c6fd49 311
642e522c 312 my $dictID = $x->dict_adler() ;
f4c6fd49 313
642e522c 314 my ($X, $Y, $Z);
315 cmp_ok $x->deflate($hello, $X), '==', Z_OK;
316 cmp_ok $x->flush($Y), '==', Z_OK;
317 $X .= $Y ;
f4c6fd49 318
642e522c 319 ok my $k = new Compress::Zlib::Inflate(-Dictionary => $dictionary) ;
f4c6fd49 320
642e522c 321 cmp_ok $k->inflate($X, $Z), '==', Z_STREAM_END;
322 is $k->dict_adler(), $dictID;
323 is $hello, $Z ;
f4c6fd49 324
642e522c 325}
f4c6fd49 326
642e522c 327title 'inflate - check remaining buffer after Z_STREAM_END';
328# and that ConsumeInput works.
f4c6fd49 329# ===================================================
330
642e522c 331for my $consume ( 0 .. 1)
f4c6fd49 332{
642e522c 333 ok my $x = new Compress::Zlib::Deflate(-Level => Z_BEST_COMPRESSION ) ;
f4c6fd49 334
642e522c 335 my ($X, $Y, $Z);
336 cmp_ok $x->deflate($hello, $X), '==', Z_OK;
337 cmp_ok $x->flush($Y), '==', Z_OK;
f4c6fd49 338 $X .= $Y ;
f4c6fd49 339
642e522c 340 ok my $k = new Compress::Zlib::Inflate( -ConsumeInput => $consume) ;
f4c6fd49 341
342 my $first = substr($X, 0, 2) ;
642e522c 343 my $remember_first = $first ;
f4c6fd49 344 my $last = substr($X, 2) ;
642e522c 345 cmp_ok $k->inflate($first, $Z), '==', Z_OK;
346 if ($consume) {
347 ok $first eq "" ;
348 }
349 else {
350 ok $first eq $remember_first ;
351 }
f4c6fd49 352
642e522c 353 my $T ;
f4c6fd49 354 $last .= "appendage" ;
642e522c 355 my $remember_last = $last ;
356 cmp_ok $k->inflate($last, $T), '==', Z_STREAM_END;
357 is $hello, $Z . $T ;
358 if ($consume) {
359 is $last, "appendage" ;
360 }
361 else {
362 is $last, $remember_last ;
363 }
f4c6fd49 364
f4c6fd49 365}
366
f4c6fd49 367
f4c6fd49 368
369{
370
642e522c 371 title 'Check - MAX_WBITS';
f4c6fd49 372 # =================
373
642e522c 374 my $hello = "Test test test test test";
375 my @hello = split('', $hello) ;
376
377 ok my ($x, $err) =
378 new Compress::Zlib::Deflate ( -Bufsize => 1,
379 -WindowBits => -MAX_WBITS(),
380 -AppendOutput => 1 ) ;
381 ok $x ;
382 cmp_ok $err, '==', Z_OK ;
383
384 my $Answer = '';
385 my $status;
f4c6fd49 386 foreach (@hello)
387 {
642e522c 388 $status = $x->deflate($_, $Answer) ;
f4c6fd49 389 last unless $status == Z_OK ;
f4c6fd49 390 }
391
642e522c 392 cmp_ok $status, '==', Z_OK ;
f4c6fd49 393
642e522c 394 cmp_ok $x->flush($Answer), '==', Z_OK ;
f4c6fd49 395
642e522c 396 my @Answer = split('', $Answer) ;
f4c6fd49 397 # Undocumented corner -- extra byte needed to get inflate to return
398 # Z_STREAM_END when done.
399 push @Answer, " " ;
400
642e522c 401 my $k;
402 ok(($k, $err) = new Compress::Zlib::Inflate(
403 {-Bufsize => 1,
404 -AppendOutput =>1,
405 -WindowBits => -MAX_WBITS()})) ;
406 ok $k ;
407 cmp_ok $err, '==', Z_OK ;
f4c6fd49 408
642e522c 409 my $GOT = '';
f4c6fd49 410 foreach (@Answer)
411 {
642e522c 412 $status = $k->inflate($_, $GOT) ;
f4c6fd49 413 last if $status == Z_STREAM_END or $status != Z_OK ;
414
415 }
416
642e522c 417 cmp_ok $status, '==', Z_STREAM_END ;
418 is $GOT, $hello ;
f4c6fd49 419
420}
421
422{
642e522c 423 title 'inflateSync';
f4c6fd49 424
425 # create a deflate stream with flush points
426
427 my $hello = "I am a HAL 9000 computer" x 2001 ;
428 my $goodbye = "Will I dream?" x 2010;
642e522c 429 my ($x, $err, $answer, $X, $Z, $status);
430 my $Answer ;
f4c6fd49 431
642e522c 432 #use Devel::Peek ;
433 ok(($x, $err) = new Compress::Zlib::Deflate(AppendOutput => 1)) ;
434 ok $x ;
435 cmp_ok $err, '==', Z_OK ;
f4c6fd49 436
642e522c 437 cmp_ok $x->deflate($hello, $Answer), '==', Z_OK;
f4c6fd49 438
439 # create a flush point
642e522c 440 cmp_ok $x->flush($Answer, Z_FULL_FLUSH), '==', Z_OK ;
f4c6fd49 441
642e522c 442 cmp_ok $x->deflate($goodbye, $Answer), '==', Z_OK;
f4c6fd49 443
642e522c 444 cmp_ok $x->flush($Answer), '==', Z_OK ;
f4c6fd49 445
446 my ($first, @Answer) = split('', $Answer) ;
447
448 my $k;
642e522c 449 ok(($k, $err) = new Compress::Zlib::Inflate()) ;
450 ok $k ;
451 cmp_ok $err, '==', Z_OK ;
f4c6fd49 452
642e522c 453 cmp_ok $k->inflate($first, $Z), '==', Z_OK;
f4c6fd49 454
455 # skip to the first flush point.
456 while (@Answer)
457 {
458 my $byte = shift @Answer;
459 $status = $k->inflateSync($byte) ;
460 last unless $status == Z_DATA_ERROR;
f4c6fd49 461 }
462
642e522c 463 cmp_ok $status, '==', Z_OK;
f4c6fd49 464
465 my $GOT = '';
f4c6fd49 466 foreach (@Answer)
467 {
468 my $Z = '';
642e522c 469 $status = $k->inflate($_, $Z) ;
f4c6fd49 470 $GOT .= $Z if defined $Z ;
471 # print "x $status\n";
472 last if $status == Z_STREAM_END or $status != Z_OK ;
473
474 }
475
642e522c 476 cmp_ok $status, '==', Z_DATA_ERROR ;
477 is $GOT, $goodbye ;
f4c6fd49 478
479
480 # Check inflateSync leaves good data in buffer
642e522c 481 my $rest = $Answer ;
482 $rest =~ s/^(.)//;
483 my $initial = $1 ;
f4c6fd49 484
485
642e522c 486 ok(($k, $err) = new Compress::Zlib::Inflate(-ConsumeInput => 0)) ;
487 ok $k ;
488 cmp_ok $err, '==', Z_OK ;
f4c6fd49 489
642e522c 490 cmp_ok $k->inflate($initial, $Z), '==', Z_OK;
f4c6fd49 491
642e522c 492 # Skip to the flush point
493 $status = $k->inflateSync($rest);
494 cmp_ok $status, '==', Z_OK
495 or diag "status '$status'\nlength rest is " . length($rest) . "\n" ;
f4c6fd49 496
642e522c 497 cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR;
498 is $Z . $GOT, $goodbye ;
f4c6fd49 499}
500
501{
642e522c 502 title 'deflateParams';
f4c6fd49 503
504 my $hello = "I am a HAL 9000 computer" x 2001 ;
505 my $goodbye = "Will I dream?" x 2010;
642e522c 506 my ($x, $input, $err, $answer, $X, $status, $Answer);
f4c6fd49 507
642e522c 508 ok(($x, $err) = new Compress::Zlib::Deflate(
509 -AppendOutput => 1,
510 -Level => Z_DEFAULT_COMPRESSION,
511 -Strategy => Z_DEFAULT_STRATEGY)) ;
512 ok $x ;
513 cmp_ok $err, '==', Z_OK ;
f4c6fd49 514
642e522c 515 ok $x->get_Level() == Z_DEFAULT_COMPRESSION;
516 ok $x->get_Strategy() == Z_DEFAULT_STRATEGY;
f4c6fd49 517
642e522c 518 $status = $x->deflate($hello, $Answer) ;
519 cmp_ok $status, '==', Z_OK ;
f4c6fd49 520 $input .= $hello;
521
522 # error cases
523 eval { $x->deflateParams() };
642e522c 524 like $@, mkErr('^Compress::Zlib::deflateParams needs Level and\/or Strategy');
525
526 eval { $x->deflateParams(-Bufsize => 0) };
527 like $@, mkErr('^Compress::Zlib::Inflate::deflateParams: Bufsize must be >= 1, you specified 0');
f4c6fd49 528
529 eval { $x->deflateParams(-Joe => 3) };
642e522c 530 like $@, mkErr('^Compress::Zlib::deflateStream::deflateParams: unknown key value\(s\) Joe');
f4c6fd49 531
642e522c 532 is $x->get_Level(), Z_DEFAULT_COMPRESSION;
533 is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
f4c6fd49 534
535 # change both Level & Strategy
642e522c 536 $status = $x->deflateParams(-Level => Z_BEST_SPEED, -Strategy => Z_HUFFMAN_ONLY, -Bufsize => 1234) ;
537 cmp_ok $status, '==', Z_OK ;
f4c6fd49 538
642e522c 539 is $x->get_Level(), Z_BEST_SPEED;
540 is $x->get_Strategy(), Z_HUFFMAN_ONLY;
f4c6fd49 541
642e522c 542 $status = $x->deflate($goodbye, $Answer) ;
543 cmp_ok $status, '==', Z_OK ;
f4c6fd49 544 $input .= $goodbye;
545
546 # change only Level
547 $status = $x->deflateParams(-Level => Z_NO_COMPRESSION) ;
642e522c 548 cmp_ok $status, '==', Z_OK ;
f4c6fd49 549
642e522c 550 is $x->get_Level(), Z_NO_COMPRESSION;
551 is $x->get_Strategy(), Z_HUFFMAN_ONLY;
f4c6fd49 552
642e522c 553 $status = $x->deflate($goodbye, $Answer) ;
554 cmp_ok $status, '==', Z_OK ;
f4c6fd49 555 $input .= $goodbye;
556
557 # change only Strategy
558 $status = $x->deflateParams(-Strategy => Z_FILTERED) ;
642e522c 559 cmp_ok $status, '==', Z_OK ;
f4c6fd49 560
642e522c 561 is $x->get_Level(), Z_NO_COMPRESSION;
562 is $x->get_Strategy(), Z_FILTERED;
f4c6fd49 563
642e522c 564 $status = $x->deflate($goodbye, $Answer) ;
565 cmp_ok $status, '==', Z_OK ;
f4c6fd49 566 $input .= $goodbye;
567
642e522c 568 cmp_ok $x->flush($Answer), '==', Z_OK ;
f4c6fd49 569
570 my $k;
642e522c 571 ok(($k, $err) = new Compress::Zlib::Inflate()) ;
572 ok $k ;
573 cmp_ok $err, '==', Z_OK ;
f4c6fd49 574
642e522c 575 my $Z;
576 $status = $k->inflate($Answer, $Z) ;
f4c6fd49 577
642e522c 578 cmp_ok $status, '==', Z_STREAM_END ;
579 is $Z, $input ;
f4c6fd49 580}
581
642e522c 582
f4c6fd49 583{
642e522c 584 title "ConsumeInput and a read-only buffer trapped" ;
585
586 ok my $k = new Compress::Zlib::Inflate(-ConsumeInput => 1) ;
587
588 my $Z;
589 eval { $k->inflate("abc", $Z) ; };
590 like $@, mkErr("Compress::Zlib::Inflate::inflate input parameter cannot be read-only when ConsumeInput is specified");
591
592}
f4c6fd49 593
642e522c 594foreach (1 .. 2)
595{
596 next if $[ < 5.005 ;
f4c6fd49 597
642e522c 598 title 'test inflate/deflate with a substr';
f4c6fd49 599
642e522c 600 my $contents = '' ;
601 foreach (1 .. 5000)
602 { $contents .= chr int rand 255 }
603 ok my $x = new Compress::Zlib::Deflate(-AppendOutput => 1) ;
604
605 my $X ;
606 my $status = $x->deflate(substr($contents,0), $X);
607 cmp_ok $status, '==', Z_OK ;
608
609 cmp_ok $x->flush($X), '==', Z_OK ;
610
611 my $append = "Appended" ;
612 $X .= $append ;
613
614 ok my $k = new Compress::Zlib::Inflate(-AppendOutput => 1) ;
615
616 my $Z;
617 my $keep = $X ;
618 $status = $k->inflate(substr($X, 0), $Z) ;
619
620 cmp_ok $status, '==', Z_STREAM_END ;
621 #print "status $status X [$X]\n" ;
622 is $contents, $Z ;
623 ok $X eq $append;
624 #is length($X), length($append);
625 #ok $X eq $keep;
626 #is length($X), length($keep);
627}
628
629title 'Looping Append test - checks that deRef_l resets the output buffer';
630foreach (1 .. 2)
631{
f4c6fd49 632
642e522c 633 my $hello = "I am a HAL 9000 computer" ;
634 my @hello = split('', $hello) ;
635 my ($err, $x, $X, $status);
636
637 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1 ) );
638 ok $x ;
639 cmp_ok $err, '==', Z_OK ;
640
641 $X = "" ;
642 my $Answer = '';
643 foreach (@hello)
644 {
645 $status = $x->deflate($_, $X) ;
646 last unless $status == Z_OK ;
647
648 $Answer .= $X ;
649 }
650
651 cmp_ok $status, '==', Z_OK ;
652
653 cmp_ok $x->flush($X), '==', Z_OK ;
654 $Answer .= $X ;
655
656 my @Answer = split('', $Answer) ;
657
658 my $k;
659 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
660 ok $k ;
661 cmp_ok $err, '==', Z_OK ;
662
663 my $GOT ;
664 my $Z;
665 $Z = 1 ;#x 2000 ;
666 foreach (@Answer)
667 {
668 $status = $k->inflate($_, $GOT) ;
669 last if $status == Z_STREAM_END or $status != Z_OK ;
670 }
671
672 cmp_ok $status, '==', Z_STREAM_END ;
673 is $GOT, $hello ;
f4c6fd49 674
642e522c 675}
f4c6fd49 676
642e522c 677if ($] >= 5.005)
678{
679 title 'test inflate input parameter via substr';
f4c6fd49 680
642e522c 681 my $hello = "I am a HAL 9000 computer" ;
682 my $data = $hello ;
f4c6fd49 683
642e522c 684 my($X, $Z);
f4c6fd49 685
642e522c 686 ok my $x = new Compress::Zlib::Deflate ( -AppendOutput => 1 );
f4c6fd49 687
642e522c 688 cmp_ok $x->deflate($data, $X), '==', Z_OK ;
f4c6fd49 689
642e522c 690 cmp_ok $x->flush($X), '==', Z_OK ;
691
692 my $append = "Appended" ;
693 $X .= $append ;
694 my $keep = $X ;
695
696 ok my $k = new Compress::Zlib::Inflate ( -AppendOutput => 1,
697 -ConsumeInput => 1 ) ;
698
699# cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
700 cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
701
702 ok $hello eq $Z ;
703 is $X, $append;
704
705 $X = $keep ;
706 $Z = '';
707 ok $k = new Compress::Zlib::Inflate ( -AppendOutput => 1,
708 -ConsumeInput => 0 ) ;
709
710 cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
711 #cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
712
713 ok $hello eq $Z ;
714 is $X, $keep;
715
f4c6fd49 716}
717
642e522c 718exit if $] < 5.006 ;
719
720title 'Looping Append test with substr output - substr the end of the string';
721foreach (1 .. 2)
f4c6fd49 722{
f4c6fd49 723
642e522c 724 my $hello = "I am a HAL 9000 computer" ;
725 my @hello = split('', $hello) ;
726 my ($err, $x, $X, $status);
727
728 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1,
729 -AppendOutput => 1 ) );
730 ok $x ;
731 cmp_ok $err, '==', Z_OK ;
732
733 $X = "" ;
734 my $Answer = '';
735 foreach (@hello)
736 {
737 $status = $x->deflate($_, substr($Answer, length($Answer))) ;
738 last unless $status == Z_OK ;
739
740 }
f4c6fd49 741
642e522c 742 cmp_ok $status, '==', Z_OK ;
f4c6fd49 743
642e522c 744 cmp_ok $x->flush(substr($Answer, length($Answer))), '==', Z_OK ;
f4c6fd49 745
642e522c 746 my @Answer = split('', $Answer) ;
f4c6fd49 747
642e522c 748 my $k;
749 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
750 ok $k ;
751 cmp_ok $err, '==', Z_OK ;
752
753 my $GOT = '';
754 my $Z;
755 $Z = 1 ;#x 2000 ;
756 foreach (@Answer)
757 {
758 $status = $k->inflate($_, substr($GOT, length($GOT))) ;
759 last if $status == Z_STREAM_END or $status != Z_OK ;
760 }
f4c6fd49 761
642e522c 762 cmp_ok $status, '==', Z_STREAM_END ;
763 is $GOT, $hello ;
764
765}
766
767title 'Looping Append test with substr output - substr the complete string';
768foreach (1 .. 2)
769{
770
771 my $hello = "I am a HAL 9000 computer" ;
772 my @hello = split('', $hello) ;
773 my ($err, $x, $X, $status);
774
775 ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1,
776 -AppendOutput => 1 ) );
777 ok $x ;
778 cmp_ok $err, '==', Z_OK ;
779
780 $X = "" ;
781 my $Answer = '';
782 foreach (@hello)
783 {
784 $status = $x->deflate($_, substr($Answer, 0)) ;
785 last unless $status == Z_OK ;
786
787 }
788
789 cmp_ok $status, '==', Z_OK ;
790
791 cmp_ok $x->flush(substr($Answer, 0)), '==', Z_OK ;
f4c6fd49 792
642e522c 793 my @Answer = split('', $Answer) ;
f4c6fd49 794
642e522c 795 my $k;
796 ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
797 ok $k ;
798 cmp_ok $err, '==', Z_OK ;
799
800 my $GOT = '';
801 my $Z;
802 $Z = 1 ;#x 2000 ;
803 foreach (@Answer)
804 {
805 $status = $k->inflate($_, substr($GOT, 0)) ;
806 last if $status == Z_STREAM_END or $status != Z_OK ;
807 }
f4c6fd49 808
642e522c 809 cmp_ok $status, '==', Z_STREAM_END ;
810 is $GOT, $hello ;
f4c6fd49 811}
642e522c 812