summaryrefslogtreecommitdiff
path: root/t/082-stream.t
diff options
context:
space:
mode:
Diffstat (limited to 't/082-stream.t')
-rw-r--r--t/082-stream.t137
1 files changed, 137 insertions, 0 deletions
diff --git a/t/082-stream.t b/t/082-stream.t
new file mode 100644
index 0000000..28581f2
--- /dev/null
+++ b/t/082-stream.t
@@ -0,0 +1,137 @@
+# -*- mode: perl -*-
+
+##
+## this is the 03stream.t test from Compress::Bzip2 1.03 with no changes
+## (except for comments)
+##
+## - seems to run a lot slower than the 1.03 test, probably because the add
+## routine is now perl, not perlxs.
+##
+
+# streaming test
+
+use strict;
+use Test::More tests => 208;
+
+use Compress::Bzip2 qw(compress_init decompress_init decompress);
+
+# globals
+
+my $Level = 1;
+my @AlNum = ('A'..'Z','a'..'z','0'..'9',' ');
+my ($In,$Out) = (0,0);
+my $Prefix = 0;
+
+
+# subs
+
+sub try {
+ my ($str,$chunk,$inc) = @_;
+ $chunk ||= 100;
+ $inc ||= 0;
+
+ my $stream = compress_init();
+
+ # piece it into chunks and feed it to the monster
+ my ($size,$pos,$out,$done,$status,$orig) = ($chunk,0,'');
+ for(;;) {
+ if($pos > length $str) {
+ $status = $stream->finish();
+ $done = 1;
+ } else {
+ my $piece = substr $str,$pos,$size;
+ $pos += $size;
+ $size += $inc;
+ $status = $stream->add($piece);
+ }
+ return 0 if not defined $status;
+ $out .= $status;
+ last if $done;
+ }
+
+ # see if we can get it back
+ if($Prefix) {
+ $orig = decompress($stream->prefix().$out);
+ } else {
+ $stream = decompress_init();
+
+ ($size,$pos,$orig,$done) = ($chunk,0,'');
+ for(;;) {
+ if($pos > length $out) {
+ $status = $stream->finish();
+ $done = 1;
+ } else {
+ my $piece = substr $out,$pos,$size;
+ $pos += $size;
+ $size += $inc;
+ $status = $stream->add($piece);
+ }
+ return 0 if not defined $status;
+ $orig .= $status;
+ last if $done;
+ }
+ }
+
+ $In += length $orig;
+ $Out += length $out;
+ return $orig eq $str ? 1 : 0;
+}
+
+
+# tests
+
+# some short strings
+
+my $sum;
+ok(try(''),'empty string');
+pass('undef');
+$sum = 0;
+$sum += try($_) for @AlNum;
+is($sum,scalar(@AlNum),'alphanumerics');
+ok(try('FOO'),'FOO');
+ok(try('bar'),'bar');
+ok(try(' '),'spaces');
+
+# references are supposed to work too
+
+my $str = 'reference test';
+$sum = 0;
+for(1..5) {
+ $str = \$str;
+ $sum += try($str);
+}
+is($sum,5,'reference tests');
+
+# random strings
+
+$sum = 0;
+for my $random(1..100) {
+ $Level = 9 if 80 == $random;
+ my $str = '';
+ $str .= $AlNum[rand @AlNum] for 1..rand 100;
+ $sum += try($str);
+}
+is($sum,100,'100 random strings');
+
+# long strings with repetition
+
+($In,$Out) = (0,0);
+for my $random(1..100) {
+ $Level = 1 if 20 == $random;
+ my $str = '';
+ $str .= ($AlNum[rand @AlNum] x rand 1000) for 1..100+rand 900;
+ ok(try($str),"long string $random");
+}
+#diag(sprintf "compression ratio %.2f%%",100*$Out/$In);
+
+# binary strings
+
+($In,$Out) = (0,0);
+for my $random(1..100) {
+ $Level = 9 if 80 == $random;
+ my $str = '';
+ $str .= chr(rand 256) for 1..1000+rand 9000;
+ ok(try($str),"binary string $random");
+}
+#diag(sprintf "compression ratio %.2f%%",100*$Out/$In);
+