The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use strict;
use warnings;

use Test::More;

use Pinto::Difference;

use lib 't/lib';
use Pinto::Tester;
use Pinto::Tester::Util qw(make_dist_archive);

#------------------------------------------------------------------------------
my $dist1 = make_dist_archive('AUTHOR/Dist-1 = PkgA~1; PkgB~1');
my $dist2 = make_dist_archive('AUTHOR/Dist-2 = PkgB~2; PkgC~2');

my $t = Pinto::Tester->new;

$t->run_ok( Add  => { archives => $dist1, author => 'AUTHOR', stack => 'master' } );
$t->run_ok( Copy => { from_stack => 'master', to_stack => 'foo' } );
$t->run_ok( Add  => { archives => $dist2, author => 'AUTHOR', stack => 'foo' } );
$t->run_ok( Pin  => { targets => 'PkgC', stack => 'foo' } );

#------------------------------------------------------------------------------

{

    my @expected = (
        qr{^ \Q-[rl-] AUTHOR/Dist-1.tar.gz\E $}mx,
        qr{^ \Q+[rl!] AUTHOR/Dist-2.tar.gz\E $}mx,
    );

    # Compare by revision id
    my $rev0 = $t->get_stack('master')->head->uuid;
    my $rev1 = $t->get_stack('foo')->head->uuid;
    $t->run_ok( Diff => { left => $rev0, right => $rev1 } );
    $t->stdout_like($_) for @expected;

    # With abbreviated revision id
    $rev0 = substr( $rev0, 0, 4 );
    $rev1 = substr( $rev1, 0, 4 );
    $t->run_ok( Diff => { left => $rev0, right => $rev1 } );
    $t->stdout_like($_) for @expected;

    # With stack name and revision id
    $t->run_ok( Diff => { left => 'master', right => $rev1 } );
    $t->stdout_like($_) for @expected;
}

#------------------------------------------------------------------------------

{

    # Error case: bogus stack name or revision id
    $t->run_throws_ok(
        Diff => { left => 'foo', right => 'bogus' },
        qr/does not match any stack or revision/
    );

    # Forcing revision IDs to have same prefix
    my $rev0 = $t->get_stack('master')->head;
    $rev0->update( { uuid => 'aaa' . $rev0->uuid } );

    my $rev1 = $t->get_stack('foo')->head;
    $rev1->update( { uuid => 'aaa' . $rev1->uuid } );

    # Error case: ambiguous revision IDs
    $t->run_throws_ok(
        Diff => { left => undef, right => 'aaa' },
        qr/is ambiguous/
    );

    # Error case: no default stack
    $t->run_ok( Default => { none => 1 } );
    $t->run_throws_ok(
        Diff => { left => undef, right => 'foo' },
        qr/default stack has not been set/
    );
}

#------------------------------------------------------------------------------

done_testing;