use strict;
use warnings;
use Setup;
use Test2::V0;

use Hydra::Helper::BuildDiff;

my $ctx = test_context();

my $builds = $ctx->makeAndEvaluateJobset(
    expression => "basic.nix",
    build => 1
);

subtest "empty diff" => sub {
    my $ret = buildDiff([], []);
    is(
        $ret,
        {
            stillSucceed => [],
            stillFail => [],
            nowSucceed => [],
            nowFail => [],
            new => [],
            removed => [],
            unfinished => [],
            aborted => [],
            failed => [],
        },
        "empty list of jobs returns empty diff"
    );
};

subtest "2 different jobs" => sub {
    my $ret = buildDiff([$builds->{"succeed_with_failed"}], [$builds->{"empty_dir"}]);

    is($ret->{stillSucceed}, [], "stillSucceed");
    is($ret->{stillFail}, [], "stillFail");
    is($ret->{nowSucceed}, [], "nowSucceed");
    is($ret->{nowFail}, [], "nowFail");
    is($ret->{unfinished}, [], "unfinished");
    is($ret->{aborted}, [], "aborted");

    is(scalar(@{$ret->{new}}), 1, "list of new jobs is 1 element long");
    is(
        $ret->{new}[0]->get_column('id'),
        $builds->{"succeed_with_failed"}->get_column('id'),
        "succeed_with_failed is a new job"
    );

    is(scalar(@{$ret->{failed}}), 1, "list of failed jobs is 1 element long");
    is(
        $ret->{failed}[0]->get_column('id'),
        $builds->{"succeed_with_failed"}->get_column('id'),
        "succeed_with_failed is a failed job"
    );

    is(
        $ret->{removed},
        [
            {
                job => $builds->{"empty_dir"}->get_column('job'),
                system => $builds->{"empty_dir"}->get_column('system')
            }
        ],
        "empty_dir is a removed job"
    );
};

subtest "failed job with no previous history" => sub {
    my $ret = buildDiff([$builds->{"fails"}], []);

    is(scalar(@{$ret->{failed}}), 1, "list of failed jobs is 1 element long");
    is(
        $ret->{failed}[0]->get_column('id'),
        $builds->{"fails"}->get_column('id'),
        "fails is a failed job"
    );
};

subtest "not-yet-built job with no previous history" => sub {
    my $builds = $ctx->makeAndEvaluateJobset(
        expression => "build-products.nix",
        build => 0
    );

    my $ret = buildDiff([$builds->{"simple"}], []);

    is($ret->{stillSucceed}, [], "stillSucceed");
    is($ret->{stillFail}, [], "stillFail");
    is($ret->{nowSucceed}, [], "nowSucceed");
    is($ret->{nowFail}, [], "nowFail");
    is($ret->{removed}, [], "removed");
    is($ret->{unfinished}, [], "unfinished");
    is($ret->{aborted}, [], "aborted");
    is($ret->{failed}, [], "failed");

    is(scalar(@{$ret->{new}}), 1, "list of new jobs is 1 element long");
    is(
        $ret->{new}[0]->get_column('id'),
        $builds->{"simple"}->get_column('id'),
        "simple is a new job"
    );
};

done_testing;