The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More;
use Cwd qw( cwd );
use Test::Git;
use Git::Repository;
use Git::FastExport;
use File::Temp qw( tempdir );

has_git( '1.5.0' );

# setup a temporary git repo
my $r = test_repository();

my $version    = $r->version;
my $version_ok = $r->version_ge('1.5.4');

my @tests = (

    # desc, args
    [ 'Git::Repository', $r ],
    [ 'directory', $r->work_tree ],
    [ '' ],
);

my @fails = (

    # desc, error regex, args
    [ 'non-existent directory', qr/^Can't chdir to .*zlonk/, 'zlonk' ],
    [ 'non-Git::Repository object', qr/^Can't chdir to .*Zlonk=/, bless {}, 'Zlonk' ],
  ( [ "git $version", qr/^Git version 1\.5\.4 required for git fast-export\./ ] )x! $version_ok,
);

plan tests => 3 * @tests + 3 * @fails;

my $home = cwd();

chdir $r->work_tree;

SKIP: {
    skip "Git 1.5.4 required, this is only $version", 3 * @tests
      if !$version_ok;
    for my $t (@tests) {
        my ( $desc, @args ) = @$t;
        my $export;
        ok( eval { $export = Git::FastExport->new(@args); 1 },
            "Git::FastExport->new($desc)" );
        is( $@, '', "No error calling Git::FastExport->new($desc)" );
        isa_ok( $export, 'Git::FastExport' );
    }
}

# some failure tests
for my $t (@fails) {
    my ( $desc, $regex, @args ) = @$t;
    my $export;
    ok( !eval { $export = Git::FastExport->new(@args); 1 },
        "Git::FastExport->new() failed with $desc" );
    like( $@, $regex, 'Expected error message' );
    is( $export, undef, 'No object created' );
}

chdir $home;