1BEGIN {
2    if ($ENV{PERL_CORE}) {
3	chdir 't' if -d 't';
4	@INC = ("../lib", "lib/compress");
5    }
6}
7
8use lib qw(t t/compress);
9use strict;
10use warnings;
11use bytes;
12
13use Test::More ;
14use CompTestUtils;
15
16BEGIN
17{
18    # use Test::NoWarnings, if available
19    my $extra = 0 ;
20    $extra = 1
21        if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };
22
23    plan tests => 88 + $extra ;
24
25    use_ok('Compress::Raw::Bzip2') ;
26}
27
28
29
30my $hello = "I am a HAL 9000 computer" x 2001;
31my $tmp = $hello ;
32
33my ($err, $x, $X, $status);
34
35ok( ($x, $err) = new Compress::Raw::Bzip2 (1));
36ok $x ;
37cmp_ok $err, '==', BZ_OK, "  status is BZ_OK" ;
38
39my $out ;
40$status = $x->bzdeflate($tmp, $out) ;
41cmp_ok $status, '==', BZ_RUN_OK, "  status is BZ_RUN_OK" ;
42
43cmp_ok $x->bzclose($out), '==', BZ_STREAM_END, "  bzflush returned BZ_STREAM_END" ;
44
45{
46    my $t = $out;
47    my $b = new Compress::Raw::Bunzip2(0,0);
48
49    my $GOT;
50    my $status = $b->bzinflate($t, $GOT) ;
51    cmp_ok $status, "==", BZ_STREAM_END;
52    ok $GOT eq $hello;
53
54}
55
56sub getOut { my $x = ''; return \$x }
57
58for my $bufsize (1, 2, 3, 13, 4096, 1024*10)
59{
60    print "#\n#Bufsize $bufsize\n#\n";
61    $tmp = $out;
62
63    my $k;
64    ok(($k, $err) = new Compress::Raw::Bunzip2( 1,1,0,0,1
65                                                      #AppendOutput => 1,
66                                                      #LimitOutput => 1,
67                                                      #Bufsize => $bufsize
68                                                    ));
69    ok $k ;
70    cmp_ok $err, '==', BZ_OK, "  status is BZ_OK" ;
71
72    is $k->total_in_lo32(), 0, "  total_in_lo32 == 0" ;
73    is $k->total_out_lo32(), 0, "  total_out_lo32 == 0" ;
74    my $GOT = getOut();
75    my $prev;
76    my $deltaOK = 1;
77    my $looped = 0;
78    while (length $tmp)
79    {
80        ++ $looped;
81        my $prev = length $GOT;
82        $status = $k->bzinflate($tmp, $GOT) ;
83        last if $status != BZ_OK;
84        $deltaOK = 0 if length($GOT) - $prev > $bufsize;
85    }
86
87    ok $deltaOK, "  Output Delta never > $bufsize";
88    cmp_ok $looped, '>=', 1, "  looped $looped";
89    is length($tmp), 0, "  length of input buffer is zero";
90
91    cmp_ok $status, "==", BZ_STREAM_END, "  status is BZ_STREAM_END" ;
92    ok $$GOT eq $hello, "  got expected output" ;
93    is $k->total_in_lo32(), length $out, "  length total_in_lo32 ok" ;
94    is $k->total_out_lo32(), length $hello, "  length total_out_lo32 ok " .  $k->total_out_lo32() ;
95}
96
97sub getit
98{
99    my $obj = shift ;
100    my $input = shift;
101
102    my $data ;
103    1 while $obj->bzinflate($input, $data) != BZ_STREAM_END ;
104    return \$data ;
105}
106
107{
108    title "regression test";
109
110    my ($err, $x, $X, $status);
111
112    ok( ($x, $err) = new Compress::Raw::Bzip2 (1));
113    ok $x ;
114    cmp_ok $err, '==', BZ_OK, "  status is BZ_OK" ;
115
116    my $line1 = ("abcdefghijklmnopq" x 1000) . "\n" ;
117    my $line2 = "second line\n" ;
118    my $text = $line1 . $line2 ;
119    my $tmp = $text;
120
121    my $out ;
122    $status = $x->bzdeflate($tmp, $out) ;
123    cmp_ok $status, '==', BZ_RUN_OK, "  status is BZ_RUN_OK" ;
124
125    cmp_ok $x->bzclose($out), '==', BZ_STREAM_END, "  bzclose returned BZ_STREAM_END" ;
126
127    my $k;
128    ok(($k, $err) = new Compress::Raw::Bunzip2( 1,1,0,0,1
129            #AppendOutput => 1,
130            #LimitOutput => 1
131                                                    ));
132
133
134    my $c = getit($k, $out);
135    is $$c, $text;
136
137
138}
139
140