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 File::Spec ;
use Test::More ;
use CompTestUtils;

my $LZMA ;
my $UNLZMA ;

sub ExternalLzmaWorks
{
    my $lex = new LexFile my $outfile;
    my $content = qq {
Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Ut tempus odio id
 dolor. Camelus perlus.  Larrius in lumen numen.  Dolor en quiquum filia
 est.  Quintus cenum parat.
};

    writeWithLzma($outfile, $content)
        or return 0;

    my $got ;
    readWithLzma($outfile, $got)
        or return 0;

    if ($content ne $got)
    {
        diag "Uncompressed content is wrong";
        return 0 ;
    }

    return 1 ;
}

sub readWithLzma
{
    my $file = shift ;

    my $lex = new LexFile my $outfile;

    my $comp = "$UNLZMA -c " ;

    if (system("$comp <$file >$outfile") == 0 )
    {
        $_[0] = readFile($outfile);
        return 1 ;
    }

    diag "'$comp' failed: $?";
    return 0 ;
}

sub writeWithLzma
{
    my $file = shift ;
    my $content = shift ;
    my $options = shift || '';

    my $lex = new LexFile my $infile;
    writeFile($infile, $content);

    unlink $file ;
    my $comp = "$LZMA -c $options $infile >$file" ;

    return 1
        if system($comp) == 0  ;

    diag "'$comp' failed: $?";
    return 0 ;
}

BEGIN
{

    # Check external lzma is available
    my $nameLZ = $^O =~ /mswin/i ? 'lzma.exe' : 'lzma';
    my $nameUNLZ = $^O =~ /mswin/i ? 'unlzma.exe' : 'unlzma';
    my $split = $^O =~ /mswin/i ? ";" : ":";

    for my $dir (reverse split $split, $ENV{PATH})
    {
        $LZMA = File::Spec->catfile($dir,$nameLZ)
            if -x File::Spec->catfile($dir,$nameLZ);

        $UNLZMA = File::Spec->catfile($dir,$nameUNLZ)
            if -x File::Spec->catfile($dir,$nameUNLZ);
    }

    # Handle spaces in path to lzma
    $LZMA = "\"$LZMA\"" if defined $LZMA && $LZMA =~ /\s/;
    $UNLZMA = "\"$UNLZMA\"" if defined $UNLZMA && $UNLZMA =~ /\s/;

    plan(skip_all => "Cannot find $nameLZ")
        if ! $LZMA ;

    plan(skip_all => "Cannot find $nameUNLZ")
        if ! $UNLZMA ;

    plan(skip_all => "$nameLZ doesn't work as expected")
        if ! ExternalLzmaWorks();

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

    plan tests => 12 + $extra ;

    use_ok('IO::Compress::Lzma',     ':all') ;
    use_ok('IO::Uncompress::UnLzma', ':all') ;

}

{
    title "Test interop with $LZMA" ;

    my ($file, $file1);
    my $lex = new LexFile $file, $file1;
    my $content = "hello world\n" ;
    my $got;

    ok writeWithLzma($file, $content), "writeWithLzma ok";

    unlzma $file => \$got ;
    is $got, $content;


    lzma \$content => $file1;
    $got = '';
    ok readWithLzma($file1, $got), "readWithLzma returns 0";
    is $got, $content, "got content";
}

{
    title "Test interop with $LZMA - empty file" ;

    my ($file, $file1);
    my $lex = new LexFile $file, $file1;
    my $content = "" ;
    my $got;

    ok writeWithLzma($file, $content), "writeWithLzma ok";

    unlzma $file => \$got ;
    is $got, $content;


    lzma \$content => $file1;
    $got = '';
    ok readWithLzma($file1, $got), "readWithLzma returns 0";
    is $got, $content, "got content";
}