The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use t::share; guard my $guard;

require (wd().'/blib/script/narada-install');


sub is_version;
sub is_backups;


# - simple functional test:
#       0.0.0 upgrade to   0.1.0
#   * check is VERSION file created and correct
#   * check there are no backups
is_version '0.1.0';
is_backups [], 'no backups';
#       0.1.0 downgrade to 0.0.0
#   * check is VERSION file removed
#   * check backup for 0.1.0 created
lives_ok { output_from { main(qw( --allow-downgrade 0.0.0 )) } } '0.0.0';
is_version '0.0.0';
is_backups [qw( full-0.1.0 )];
unlink '.backup/full-0.1.0.tar' or die "unlink: $!";
#       0.0.0 upgrade to   1.1.0
#   * check is VERSION file created and correct
#   * check backup for 0.1.0 created
output_from { main(qw( -f .release/0.1.0.migrate 1.1.0 )) };
is_version '1.1.0';
is_backups [qw( full-0.1.0 )];
#       1.1.0 upgrade to   1.2.0
#   * check is VERSION file modified and correct
#   * check backup for 1.1.0 created
output_from { main(qw( 1.2.0 )) };
is_version '1.2.0';
is_backups [qw( full-0.1.0 full-1.1.0 )];
#       1.2.0 downgrade to 0.0.0
#   * check is VERSION file removed
#   * check backup for 1.2.0 created
#   * check backup for 1.1.0 updated
my $old_size = -s '.backup/full-1.1.0.tar';
output_from { main(qw( -D -f .release/0.1.0.migrate 0.0.0 )) };
is_version '0.0.0';
is_backups [qw( full-0.1.0 full-1.1.0 full-1.2.0 )];
ok -s '.backup/full-1.1.0.tar' > $old_size, 'full-1.1.0 updated';


done_testing();


sub is_version {
    local $Test::Builder::Level = $Test::Builder::Level + 1;
    if ($_[0] eq '0.0.0') {
        ok !path('VERSION')->exists, 'no VERSION';
    }
    elsif (path('VERSION')->exists) {
        my ($v) = path('VERSION')->lines({chomp=>1});
        is $v, $_[0], $_[1] // "version: $_[0]";
    }
    else {
        ok 0, $_[1] // "version: $_[0]";
    }
}

sub is_backups {
    local $Test::Builder::Level = $Test::Builder::Level + 1;
    is_deeply [ sort map { $_->basename('.tar') }
        path('.backup')->children(qr/\A(?!full[.]tar\z|incr[.]tar\z|snap\z)/ms)
        ], $_[0], $_[1] // "backups: @{$_[0]}";
}