
use lib 't';
 
use strict;
use warnings;
use bytes;

use Test::More ;
use CompTestUtils;

BEGIN {
    # use Test::NoWarnings, if available
    my $extra = 0 ;
    $extra = 1
        if eval { require Test::NoWarnings ;  import Test::NoWarnings; 1 };

    plan tests => 48 + $extra ;

}

sub run
{
    my $CompressClass   = identify();
    my $AnyClass        = getClass();
    my $UncompressClass = getInverse($CompressClass);
    my $Error           = getErrorRef($CompressClass);
    my $UnError         = getErrorRef($UncompressClass);

    my @anyUnLz = ();
    @anyUnLz = (UnLzma => 1 ) if $CompressClass =~ /lzma/i ;

    my $AnyConstruct = "IO::Uncompress::${AnyClass}" ;
    no strict 'refs';
    my $AnyError = \${ "IO::Uncompress::${AnyClass}::${AnyClass}Error" };

    for my $trans ( 0, 1 )
    {
        for my $file ( 0, 1 )
        {
            title "$AnyClass(Transparent => $trans, File=>$file) with $CompressClass" ;
            my $string = "some text" x 100 ;

            my $buffer ;
            my $x = new $CompressClass(\$buffer) ;
            ok $x, "  create $CompressClass object" ;
            ok $x->write($string), "  write to object" ;
            ok $x->close, "  close ok" ;

            my $lex = new LexFile my $output;
            my $input ;

            if ($file) {
                writeFile($output, $buffer);
                $input = $output;
            }
            else {
                $input = \$buffer;
            }

            {
                my $unc = new $AnyConstruct $input, Transparent => $trans,
                                           RawInflate => 1,
                                           @anyUnLz,
                                           Append => 1  ;

                ok $unc, "  Created $AnyClass object" 
                    or print "# $$AnyError\n";
                my $uncomp ;
                1 while  $unc->read($uncomp) > 0 ;
                #ok $unc->read($uncomp) > 0 
                #    or print "# $$AnyError\n";
                my $y;
                is $unc->read($y, 1), 0, "  at eof" ;
                ok $unc->eof(), "  at eof" ;
                #ok $unc->type eq $Type;

                is $uncomp, $string, "  expected output" ;
            }

            {
                my $unc = new $AnyConstruct $input, Transparent => $trans,
                                           RawInflate => 1,
                                           @anyUnLz,
                                           Append => 1  ;

                ok $unc, "  Created $AnyClass object" 
                    or print "# $$AnyError\n";
                my $uncomp ;
                1 while  $unc->read($uncomp, 100) > 0 ;
                #ok $unc->read($uncomp) > 0 
                #    or print "# $$AnyError\n";
                my $y;
                is $unc->read($y, 1), 0, "  at eof" ;
                ok $unc->eof(), "  at eof" ;
                #ok $unc->type eq $Type;

                is $uncomp, $string, "  expected output" ;
            }
        }
    }
}

1;
