BEGIN {
    if ($ENV{PERL_CORE}) {
        chdir 't' if -d 't';
        @INC = ("../lib", "lib/compress");
    }
}

use lib qw(t t/compress);

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 => 4 + $extra ;
};


use IO::Compress::Lzma     qw($LzmaError) ;
use IO::Uncompress::UnLzma qw($UnLzmaError) ;


my $CompressClass   = 'IO::Compress::Lzma';
my $UncompressClass = getInverse($CompressClass);
my $Error           = getErrorRef($CompressClass);
my $UnError         = getErrorRef($UncompressClass);

sub myLzmaReadFile
{
    my $filename = shift ;
    my $init = shift ;


    my $fil = new $UncompressClass $filename,
                                    -Strict   => 1,
                                    -Append   => 1
                                    ;

    my $data = '';
    $data = $init if defined $init ;
    1 while $fil->read($data) > 0;

    $fil->close ;
    return $data ;
}


if(0)
{

    title "Testing $CompressClass Errors";

    my $buffer ;

    for my $value (undef, -1, 'fred')
    {
        my $stringValue = defined $value ? $value : 'undef';
        title "BlockSize100K => $stringValue";
        my $err = "Parameter 'BlockSize100K' must be an unsigned int, got '$stringValue'";
        my $bz ;
        eval { $bz = new IO::Compress::Lzma(\$buffer, BlockSize100K => $value) };
        like $@,  mkErr("IO::Compress::Lzma: $err"),
            "  value $stringValue is bad";
        is $LzmaError, "IO::Compress::Lzma: $err",
            "  value $stringValue is bad";
        ok ! $bz, "  no bz object";
    }

    for my $value (0, 10, 99999)
    {
        my $stringValue = defined $value ? $value : 'undef';
        title "BlockSize100K => $stringValue";
        my $err = "Parameter 'BlockSize100K' not between 1 and 9, got $stringValue";
        my $bz ;
        eval { $bz = new IO::Compress::Lzma(\$buffer, BlockSize100K => $value) };
        like $@,  mkErr("IO::Compress::Lzma: $err"),
            "  value $stringValue is bad";
        is $LzmaError,  "IO::Compress::Lzma: $err",
            "  value $stringValue is bad";
        ok ! $bz, "  no bz object";
    }

    for my $value (undef, -1, 'fred')
    {
        my $stringValue = defined $value ? $value : 'undef';
        title "WorkFactor => $stringValue";
        my $err = "Parameter 'WorkFactor' must be an unsigned int, got '$stringValue'";
        my $bz ;
        eval { $bz = new IO::Compress::Lzma(\$buffer, WorkFactor => $value) };
        like $@,  mkErr("IO::Compress::Lzma: $err"),
            "  value $stringValue is bad";
        is $LzmaError, "IO::Compress::Lzma: $err",
            "  value $stringValue is bad";
        ok ! $bz, "  no bz object";
    }

    for my $value (251, 99999)
    {
        my $stringValue = defined $value ? $value : 'undef';
        title "WorkFactor => $stringValue";
        my $err = "Parameter 'WorkFactor' not between 0 and 250, got $stringValue";
        my $bz ;
        eval { $bz = new IO::Compress::Lzma(\$buffer, WorkFactor => $value) };
        like $@,  mkErr("IO::Compress::Lzma: $err"),
            "  value $stringValue is bad";
        is $LzmaError,  "IO::Compress::Lzma: $err",
            "  value $stringValue is bad";
        ok ! $bz, "  no bz object";
    }

}


if(0)
{
    title "Testing $UncompressClass Errors";

    my $buffer ;

    for my $value (-1, 'fred')
    {
        my $stringValue = defined $value ? $value : 'undef';
        title "Small => $stringValue";
        my $err = "Parameter 'Small' must be an int, got '$stringValue'";
        my $bz ;
        eval { $bz = new IO::Uncompress::UnLzma(\$buffer, Small => $value) };
        like $@,  mkErr("IO::Uncompress::UnLzma: $err"),
            "  value $stringValue is bad";
        is $UnLzmaError, "IO::Uncompress::UnLzma: $err",
            "  value $stringValue is bad";
        ok ! $bz, "  no bz object";
    }

}

{
    title "Testing $CompressClass and $UncompressClass";

    my $hello = <<EOM ;
hello world
this is a test
EOM
    $hello = $hello x 1000 ;

    {
        title "$CompressClass";
        my $lex = new LexFile my $name ;
        my $bz ;
        $bz = new IO::Compress::Lzma($name)
            or diag $IO::Compress::Lzma::LzmaError ;
        ok $bz, "  lzma object ok";
        $bz->write($hello);
        $bz->close($hello);

        #is myLzmaReadFile($name), $hello, "  got expected content";
        ok myLzmaReadFile($name) eq $hello, "  got expected content";
    }

    # TODO - add filter tests
#    for my $value ( 1 .. 9 )
#    {
#        title "$CompressClass - BlockSize100K => $value";
#        my $lex = new LexFile my $name ;
#        my $bz ;
#        $bz = new IO::Compress::Lzma($name, BlockSize100K => $value)
#            or diag $IO::Compress::Lzma::LzmaError ;
#        ok $bz, "  bz object ok";
#        $bz->write($hello);
#        $bz->close($hello);
#
#        is myLzmaReadFile($name), $hello, "  got expected content";
#    }
#
#    for my $value ( 0 .. 250 )
#    {
#        title "$CompressClass - WorkFactor => $value";
#        my $lex = new LexFile my $name ;
#        my $bz ;
#        $bz = new IO::Compress::Lzma($name, WorkFactor => $value);
#        ok $bz, "  bz object ok";
#        $bz->write($hello);
#        $bz->close($hello);
#
#        is myLzmaReadFile($name), $hello, "  got expected content";
#    }
#
#    for my $value ( 0 .. 1 )
#    {
#        title "$UncompressClass - Small => $value";
#        my $lex = new LexFile my $name ;
#        my $bz ;
#        $bz = new IO::Compress::Lzma($name);
#        ok $bz, "  bz object ok";
#        $bz->write($hello);
#        $bz->close($hello);
#
#        my $fil = new $UncompressClass $name,
#                                       Append  => 1,
#                                       Small   => $value ;
#
#        my $data = '';
#        1 while $fil->read($data) > 0;
#
#        $fil->close ;
#
#        is $data, $hello, " got expected";
#    }
}


1;