#!/@unixroot/usr/bin/perl -w

BEGIN {
    chdir 't' if -d 't';
    require "./test.pl";
    set_up_inc('../lib', '..');
}

use TestInit qw(T);    # T is chdir to the top level
use strict;

find_git_or_skip('all');

my $ok= do "./Porting/updateAUTHORS.pl";
my $error= !$ok && $@;
is($ok,1,"updateAUTHORS.pl compiles correctly");
is($error, "", "updateAUTHORS.pl compiles without error");
my $small_range= "544171f79ec3e50bb5003007e9f4ebb9a7e9fe84^^^"
               . "..544171f79ec3e50bb5003007e9f4ebb9a7e9fe84";
my $large_range= "6d02a9e121d037896df9b91ac623c1ab4c98c99a.."
               . "544171f79ec3e50bb5003007e9f4ebb9a7e9fe8";
my $with_unknown_range= "96a91e01636d3050d38ae3373a362c7d47a6647e^^^.."
                      . "96a91e01636d3050d38ae3373a362c7d47a6647e";

foreach my $tuple (
    [ "--who", $small_range,
               "James E Keenan, Karl Williamson, Mark Shelor." ],
    [ "--files", $small_range, files_expected() ],
    [ "--rank", $large_range, rank_expected()],
    [ "--rank --percentage", $large_range, rank_percentage_expected()],
    [ "--rank --percentage --cumulative", $large_range,
        rank_percentage_cumulative_expected()],
    [ "--thanks-applied", $large_range, thanks_applied_expected() ],
    [ "--stats", $large_range, stats_expected() ],
    [ "--stats --numstat", $large_range, stats_numstat_expected() ],
    [ "--who" , $with_unknown_range, "Jarkko Hietaniemi.", "(no 'unknown' authors)" ],
) {
    my ($arg,$range,$expect, $msg_extra)= @$tuple;
    my $skip_it;
    for my $endpoint (split /\.+/, $range) {
        my $parsed= `git rev-parse --verify -q $endpoint\{commit}`;
        if (!$parsed or $?) {
            $skip_it = 1;
        }
    }
    SKIP: {
        if ($skip_it) {
            skip "commit range '$range' not available (this happens in CI)", 1;
        }
        $msg_extra= $msg_extra ? " $msg_extra" : "";
        my $cmd= join " ", "$^X ./Porting/updateAUTHORS.pl",
                           $arg, $range;
        my $result= `$cmd`;
        is(_clean($result), _clean($expect),"Option '$arg' works as expected$msg_extra")
            or print STDERR "$cmd\n",$result
    }
}
done_testing();
exit 0;
sub _clean {
    my ($str)= @_;
    $str=~s/\s+\z//;
    $str=~s/[ ]+\n/\n/g;
    return $str;
}

sub files_expected {
    return <<'END_OF_REPORT';
#Pos | commits | L++ | L-- | L+- | binary_change | Name
#----+---------+-----+-----+-----+---------------+----------------------------------
#1   |       1 |  28 |   0 |  28 |             0 | pod/perlfunc.pod
#2   |       1 |  14 |   4 |  10 |             0 | cpan/Digest-SHA/lib/Digest/SHA.pm
#3   |       1 |   5 |   5 |   0 |             0 | cpan/Digest-SHA/shasum
#4   |       1 |   3 |   3 |   0 |             0 | cpan/Digest-SHA/src/sha64bit.c
#5   |       1 |   3 |   3 |   0 |             0 | cpan/Digest-SHA/src/sha64bit.h
#6   |       1 |   3 |   3 |   0 |             0 | cpan/Digest-SHA/src/sha.c
#7   |       1 |   3 |   3 |   0 |             0 | cpan/Digest-SHA/src/sha.h
#8   |       1 |   1 |   1 |   0 |             0 | Porting/Maintainers.pl
#9   |       1 |   1 |   0 |   1 |             0 | AUTHORS
END_OF_REPORT
}

sub rank_expected {
    return <<'END_OF_REPORT';
#Pos | Authored | Name
#----+----------+-----------------
#1   |       40 | Karl Williamson
#2   |       32 | Yves Orton
#3   |        8 | Paul Evans
#4   |        6 | James E Keenan
#5   |        4 | Elvin Aslanov
#6   |        3 | Richard Leach
#7   |        3 | Tony Cook
#8   |        2 | Nicholas Clark
#9   |        1 | Dan Kogai
#10  |        1 | David Golden
#11  |        1 | Graham Knop
#12  |        1 | Mark Shelor
#13  |        1 | Tomasz Konojacki
END_OF_REPORT
}

sub rank_percentage_expected {
    return <<'END_OF_REPORT';
#Pos | %Authored | Name
#----+-----------+-----------------
#1   |     38.83 | Karl Williamson
#2   |     31.07 | Yves Orton
#3   |      7.77 | Paul Evans
#4   |      5.83 | James E Keenan
#5   |      3.88 | Elvin Aslanov
#6   |      2.91 | Richard Leach
#7   |      2.91 | Tony Cook
#8   |      1.94 | Nicholas Clark
#9   |      0.97 | Dan Kogai
#10  |      0.97 | David Golden
#11  |      0.97 | Graham Knop
#12  |      0.97 | Mark Shelor
#13  |      0.97 | Tomasz Konojacki
END_OF_REPORT
}

sub rank_percentage_cumulative_expected {
    return <<'END_OF_REPORT';
#Pos | %Authored | Name
#----+-----------+-----------------
#1   |     38.83 | Karl Williamson
#2   |     69.90 | Yves Orton
#3   |     77.67 | Paul Evans
#4   |     83.50 | James E Keenan
#5   |     87.38 | Elvin Aslanov
#6   |     90.29 | Richard Leach
#7   |     93.20 | Tony Cook
#8   |     95.15 | Nicholas Clark
#9   |     96.12 | Dan Kogai
#10  |     97.09 | David Golden
#11  |     98.06 | Graham Knop
#12  |     99.03 | Mark Shelor
#13  |    100.00 | Tomasz Konojacki
END_OF_REPORT
}

sub thanks_applied_expected {
    return <<'END_OF_REPORT';
#Pos | Applied | Name
#----+---------+----------------
#1   |       7 | Karl Williamson
#2   |       4 | James E Keenan
END_OF_REPORT
}

sub stats_expected {
    return <<'END_OF_REPORT';
#Pos | Authored | Applied | Committed | Name
#----+----------+---------+-----------+-----------------
#1   |       40 |       7 |        47 | Karl Williamson
#2   |       32 |       0 |        31 | Yves Orton
#3   |        8 |       0 |         8 | Paul Evans
#4   |        6 |       4 |        10 | James E Keenan
#5   |        4 |       0 |         1 | Elvin Aslanov
#6   |        3 |       0 |         3 | Tony Cook
#7   |        3 |       0 |         0 | Richard Leach
#8   |        2 |       0 |         2 | Nicholas Clark
#9   |        1 |       0 |         1 | Tomasz Konojacki
#10  |        1 |       0 |         0 | Dan Kogai
#11  |        1 |       0 |         0 | David Golden
#12  |        1 |       0 |         0 | Graham Knop
#13  |        1 |       0 |         0 | Mark Shelor
END_OF_REPORT
}

sub stats_numstat_expected {
    return <<'END_OF_REPORT';
#Pos | Authored | Applied | Committed | NFiles |  L++ |  L-- |  L+- | Name
#----+----------+---------+-----------+--------+------+------+------+-----------------
#1   |       40 |       7 |        47 |     14 | 1179 |  874 |  305 | Karl Williamson
#2   |       32 |       0 |        31 |     25 | 2547 | 1481 | 1066 | Yves Orton
#3   |        8 |       0 |         8 |     15 |  161 |  102 |   59 | Paul Evans
#4   |        6 |       4 |        10 |      4 |   44 |   11 |   33 | James E Keenan
#5   |        4 |       0 |         1 |      4 |   16 |   13 |    3 | Elvin Aslanov
#6   |        3 |       0 |         3 |      7 |    8 |    7 |    1 | Tony Cook
#7   |        3 |       0 |         0 |     13 |   75 |   51 |   24 | Richard Leach
#8   |        2 |       0 |         2 |      2 |   24 |    1 |   23 | Nicholas Clark
#9   |        1 |       0 |         1 |      2 |   21 |   15 |    6 | Tomasz Konojacki
#10  |        1 |       0 |         0 |      8 |   33 |   22 |   11 | Mark Shelor
#11  |        1 |       0 |         0 |      5 |   93 |    7 |   86 | Graham Knop
#12  |        1 |       0 |         0 |      4 |    9 |    4 |    5 | Dan Kogai
#13  |        1 |       0 |         0 |      2 |   19 |    6 |   13 | David Golden
END_OF_REPORT
}
