Upgrade to Compress::Zlib 2.000_05
[p5sagit/p5-mst-13.2.git] / ext / Compress / Zlib / t / 02zlib.t
index e4802d1..530e221 100644 (file)
@@ -1,34 +1,38 @@
 
+use lib 't';
+use strict;
+use warnings;
+use bytes;
 
-use strict ;
-use warnings ;
+use Test::More  ;
+use ZlibTestUtils;
 
-use Compress::Zlib ;
 
-sub ok
-{
-    my ($no, $ok) = @_ ;
+BEGIN 
+{ 
+    # use Test::NoWarnings, if available
+    my $extra = 0 ;
+    $extra = 1
+        if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
+
+
+    my $count = 0 ;
+    if ($] < 5.005) {
+        $count = 188 ;
+    }
+    elsif ($] >= 5.006) {
+        $count = 242 ;
+    }
+    else {
+        $count = 200 ;
+    }
 
-    #++ $total ;
-    #++ $totalBad unless $ok ;
+    plan tests => $count + $extra;
 
-    print "ok $no\n" if $ok ;
-    print "not ok $no\n" unless $ok ;
+    use_ok('Compress::Zlib', 2) ;
 }
 
-sub readFile
-{
-    my ($filename) = @_ ;
-    my ($string) = '' ;
-    open (F, "<$filename")
-        or die "Cannot open $filename: $!\n" ;
-    binmode(F);
-    while (<F>)
-      { $string .= $_ }
-    close F ;
-    $string ;
-}     
+
 
 my $hello = <<EOM ;
 hello world
@@ -37,695 +41,416 @@ EOM
 
 my $len   = length $hello ;
 
-
-print "1..239\n" ;
-
 # Check zlib_version and ZLIB_VERSION are the same.
-ok(1, Compress::Zlib::zlib_version eq ZLIB_VERSION) ;
-
-# gzip tests
-#===========
-
-my $name = "test.gz" ;
-my ($x, $uncomp) ;
-
-ok(2, my $fil = gzopen($name, "wb")) ;
-
-ok(3, $gzerrno == 0);
-
-ok(4, $fil->gzwrite($hello) == $len) ;
-
-ok(5, ! $fil->gzclose ) ;
-
-ok(6, $fil = gzopen($name, "rb") ) ;
-
-ok(7, $gzerrno == 0);
-
-ok(8, ($x = $fil->gzread($uncomp)) == $len) ;
-
-ok(9, ! $fil->gzclose ) ;
+is Compress::Zlib::zlib_version, ZLIB_VERSION, 
+    "ZLIB_VERSION matches Compress::Zlib::zlib_version" ;
 
-unlink $name ;
-
-ok(10, $hello eq $uncomp) ;
-
-# check that a number can be gzipped
-my $number = 7603 ;
-my $num_len = 4 ;
-
-ok(11, $fil = gzopen($name, "wb")) ;
-
-ok(12, $gzerrno == 0);
-
-ok(13, $fil->gzwrite($number) == $num_len) ;
-
-ok(14, $gzerrno == 0);
-
-ok(15, ! $fil->gzclose ) ;
-
-ok(16, $gzerrno == 0);
+{
+    title "Error Cases" ;
 
-ok(17, $fil = gzopen($name, "rb") ) ;
+    eval { new Compress::Zlib::Deflate(-Level) };
+    like $@,  mkErr("^Compress::Zlib::Deflate::new: Expected even number of parameters, got 1") ;
 
-ok(18, ($x = $fil->gzread($uncomp)) == $num_len) ;
+    eval { new Compress::Zlib::Inflate(-Level) };
+    like $@, mkErr("^Compress::Zlib::Inflate::new: Expected even number of parameters, got 1");
 
-ok(19, $gzerrno == 0 || $gzerrno == Z_STREAM_END);
+    eval { new Compress::Zlib::Deflate(-Joe => 1) };
+    like $@, mkErr('^Compress::Zlib::Deflate::new: unknown key value\(s\) Joe');
 
-ok(20, ! $fil->gzclose ) ;
+    eval { new Compress::Zlib::Inflate(-Joe => 1) };
+    like $@, mkErr('^Compress::Zlib::Inflate::new: unknown key value\(s\) Joe');
 
-ok(21, $gzerrno == 0);
+    eval { new Compress::Zlib::Deflate(-Bufsize => 0) };
+    like $@, mkErr("^Compress::Zlib::Deflate::new: Bufsize must be >= 1, you specified 0");
 
-unlink $name ;
+    eval { new Compress::Zlib::Inflate(-Bufsize => 0) };
+    like $@, mkErr("^Compress::Zlib::Inflate::new: Bufsize must be >= 1, you specified 0");
 
-ok(22, $number == $uncomp) ;
-ok(23, $number eq $uncomp) ;
+    eval { new Compress::Zlib::Deflate(-Bufsize => -1) };
+    like $@, mkErr("^Compress::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
 
+    eval { new Compress::Zlib::Inflate(-Bufsize => -1) };
+    like $@, mkErr("^Compress::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got '-1'");
 
-# now a bigger gzip test
+    eval { new Compress::Zlib::Deflate(-Bufsize => "xxx") };
+    like $@, mkErr("^Compress::Zlib::Deflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
 
-my $text = 'text' ;
-my $file = "$text.gz" ;
+    eval { new Compress::Zlib::Inflate(-Bufsize => "xxx") };
+    like $@, mkErr("^Compress::Zlib::Inflate::new: Parameter 'Bufsize' must be an unsigned int, got 'xxx'");
 
-ok(24, my $f = gzopen($file, "wb")) ;
+    eval { new Compress::Zlib::Inflate(-Bufsize => 1, 2) };
+    like $@, mkErr("^Compress::Zlib::Inflate::new: Expected even number of parameters, got 3");
 
-# generate a long random string
-my $contents = '' ;
-foreach (1 .. 5000)
-  { $contents .= chr int rand 256 }
+    eval { new Compress::Zlib::Deflate(-Bufsize => 1, 2) };
+    like $@, mkErr("^Compress::Zlib::Deflate::new: Expected even number of parameters, got 3");
 
-$len = length $contents ;
+}
 
-ok(25, $f->gzwrite($contents) == $len ) ;
+{
 
-ok(26, ! $f->gzclose );
+    title  "deflate/inflate - small buffer";
+    # ==============================
 
-ok(27, $f = gzopen($file, "rb")) ;
+    my $hello = "I am a HAL 9000 computer" ;
+    my @hello = split('', $hello) ;
+    my ($err, $x, $X, $status); 
  
-my $uncompressed ;
-ok(28, $f->gzread($uncompressed, $len) == $len) ;
-
-ok(29, $contents eq $uncompressed) ;
-
-ok(30, ! $f->gzclose ) ;
-
-unlink($file) ;
-
-# gzip - readline tests
-# ======================
+    ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1 ), "Create deflate object" );
+    ok $x, "Compress::Zlib::Deflate ok" ;
+    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
+    ok ! defined $x->msg() ;
+    is $x->total_in(), 0, "total_in() == 0" ;
+    is $x->total_out(), 0, "total_out() == 0" ;
 
-# first create a small gzipped text file
-$name = "test.gz" ;
-my @text = (<<EOM, <<EOM, <<EOM, <<EOM) ;
-this is line 1
-EOM
-the second line
-EOM
-the line after the previous line
-EOM
-the final line
-EOM
+    $X = "" ;
+    my $Answer = '';
+    foreach (@hello)
+    {
+        $status = $x->deflate($_, $X) ;
+        last unless $status == Z_OK ;
+    
+        $Answer .= $X ;
+    }
+     
+    cmp_ok $status, '==', Z_OK, "deflate returned Z_OK" ;
+    
+    cmp_ok  $x->flush($X), '==', Z_OK, "flush returned Z_OK" ;
+    $Answer .= $X ;
+     
+    ok ! defined $x->msg()  ;
+    is $x->total_in(), length $hello, "total_in ok" ;
+    is $x->total_out(), length $Answer, "total_out ok" ;
+     
+    my @Answer = split('', $Answer) ;
+     
+    my $k;
+    ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1}) );
+    ok $k, "Compress::Zlib::Inflate ok" ;
+    cmp_ok $err, '==', Z_OK, "status is Z_OK" ;
+    ok ! defined $k->msg(), "No error messages" ;
+    is $k->total_in(), 0, "total_in() == 0" ;
+    is $k->total_out(), 0, "total_out() == 0" ;
+    my $GOT = '';
+    my $Z;
+    $Z = 1 ;#x 2000 ;
+    foreach (@Answer)
+    {
+        $status = $k->inflate($_, $Z) ;
+        $GOT .= $Z ;
+        last if $status == Z_STREAM_END or $status != Z_OK ;
+     
+    }
+     
+    cmp_ok $status, '==', Z_STREAM_END, "Got Z_STREAM_END" ;
+    is $GOT, $hello, "uncompressed data matches ok" ;
+    ok ! defined $k->msg(), "No error messages" ;
+    is $k->total_in(), length $Answer, "total_in ok" ;
+    is $k->total_out(), length $hello , "total_out ok";
 
-$text = join("", @text) ;
-
-ok(31, $fil = gzopen($name, "wb")) ;
-ok(32, $fil->gzwrite($text) == length $text) ;
-ok(33, ! $fil->gzclose ) ;
-
-# now try to read it back in
-ok(34, $fil = gzopen($name, "rb")) ;
-my $aok = 1 ; 
-my $remember = '';
-my $line = '';
-my $lines = 0 ;
-while ($fil->gzreadline($line) > 0) {
-    ($aok = 0), last
-       if $line ne $text[$lines] ;
-    $remember .= $line ;
-    ++ $lines ;
 }
-ok(35, $aok) ;
-ok(36, $remember eq $text) ;
-ok(37, $lines == @text) ;
-ok(38, ! $fil->gzclose ) ;
-unlink($name) ;
-
-# a text file with a very long line (bigger than the internal buffer)
-my $line1 = ("abcdefghijklmnopq" x 2000) . "\n" ;
-my $line2 = "second line\n" ;
-$text = $line1 . $line2 ;
-ok(39, $fil = gzopen($name, "wb")) ;
-ok(40, $fil->gzwrite($text) == length $text) ;
-ok(41, ! $fil->gzclose ) ;
-
-# now try to read it back in
-ok(42, $fil = gzopen($name, "rb")) ;
-my $i = 0 ;
-my @got = ();
-while ($fil->gzreadline($line) > 0) {
-    $got[$i] = $line ;    
-    ++ $i ;
-}
-ok(43, $i == 2) ;
-ok(44, $got[0] eq $line1 ) ;
-ok(45, $got[1] eq $line2) ;
-
-ok(46, ! $fil->gzclose ) ;
-
-unlink $name ;
 
-# a text file which is not termined by an EOL
 
-$line1 = "hello hello, I'm back again\n" ;
-$line2 = "there is no end in sight" ;
+{
+    # deflate/inflate - small buffer with a number
+    # ==============================
 
-$text = $line1 . $line2 ;
-ok(47, $fil = gzopen($name, "wb")) ;
-ok(48, $fil->gzwrite($text) == length $text) ;
-ok(49, ! $fil->gzclose ) ;
+    my $hello = 6529 ;
+    ok  my ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1, -AppendOutput => 1 ) ;
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
+    my $status;
+    my $Answer = '';
+     
+    cmp_ok $x->deflate($hello, $Answer), '==', Z_OK ;
+    
+    cmp_ok $x->flush($Answer), '==', Z_OK ;
+     
+    my @Answer = split('', $Answer) ;
+     
+    my $k;
+    ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}) );
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
+     
+    #my $GOT = '';
+    my $GOT ;
+    foreach (@Answer)
+    {
+        $status = $k->inflate($_, $GOT) ;
+        last if $status == Z_STREAM_END or $status != Z_OK ;
+     
+    }
+     
+    cmp_ok $status, '==', Z_STREAM_END ;
+    is $GOT, $hello ;
 
-# now try to read it back in
-ok(50, $fil = gzopen($name, "rb")) ;
-@got = () ; $i = 0 ;
-while ($fil->gzreadline($line) > 0) {
-    $got[$i] = $line ;    
-    ++ $i ;
 }
-ok(51, $i == 2) ;
-ok(52, $got[0] eq $line1 ) ;
-ok(53, $got[1] eq $line2) ;
-
-ok(54, ! $fil->gzclose ) ;
-
-unlink $name ;
 
+{
 
-# mix gzread and gzreadline <
-
-# case 1: read a line, then a block. The block is
-#         smaller than the internal block used by
-#        gzreadline
-$line1 = "hello hello, I'm back again\n" ;
-$line2 = "abc" x 200 ; 
-my $line3 = "def" x 200 ;
-
-$text = $line1 . $line2 . $line3 ;
-ok(55, $fil = gzopen($name, "wb")) ;
-ok(56, $fil->gzwrite($text) == length $text) ;
-ok(57, ! $fil->gzclose ) ;
-
-# now try to read it back in
-ok(58, $fil = gzopen($name, "rb")) ;
-ok(59, $fil->gzreadline($line) > 0) ;
-ok(60, $line eq $line1) ;
-ok(61, $fil->gzread($line, length $line2) > 0) ;
-ok(62, $line eq $line2) ;
-ok(63, $fil->gzread($line, length $line3) > 0) ;
-ok(64, $line eq $line3) ;
-ok(65, ! $fil->gzclose ) ;
-unlink $name ;
-
-# change $/ <<TODO
-
-
-
-# compress/uncompress tests
-# =========================
-
-$hello = "hello mum" ;
-my $keep_hello = $hello ;
-
-my $compr = compress($hello) ;
-ok(66, $compr ne "") ;
-
-my $keep_compr = $compr ;
-
-my $uncompr = uncompress ($compr) ;
-
-ok(67, $hello eq $uncompr) ;
-
-ok(68, $hello eq $keep_hello) ;
-ok(69, $compr eq $keep_compr) ;
-
-# compress a number
-$hello = 7890 ;
-$keep_hello = $hello ;
-
-$compr = compress($hello) ;
-ok(70, $compr ne "") ;
-
-$keep_compr = $compr ;
-
-$uncompr = uncompress ($compr) ;
-
-ok(71, $hello eq $uncompr) ;
-
-ok(72, $hello eq $keep_hello) ;
-ok(73, $compr eq $keep_compr) ;
-
-# bigger compress
-
-$compr = compress ($contents) ;
-ok(74, $compr ne "") ;
-
-$uncompr = uncompress ($compr) ;
-
-ok(75, $contents eq $uncompr) ;
-
-# buffer reference
-
-$compr = compress(\$hello) ;
-ok(76, $compr ne "") ;
-
-
-$uncompr = uncompress (\$compr) ;
-ok(77, $hello eq $uncompr) ;
-
-# bad level
-$compr = compress($hello, 1000) ;
-ok(78, ! defined $compr);
+# deflate/inflate options - AppendOutput
+# ================================
 
-# change level
-$compr = compress($hello, Z_BEST_COMPRESSION) ;
-ok(79, defined $compr);
-$uncompr = uncompress (\$compr) ;
-ok(80, $hello eq $uncompr) ;
+    # AppendOutput
+    # CRC
 
-# deflate/inflate - small buffer
-# ==============================
+    my $hello = "I am a HAL 9000 computer" ;
+    my @hello = split('', $hello) ;
+     
+    ok  my ($x, $err) = new Compress::Zlib::Deflate ( {-Bufsize => 1, -AppendOutput =>1} ) ;
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
+     
+    my $status;
+    my $X;
+    foreach (@hello)
+    {
+        $status = $x->deflate($_, $X) ;
+        last unless $status == Z_OK ;
+    }
+     
+    cmp_ok $status, '==', Z_OK ;
+     
+    cmp_ok $x->flush($X), '==', Z_OK ;
+     
+     
+    my @Answer = split('', $X) ;
+     
+    my $k;
+    ok(($k, $err) = new Compress::Zlib::Inflate( {-Bufsize => 1, -AppendOutput =>1}));
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
+     
+    my $Z;
+    foreach (@Answer)
+    {
+        $status = $k->inflate($_, $Z) ;
+        last if $status == Z_STREAM_END or $status != Z_OK ;
+     
+    }
+     
+    cmp_ok $status, '==', Z_STREAM_END ;
+    is $Z, $hello ;
+}
 
-$hello = "I am a HAL 9000 computer" ;
-my @hello = split('', $hello) ;
-my ($err, $X, $status);
-ok(81,  ($x, $err) = deflateInit( {-Bufsize => 1} ) ) ;
-ok(82, $x) ;
-ok(83, $err == Z_OK) ;
  
-my $Answer = '';
-foreach (@hello)
 {
-    ($X, $status) = $x->deflate($_) ;
-    last unless $status == Z_OK ;
 
-    $Answer .= $X ;
-}
-ok(84, $status == Z_OK) ;
+    title "deflate/inflate - larger buffer";
+    # ==============================
 
-ok(85,    (($X, $status) = $x->flush())[1] == Z_OK ) ;
-$Answer .= $X ;
-my @Answer = split('', $Answer) ;
-my $k;
-ok(86, ($k, $err) = inflateInit( {-Bufsize => 1}) ) ;
-ok(87, $k) ;
-ok(88, $err == Z_OK) ;
-my $GOT = '';
-my $Z;
-foreach (@Answer)
-{
-    ($Z, $status) = $k->inflate($_) ;
-    $GOT .= $Z ;
-    last if $status == Z_STREAM_END or $status != Z_OK ;
-}
+    # generate a long random string
+    my $contents = '' ;
+    foreach (1 .. 50000)
+      { $contents .= chr int rand 255 }
+    
+    
+    ok my ($x, $err) = new Compress::Zlib::Deflate() ;
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
+     
+    my (%X, $Y, %Z, $X, $Z);
+    #cmp_ok $x->deflate($contents, $X{key}), '==', Z_OK ;
+    cmp_ok $x->deflate($contents, $X), '==', Z_OK ;
+    
+    #$Y = $X{key} ;
+    $Y = $X ;
+     
+     
+    #cmp_ok $x->flush($X{key}), '==', Z_OK ;
+    #$Y .= $X{key} ;
+    cmp_ok $x->flush($X), '==', Z_OK ;
+    $Y .= $X ;
+     
+     
  
-ok(89, $status == Z_STREAM_END) ;
-ok(90, $GOT eq $hello ) ;
+    my $keep = $Y ;
 
+    my $k;
+    ok(($k, $err) = new Compress::Zlib::Inflate() );
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
+     
+    #cmp_ok $k->inflate($Y, $Z{key}), '==', Z_STREAM_END ;
+    #ok $contents eq $Z{key} ;
+    cmp_ok $k->inflate($Y, $Z), '==', Z_STREAM_END ;
+    ok $contents eq $Z ;
 
-# deflate/inflate - small buffer with a number
-# ==============================
+    # redo deflate with AppendOutput
 
-$hello = 6529 ;
-ok(91,  ($x, $err) = deflateInit( {-Bufsize => 1} ) ) ;
-ok(92, $x) ;
-ok(93, $err == Z_OK) ;
-$Answer = '';
-{
-    ($X, $status) = $x->deflate($hello) ;
+    ok (($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1)) ;
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
+    
+    my $s ; 
+    my $out ;
+    my @bits = split('', $keep) ;
+    foreach my $bit (@bits) {
+        $s = $k->inflate($bit, $out) ;
+    }
+    
+    cmp_ok $s, '==', Z_STREAM_END ;
+     
+    ok $contents eq $out ;
 
-    $Answer .= $X ;
-}
-ok(94, $status == Z_OK) ;
 
-ok(95,    (($X, $status) = $x->flush())[1] == Z_OK ) ;
-$Answer .= $X ;
-@Answer = split('', $Answer) ;
-ok(96, ($k, $err) = inflateInit( {-Bufsize => 1}) ) ;
-ok(97, $k) ;
-ok(98, $err == Z_OK) ;
-$GOT = '';
-foreach (@Answer)
-{
-    ($Z, $status) = $k->inflate($_) ;
-    $GOT .= $Z ;
-    last if $status == Z_STREAM_END or $status != Z_OK ;
 }
-ok(99, $status == Z_STREAM_END) ;
-ok(100, $GOT eq $hello ) ;
-
 
-# deflate/inflate - larger buffer
-# ==============================
+{
 
+    title "deflate/inflate - preset dictionary";
+    # ===================================
 
-ok(101, $x = deflateInit() ) ;
+    my $dictionary = "hello" ;
+    ok my $x = new Compress::Zlib::Deflate({-Level => Z_BEST_COMPRESSION,
+                            -Dictionary => $dictionary}) ;
  
-ok(102, (($X, $status) = $x->deflate($contents))[1] == Z_OK) ;
+    my $dictID = $x->dict_adler() ;
 
-my $Y = $X ;
-ok(103, (($X, $status) = $x->flush() )[1] == Z_OK ) ;
-$Y .= $X ;
-ok(104, $k = inflateInit() ) ;
+    my ($X, $Y, $Z);
+    cmp_ok $x->deflate($hello, $X), '==', Z_OK;
+    cmp_ok $x->flush($Y), '==', Z_OK;
+    $X .= $Y ;
  
-($Z, $status) = $k->inflate($Y) ;
+    ok my $k = new Compress::Zlib::Inflate(-Dictionary => $dictionary) ;
  
-ok(105, $status == Z_STREAM_END) ;
-ok(106, $contents eq $Z ) ;
+    cmp_ok $k->inflate($X, $Z), '==', Z_STREAM_END;
+    is $k->dict_adler(), $dictID;
+    is $hello, $Z ;
 
-# deflate/inflate - preset dictionary
-# ===================================
+}
 
-my $dictionary = "hello" ;
-ok(107, $x = deflateInit({-Level => Z_BEST_COMPRESSION,
-                        -Dictionary => $dictionary})) ;
-my $dictID = $x->dict_adler() ;
-
-($X, $status) = $x->deflate($hello) ;
-ok(108, $status == Z_OK) ;
-($Y, $status) = $x->flush() ;
-ok(109, $status == Z_OK) ;
-$X .= $Y ;
-$x = 0 ;
-ok(110, $k = inflateInit(-Dictionary => $dictionary) ) ;
-($Z, $status) = $k->inflate($X);
-ok(111, $status == Z_STREAM_END) ;
-ok(112, $k->dict_adler() == $dictID);
-ok(113, $hello eq $Z ) ;
-
-##ok(76, $k->inflateSetDictionary($dictionary) == Z_OK);
-# 
-#$Z='';
-#while (1) {
-#    ($Z, $status) = $k->inflate($X) ;
-#    last if $status == Z_STREAM_END or $status != Z_OK ;
-#print "status=[$status] hello=[$hello] Z=[$Z]\n";
-#}
-#ok(77, $status == Z_STREAM_END) ;
-#ok(78, $hello eq $Z ) ;
-#print "status=[$status] hello=[$hello] Z=[$Z]\n";
-#
-#
-## all done.
-#
-#
-#
-
-
-# inflate - check remaining buffer after Z_STREAM_END
+title 'inflate - check remaining buffer after Z_STREAM_END';
+#           and that ConsumeInput works.
 # ===================================================
  
+for my $consume ( 0 .. 1)
 {
-    ok(114, $x = deflateInit(-Level => Z_BEST_COMPRESSION )) ;
+    ok my $x = new Compress::Zlib::Deflate(-Level => Z_BEST_COMPRESSION ) ;
  
-    ($X, $status) = $x->deflate($hello) ;
-    ok(115, $status == Z_OK) ;
-    ($Y, $status) = $x->flush() ;
-    ok(116, $status == Z_OK) ;
+    my ($X, $Y, $Z);
+    cmp_ok $x->deflate($hello, $X), '==', Z_OK;
+    cmp_ok $x->flush($Y), '==', Z_OK;
     $X .= $Y ;
-    $x = 0 ;
  
-    ok(117, $k = inflateInit() ) ;
+    ok my $k = new Compress::Zlib::Inflate( -ConsumeInput => $consume) ;
  
     my $first = substr($X, 0, 2) ;
+    my $remember_first = $first ;
     my $last  = substr($X, 2) ;
-    ($Z, $status) = $k->inflate($first);
-    ok(118, $status == Z_OK) ;
-    ok(119, $first eq "") ;
+    cmp_ok $k->inflate($first, $Z), '==', Z_OK;
+    if ($consume) {
+        ok $first eq "" ;
+    }
+    else {
+        ok $first eq $remember_first ;
+    }
 
+    my $T ;
     $last .= "appendage" ;
-    my ($T, $status) = $k->inflate($last);
-    ok(120, $status == Z_STREAM_END) ;
-    ok(121, $hello eq $Z . $T ) ;
-    ok(122, $last eq "appendage") ;
-
-}
-
-# memGzip & memGunzip
-{
-    my $name = "test.gz" ;
-    my $buffer = <<EOM;
-some sample 
-text
-
-EOM
-
-    my $len = length $buffer ;
-    my ($x, $uncomp) ;
-
-
-    # create an in-memory gzip file
-    my $dest = Compress::Zlib::memGzip($buffer) ;
-    ok(123, length $dest) ;
-
-    # write it to disk
-    ok(124, open(FH, ">$name")) ;
-    binmode(FH);
-    print FH $dest ;
-    close FH ;
-
-    # uncompress with gzopen
-    ok(125, my $fil = gzopen($name, "rb") ) ;
-    ok(126, ($x = $fil->gzread($uncomp)) == $len) ;
-    ok(127, ! $fil->gzclose ) ;
-
-    ok(128, $uncomp eq $buffer) ;
-    unlink $name ;
-
-    # now check that memGunzip can deal with it.
-    my $ungzip = Compress::Zlib::memGunzip($dest) ;
-    ok(129, defined $ungzip) ;
-    ok(130, $buffer eq $ungzip) ;
-    # now do the same but use a reference 
-
-    $dest = Compress::Zlib::memGzip(\$buffer) ; 
-    ok(131, length $dest) ;
-
-    # write it to disk
-    ok(132, open(FH, ">$name")) ;
-    binmode(FH);
-    print FH $dest ;
-    close FH ;
-
-    # uncompress with gzopen
-    ok(133, $fil = gzopen($name, "rb") ) ;
-    ok(134, ($x = $fil->gzread($uncomp)) == $len) ;
-    ok(135, ! $fil->gzclose ) ;
-
-    ok(136, $uncomp eq $buffer) ;
-    # now check that memGunzip can deal with it.
-    my $keep = $dest;
-    $ungzip = Compress::Zlib::memGunzip(\$dest) ;
-    ok(137, defined $ungzip) ;
-    ok(138, $buffer eq $ungzip) ;
-
-    # check memGunzip can cope with missing gzip trailer
-    my $minimal = substr($keep, 0, -1) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(139, defined $ungzip) ;
-    ok(140, $buffer eq $ungzip) ;
-
-    $minimal = substr($keep, 0, -2) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(141, defined $ungzip) ;
-    ok(142, $buffer eq $ungzip) ;
-
-    $minimal = substr($keep, 0, -3) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(143, defined $ungzip) ;
-    ok(144, $buffer eq $ungzip) ;
-
-    $minimal = substr($keep, 0, -4) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(145, defined $ungzip) ;
-    ok(146, $buffer eq $ungzip) ;
-
-    $minimal = substr($keep, 0, -5) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(147, defined $ungzip) ;
-    ok(148, $buffer eq $ungzip) ;
-
-    $minimal = substr($keep, 0, -6) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(149, defined $ungzip) ;
-    ok(150, $buffer eq $ungzip) ;
-
-    $minimal = substr($keep, 0, -7) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(151, defined $ungzip) ;
-    ok(152, $buffer eq $ungzip) ;
-
-    $minimal = substr($keep, 0, -8) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(153, defined $ungzip) ;
-    ok(154, $buffer eq $ungzip) ;
-
-    $minimal = substr($keep, 0, -9) ;
-    $ungzip = Compress::Zlib::memGunzip(\$minimal) ;
-    ok(155, ! defined $ungzip) ;
-
-    unlink $name ;
-
-    # check corrupt header -- too short
-    $dest = "x" ;
-    my $result = Compress::Zlib::memGunzip($dest) ;
-    ok(156, !defined $result) ;
+    my $remember_last = $last ;
+    cmp_ok $k->inflate($last, $T),  '==', Z_STREAM_END;
+    is $hello, $Z . $T  ;
+    if ($consume) {
+        is $last, "appendage" ;
+    }
+    else {
+        is $last, $remember_last ;
+    }
 
-    # check corrupt header -- full of junk
-    $dest = "x" x 200 ;
-    $result = Compress::Zlib::memGunzip($dest) ;
-    ok(157, !defined $result) ;
 }
 
-# memGunzip with a gzopen created file
-{
-    my $name = "test.gz" ;
-    my $buffer = <<EOM;
-some sample 
-text
-
-EOM
-
-    ok(158, $fil = gzopen($name, "wb")) ;
 
-    ok(159, $fil->gzwrite($buffer) == length $buffer) ;
-
-    ok(160, ! $fil->gzclose ) ;
-
-    my $compr = readFile($name);
-    ok(161, length $compr) ;
-    my $unc = Compress::Zlib::memGunzip($compr) ;
-    ok(162, defined $unc) ;
-    ok(163, $buffer eq $unc) ;
-    unlink $name ;
-}
 
 {
 
-    # Check - MAX_WBITS
+    title 'Check - MAX_WBITS';
     # =================
     
-    $hello = "Test test test test test";
-    @hello = split('', $hello) ;
-     
-    ok(164,  ($x, $err) = deflateInit( -Bufsize => 1, -WindowBits => -MAX_WBITS() ) ) ;
-    ok(165, $x) ;
-    ok(166, $err == Z_OK) ;
-     
-    $Answer = '';
+    my $hello = "Test test test test test";
+    my @hello = split('', $hello) ;
+     
+    ok  my ($x, $err) = 
+       new Compress::Zlib::Deflate ( -Bufsize => 1, 
+                                     -WindowBits => -MAX_WBITS(),
+                                     -AppendOutput => 1 ) ;
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
+
+    my $Answer = '';
+    my $status;
     foreach (@hello)
     {
-        ($X, $status) = $x->deflate($_) ;
+        $status = $x->deflate($_, $Answer) ;
         last unless $status == Z_OK ;
-    
-        $Answer .= $X ;
     }
      
-    ok(167, $status == Z_OK) ;
+    cmp_ok $status, '==', Z_OK ;
     
-    ok(168,    (($X, $status) = $x->flush())[1] == Z_OK ) ;
-    $Answer .= $X ;
+    cmp_ok $x->flush($Answer), '==', Z_OK ;
      
-     
-    @Answer = split('', $Answer) ;
+    my @Answer = split('', $Answer) ;
     # Undocumented corner -- extra byte needed to get inflate to return 
     # Z_STREAM_END when done.  
     push @Answer, " " ; 
      
-    ok(169, ($k, $err) = inflateInit(-Bufsize => 1, -WindowBits => -MAX_WBITS()) ) ;
-    ok(170, $k) ;
-    ok(171, $err == Z_OK) ;
+    my $k;
+    ok(($k, $err) = new Compress::Zlib::Inflate( 
+                       {-Bufsize => 1, 
+                       -AppendOutput =>1,
+                       -WindowBits => -MAX_WBITS()})) ;
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
      
-    $GOT = '';
+    my $GOT = '';
     foreach (@Answer)
     {
-        ($Z, $status) = $k->inflate($_) ;
-        $GOT .= $Z ;
+        $status = $k->inflate($_, $GOT) ;
         last if $status == Z_STREAM_END or $status != Z_OK ;
      
     }
      
-    ok(172, $status == Z_STREAM_END) ;
-    ok(173, $GOT eq $hello ) ;
+    cmp_ok $status, '==', Z_STREAM_END ;
+    is $GOT, $hello ;
     
 }
 
 {
-    # inflateSync
+    title 'inflateSync';
 
     # create a deflate stream with flush points
 
     my $hello = "I am a HAL 9000 computer" x 2001 ;
     my $goodbye = "Will I dream?" x 2010;
-    my ($err, $answer, $X, $status, $Answer);
+    my ($x, $err, $answer, $X, $Z, $status);
+    my $Answer ;
      
-    ok(174, ($x, $err) = deflateInit() ) ;
-    ok(175, $x) ;
-    ok(176, $err == Z_OK) ;
+    #use Devel::Peek ;
+    ok(($x, $err) = new Compress::Zlib::Deflate(AppendOutput => 1)) ;
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
      
-    ($Answer, $status) = $x->deflate($hello) ;
-    ok(177, $status == Z_OK) ;
+    cmp_ok $x->deflate($hello, $Answer), '==', Z_OK;
     
     # create a flush point
-    ok(178, (($X, $status) = $x->flush(Z_FULL_FLUSH))[1] == Z_OK ) ;
-    $Answer .= $X ;
+    cmp_ok $x->flush($Answer, Z_FULL_FLUSH), '==', Z_OK ;
      
-    ($X, $status) = $x->deflate($goodbye) ;
-    ok(179, $status == Z_OK) ;
-    $Answer .= $X ;
+    cmp_ok $x->deflate($goodbye, $Answer), '==', Z_OK;
     
-    ok(180, (($X, $status) = $x->flush())[1] == Z_OK ) ;
-    $Answer .= $X ;
+    cmp_ok $x->flush($Answer), '==', Z_OK ;
      
     my ($first, @Answer) = split('', $Answer) ;
      
     my $k;
-    ok(181, ($k, $err) = inflateInit()) ;
-    ok(182, $k) ;
-    ok(183, $err == Z_OK) ;
+    ok(($k, $err) = new Compress::Zlib::Inflate()) ;
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
      
-    ($Z, $status) = $k->inflate($first) ;
-    ok(184, $status == Z_OK) ;
+    cmp_ok  $k->inflate($first, $Z), '==', Z_OK;
 
     # skip to the first flush point.
     while (@Answer)
@@ -733,189 +458,355 @@ EOM
         my $byte = shift @Answer;
         $status = $k->inflateSync($byte) ;
         last unless $status == Z_DATA_ERROR;
-     
     }
 
-    ok(185, $status == Z_OK);
+    cmp_ok $status, '==', Z_OK;
      
     my $GOT = '';
-    my $Z = '';
     foreach (@Answer)
     {
         my $Z = '';
-        ($Z, $status) = $k->inflate($_) ;
+        $status = $k->inflate($_, $Z) ;
         $GOT .= $Z if defined $Z ;
         # print "x $status\n";
         last if $status == Z_STREAM_END or $status != Z_OK ;
      
     }
      
-    # zlib 1.0.9 returns Z_STREAM_END here, all others return Z_DATA_ERROR
-    ok(186, $status == Z_DATA_ERROR || $status == Z_STREAM_END) ;
-    ok(187, $GOT eq $goodbye ) ;
+    cmp_ok $status, '==', Z_DATA_ERROR ;
+    is $GOT, $goodbye ;
 
 
     # Check inflateSync leaves good data in buffer
-    $Answer =~ /^(.)(.*)$/ ;
-    my ($initial, $rest) = ($1, $2);
+    my $rest = $Answer ;
+    $rest =~ s/^(.)//;
+    my $initial = $1 ;
 
     
-    ok(188, ($k, $err) = inflateInit()) ;
-    ok(189, $k) ;
-    ok(190, $err == Z_OK) ;
+    ok(($k, $err) = new Compress::Zlib::Inflate(-ConsumeInput => 0)) ;
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
      
-    ($Z, $status) = $k->inflate($initial) ;
-    ok(191, $status == Z_OK) ;
+    cmp_ok $k->inflate($initial, $Z), '==', Z_OK;
 
-    $status = $k->inflateSync($rest) ;
-    ok(192, $status == Z_OK);
-     
-    ($GOT, $status) = $k->inflate($rest) ;
+    # Skip to the flush point
+    $status = $k->inflateSync($rest);
+    cmp_ok $status, '==', Z_OK
+     or diag "status '$status'\nlength rest is " . length($rest) . "\n" ;
      
-    ok(193, $status == Z_DATA_ERROR) ;
-    ok(194, $Z . $GOT eq $goodbye ) ;
+    cmp_ok $k->inflate($rest, $GOT), '==', Z_DATA_ERROR;
+    is $Z . $GOT, $goodbye ;
 }
 
 {
-    # deflateParams
+    title 'deflateParams';
 
     my $hello = "I am a HAL 9000 computer" x 2001 ;
     my $goodbye = "Will I dream?" x 2010;
-    my ($input, $err, $answer, $X, $status, $Answer);
+    my ($x, $input, $err, $answer, $X, $status, $Answer);
      
-    ok(195, ($x, $err) = deflateInit(-Level    => Z_BEST_COMPRESSION,
-                                     -Strategy => Z_DEFAULT_STRATEGY) ) ;
-    ok(196, $x) ;
-    ok(197, $err == Z_OK) ;
+    ok(($x, $err) = new Compress::Zlib::Deflate(
+                       -AppendOutput   => 1,
+                       -Level    => Z_DEFAULT_COMPRESSION,
+                       -Strategy => Z_DEFAULT_STRATEGY)) ;
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
 
-    ok(198, $x->get_Level()    == Z_BEST_COMPRESSION);
-    ok(199, $x->get_Strategy() == Z_DEFAULT_STRATEGY);
+    ok $x->get_Level()    == Z_DEFAULT_COMPRESSION;
+    ok $x->get_Strategy() == Z_DEFAULT_STRATEGY;
      
-    ($Answer, $status) = $x->deflate($hello) ;
-    ok(200, $status == Z_OK) ;
+    $status = $x->deflate($hello, $Answer) ;
+    cmp_ok $status, '==', Z_OK ;
     $input .= $hello;
     
     # error cases
     eval { $x->deflateParams() };
-    ok(201, $@ =~ m#^deflateParams needs Level and/or Strategy#);
+    like $@, mkErr('^Compress::Zlib::deflateParams needs Level and\/or Strategy');
+
+    eval { $x->deflateParams(-Bufsize => 0) };
+    like $@, mkErr('^Compress::Zlib::Inflate::deflateParams: Bufsize must be >= 1, you specified 0');
 
     eval { $x->deflateParams(-Joe => 3) };
-    ok(202, $@ =~ /^unknown key value\(s\) Joe at/);
+    like $@, mkErr('^Compress::Zlib::deflateStream::deflateParams: unknown key value\(s\) Joe');
 
-    ok(203, $x->get_Level()    == Z_BEST_COMPRESSION);
-    ok(204, $x->get_Strategy() == Z_DEFAULT_STRATEGY);
+    is $x->get_Level(),    Z_DEFAULT_COMPRESSION;
+    is $x->get_Strategy(), Z_DEFAULT_STRATEGY;
      
     # change both Level & Strategy
-    $status = $x->deflateParams(-Level => Z_BEST_SPEED, -Strategy => Z_HUFFMAN_ONLY) ;
-    ok(205, $status == Z_OK) ;
+    $status = $x->deflateParams(-Level => Z_BEST_SPEED, -Strategy => Z_HUFFMAN_ONLY, -Bufsize => 1234) ;
+    cmp_ok $status, '==', Z_OK ;
     
-    ok(206, $x->get_Level()    == Z_BEST_SPEED);
-    ok(207, $x->get_Strategy() == Z_HUFFMAN_ONLY);
+    is $x->get_Level(),    Z_BEST_SPEED;
+    is $x->get_Strategy(), Z_HUFFMAN_ONLY;
      
-    ($X, $status) = $x->deflate($goodbye) ;
-    ok(208, $status == Z_OK) ;
-    $Answer .= $X ;
+    $status = $x->deflate($goodbye, $Answer) ;
+    cmp_ok $status, '==', Z_OK ;
     $input .= $goodbye;
     
     # change only Level 
     $status = $x->deflateParams(-Level => Z_NO_COMPRESSION) ;
-    ok(209, $status == Z_OK) ;
+    cmp_ok $status, '==', Z_OK ;
     
-    ok(210, $x->get_Level()    == Z_NO_COMPRESSION);
-    ok(211, $x->get_Strategy() == Z_HUFFMAN_ONLY);
+    is $x->get_Level(),    Z_NO_COMPRESSION;
+    is $x->get_Strategy(), Z_HUFFMAN_ONLY;
      
-    ($X, $status) = $x->deflate($goodbye) ;
-    ok(212, $status == Z_OK) ;
-    $Answer .= $X ;
+    $status = $x->deflate($goodbye, $Answer) ;
+    cmp_ok $status, '==', Z_OK ;
     $input .= $goodbye;
     
     # change only Strategy
     $status = $x->deflateParams(-Strategy => Z_FILTERED) ;
-    ok(213, $status == Z_OK) ;
+    cmp_ok $status, '==', Z_OK ;
     
-    ok(214, $x->get_Level()    == Z_NO_COMPRESSION);
-    ok(215, $x->get_Strategy() == Z_FILTERED);
+    is $x->get_Level(),    Z_NO_COMPRESSION;
+    is $x->get_Strategy(), Z_FILTERED;
      
-    ($X, $status) = $x->deflate($goodbye) ;
-    ok(216, $status == Z_OK) ;
-    $Answer .= $X ;
+    $status = $x->deflate($goodbye, $Answer) ;
+    cmp_ok $status, '==', Z_OK ;
     $input .= $goodbye;
     
-    ok(217, (($X, $status) = $x->flush())[1] == Z_OK ) ;
-    $Answer .= $X ;
-     
-    my ($first, @Answer) = split('', $Answer) ;
+    cmp_ok $x->flush($Answer), '==', Z_OK ;
      
     my $k;
-    ok(218, ($k, $err) = inflateInit()) ;
-    ok(219, $k) ;
-    ok(220, $err == Z_OK) ;
+    ok(($k, $err) = new Compress::Zlib::Inflate()) ;
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
      
-    ($Z, $status) = $k->inflate($Answer) ;
+    my $Z;
+    $status = $k->inflate($Answer, $Z) ;
 
-    ok(221, $status == Z_STREAM_END) ;
-    ok(222, $Z  eq $input ) ;
+    cmp_ok $status, '==', Z_STREAM_END ;
+    is $Z, $input ;
 }
 
+
 {
-    # error cases
+    title "ConsumeInput and a read-only buffer trapped" ;
+
+    ok my $k = new Compress::Zlib::Inflate(-ConsumeInput => 1) ;
+     
+    my $Z; 
+    eval { $k->inflate("abc", $Z) ; };
+    like $@, mkErr("Compress::Zlib::Inflate::inflate input parameter cannot be read-only when ConsumeInput is specified");
+
+}
 
-    eval { deflateInit(-Level) };
-    ok(223, $@ =~ /^Compress::Zlib::deflateInit: parameter is not a reference to a hash at/);
+foreach (1 .. 2)
+{
+    next if $[ < 5.005 ;
 
-    eval { inflateInit(-Level) };
-    ok(224, $@ =~ /^Compress::Zlib::inflateInit: parameter is not a reference to a hash at/);
+    title 'test inflate/deflate with a substr';
 
-    eval { deflateInit(-Joe => 1) };
-    ok(225, $@ =~ /^unknown key value\(s\) Joe at/);
+    my $contents = '' ;
+    foreach (1 .. 5000)
+      { $contents .= chr int rand 255 }
+    ok  my $x = new Compress::Zlib::Deflate(-AppendOutput => 1) ;
+     
+    my $X ;
+    my $status = $x->deflate(substr($contents,0), $X);
+    cmp_ok $status, '==', Z_OK ;
+    
+    cmp_ok $x->flush($X), '==', Z_OK  ;
+     
+    my $append = "Appended" ;
+    $X .= $append ;
+     
+    ok my $k = new Compress::Zlib::Inflate(-AppendOutput => 1) ;
+     
+    my $Z; 
+    my $keep = $X ;
+    $status = $k->inflate(substr($X, 0), $Z) ;
+     
+    cmp_ok $status, '==', Z_STREAM_END ;
+    #print "status $status X [$X]\n" ;
+    is $contents, $Z ;
+    ok $X eq $append;
+    #is length($X), length($append);
+    #ok $X eq $keep;
+    #is length($X), length($keep);
+}
+
+title 'Looping Append test - checks that deRef_l resets the output buffer';
+foreach (1 .. 2)
+{
 
-    eval { inflateInit(-Joe => 1) };
-    ok(226, $@ =~ /^unknown key value\(s\) Joe at/);
+    my $hello = "I am a HAL 9000 computer" ;
+    my @hello = split('', $hello) ;
+    my ($err, $x, $X, $status); 
+    ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1 ) );
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
+    $X = "" ;
+    my $Answer = '';
+    foreach (@hello)
+    {
+        $status = $x->deflate($_, $X) ;
+        last unless $status == Z_OK ;
+    
+        $Answer .= $X ;
+    }
+     
+    cmp_ok $status, '==', Z_OK ;
+    
+    cmp_ok  $x->flush($X), '==', Z_OK ;
+    $Answer .= $X ;
+     
+    my @Answer = split('', $Answer) ;
+     
+    my $k;
+    ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
+    my $GOT ;
+    my $Z;
+    $Z = 1 ;#x 2000 ;
+    foreach (@Answer)
+    {
+        $status = $k->inflate($_, $GOT) ;
+        last if $status == Z_STREAM_END or $status != Z_OK ;
+    }
+     
+    cmp_ok $status, '==', Z_STREAM_END ;
+    is $GOT, $hello ;
 
-    eval { deflateInit(-Bufsize => 0) };
-    ok(227, $@ =~ /^.*?: Bufsize must be >= 1, you specified 0 at/);
+}
 
-    eval { inflateInit(-Bufsize => 0) };
-    ok(228, $@ =~ /^.*?: Bufsize must be >= 1, you specified 0 at/);
+if ($] >= 5.005)
+{
+    title 'test inflate input parameter via substr';
 
-    eval { deflateInit(-Bufsize => -1) };
-    ok(229, $@ =~ /^.*?: Bufsize must be >= 1, you specified -1 at/);
+    my $hello = "I am a HAL 9000 computer" ;
+    my $data = $hello ;
 
-    eval { inflateInit(-Bufsize => -1) };
-    ok(230, $@ =~ /^.*?: Bufsize must be >= 1, you specified -1 at/);
+    my($X, $Z);
 
-    eval { deflateInit(-Bufsize => "xxx") };
-    ok(231, $@ =~ /^.*?: Bufsize must be >= 1, you specified xxx at/);
+    ok my $x = new Compress::Zlib::Deflate ( -AppendOutput => 1 );
 
-    eval { inflateInit(-Bufsize => "xxx") };
-    ok(232, $@ =~ /^.*?: Bufsize must be >= 1, you specified xxx at/);
+    cmp_ok $x->deflate($data, $X), '==',  Z_OK ;
 
+    cmp_ok $x->flush($X), '==', Z_OK ;
+     
+    my $append = "Appended" ;
+    $X .= $append ;
+    my $keep = $X ;
+     
+    ok my $k = new Compress::Zlib::Inflate ( -AppendOutput => 1,
+                                             -ConsumeInput => 1 ) ;
+     
+#    cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
+    cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
+     
+    ok $hello eq $Z ;
+    is $X, $append;
+    
+    $X = $keep ;
+    $Z = '';
+    ok $k = new Compress::Zlib::Inflate ( -AppendOutput => 1,
+                                          -ConsumeInput => 0 ) ;
+     
+    cmp_ok $k->inflate(substr($X, 0, -1), $Z), '==', Z_STREAM_END ; ;
+    #cmp_ok $k->inflate(substr($X, 0), $Z), '==', Z_STREAM_END ; ;
+     
+    ok $hello eq $Z ;
+    is $X, $keep;
+    
 }
 
+exit if $] < 5.006 ;
+
+title 'Looping Append test with substr output - substr the end of the string';
+foreach (1 .. 2)
 {
-    # test inflate with a substr
 
-    ok(233, my $x = deflateInit() ) ;
+    my $hello = "I am a HAL 9000 computer" ;
+    my @hello = split('', $hello) ;
+    my ($err, $x, $X, $status); 
+    ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1,
+                                            -AppendOutput => 1 ) );
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
+    $X = "" ;
+    my $Answer = '';
+    foreach (@hello)
+    {
+        $status = $x->deflate($_, substr($Answer, length($Answer))) ;
+        last unless $status == Z_OK ;
+    
+    }
      
-    ok(234, (my ($X, $status) = $x->deflate($contents))[1] == Z_OK) ;
+    cmp_ok $status, '==', Z_OK ;
     
-    my $Y = $X ;
-
+    cmp_ok  $x->flush(substr($Answer, length($Answer))), '==', Z_OK ;
      
+    my @Answer = split('', $Answer) ;
      
-    ok(235, (($X, $status) = $x->flush() )[1] == Z_OK ) ;
-    $Y .= $X ;
+    my $k;
+    ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
+    my $GOT = '';
+    my $Z;
+    $Z = 1 ;#x 2000 ;
+    foreach (@Answer)
+    {
+        $status = $k->inflate($_, substr($GOT, length($GOT))) ;
+        last if $status == Z_STREAM_END or $status != Z_OK ;
+    }
      
-    my $append = "Appended" ;
-    $Y .= $append ;
+    cmp_ok $status, '==', Z_STREAM_END ;
+    is $GOT, $hello ;
+
+}
+
+title 'Looping Append test with substr output - substr the complete string';
+foreach (1 .. 2)
+{
+
+    my $hello = "I am a HAL 9000 computer" ;
+    my @hello = split('', $hello) ;
+    my ($err, $x, $X, $status); 
+    ok( ($x, $err) = new Compress::Zlib::Deflate ( -Bufsize => 1,
+                                            -AppendOutput => 1 ) );
+    ok $x ;
+    cmp_ok $err, '==', Z_OK ;
+    $X = "" ;
+    my $Answer = '';
+    foreach (@hello)
+    {
+        $status = $x->deflate($_, substr($Answer, 0)) ;
+        last unless $status == Z_OK ;
+    
+    }
+     
+    cmp_ok $status, '==', Z_OK ;
+    
+    cmp_ok  $x->flush(substr($Answer, 0)), '==', Z_OK ;
      
-    ok(236, $k = inflateInit() ) ;
+    my @Answer = split('', $Answer) ;
      
-    ($Z, $status) = $k->inflate(substr($Y, 0, -1)) ;
+    my $k;
+    ok(($k, $err) = new Compress::Zlib::Inflate(-AppendOutput => 1) );
+    ok $k ;
+    cmp_ok $err, '==', Z_OK ;
+    my $GOT = '';
+    my $Z;
+    $Z = 1 ;#x 2000 ;
+    foreach (@Answer)
+    {
+        $status = $k->inflate($_, substr($GOT, 0)) ;
+        last if $status == Z_STREAM_END or $status != Z_OK ;
+    }
      
-    ok(237, $status == Z_STREAM_END) ;
-    #print "status $status Y [$Y]\n" ;
-    ok(238, $contents eq $Z ) ;
-    ok(239, $Y eq $append);
-    
+    cmp_ok $status, '==', Z_STREAM_END ;
+    is $GOT, $hello ;
 }
+