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::Constants qw(:diff);

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

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

$t->populate('AUTHOR/Dist-1 = PkgA~1; PkgB~1');
$t->populate('AUTHOR/Dist-2 = PkgB~2; PkgC~2');

#------------------------------------------------------------------------------
subtest 'detailed diff' => sub {

    local $ENV{PINTO_DIFF_STYLE} = $PINTO_DIFF_STYLE_DETAILED;

    my $fmt = '%a/%D/%P/%y';

    my $right = $t->get_stack->head;
    my $left  = ( $right->parents )[0];

    my $expect_adds = [ 'AUTHOR/Dist-2/PkgB~2/-', 'AUTHOR/Dist-2/PkgC~2/-' ];
    my $expect_dels = [ 'AUTHOR/Dist-1/PkgA~1/-', 'AUTHOR/Dist-1/PkgB~1/-' ];

    my $diff = Pinto::Difference->new( left => $left, right => $right );

    my @adds = map { $_->to_string($fmt) } $diff->additions;
    my @dels = map { $_->to_string($fmt) } $diff->deletions;

    is_deeply \@adds, $expect_adds, 'Got expected additions';
    is_deeply \@dels, $expect_dels, 'Got expected deletions';

    # If we reverse the direction of the diff, then
    # we should always get the opposite results...

    ( $right,       $left )        = ( $left,        $right );
    ( $expect_adds, $expect_dels ) = ( $expect_dels, $expect_adds );

    $diff = Pinto::Difference->new( left => $left, right => $right );

    @adds = map { $_->to_string($fmt) } $diff->additions;
    @dels = map { $_->to_string($fmt) } $diff->deletions;

    is_deeply \@adds, $expect_adds, 'Got expected additions';
    is_deeply \@dels, $expect_dels, 'Got expected deletions';
};

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

subtest 'concise diff' => sub {

    local $ENV{PINTO_DIFF_STYLE} = $PINTO_DIFF_STYLE_CONCISE;

    my $fmt = '%a/%f';

    my $right = $t->get_stack->head;
    my $left  = ( $right->parents )[0];

    my $expect_adds = [ 'AUTHOR/Dist-2.tar.gz' ];
    my $expect_dels = [ 'AUTHOR/Dist-1.tar.gz' ];

    my $diff = Pinto::Difference->new( left => $left, right => $right );

    my @adds = map { $_->to_string($fmt) } $diff->additions;
    my @dels = map { $_->to_string($fmt) } $diff->deletions;

    is_deeply \@adds, $expect_adds, 'Got expected additions';
    is_deeply \@dels, $expect_dels, 'Got expected deletions';

    # If we reverse the direction of the diff, then we should always
    # get the opposite results.

    ( $right, $left ) = ( $left, $right );
    ( $expect_adds, $expect_dels ) = ( $expect_dels, $expect_adds );

    $diff = Pinto::Difference->new( left => $left, right => $right );

    @adds = map { $_->to_string($fmt) } $diff->additions;
    @dels = map { $_->to_string($fmt) } $diff->deletions;

    is_deeply \@adds, $expect_adds, 'Got expected additions';
    is_deeply \@dels, $expect_dels, 'Got expected deletions';

};
#------------------------------------------------------------------------------

done_testing;