#!/usr/bin/env perl
#***************************************************************************
#                                  _   _ ____  _
#  Project                     ___| | | |  _ \| |
#                             / __| | | | |_) | |
#                            | (__| |_| |  _ <| |___
#                             \___|\___/|_| \_\_____|
#
# Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
#
# This software is licensed as described in the file COPYING, which
# you should have received as part of this distribution. The terms
# are also available at https://curl.haxx.se/docs/copyright.html.
#
# You may opt to use, copy, modify, merge, publish, distribute and/or sell
# copies of the Software, and permit persons to whom the Software is
# furnished to do so, under the terms of the COPYING file.
#
# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
# KIND, either express or implied.
#
###########################################################################

use strict;

push(@INC, $ENV{'srcdir'}) if(defined $ENV{'srcdir'});
push(@INC, ".");

require "getpart.pm"; # array functions

my $srcdir = $ENV{'srcdir'} || '.';
my $TESTDIR="$srcdir/data";

# Get all commands and find out their test numbers
opendir(DIR, $TESTDIR) || die "can't opendir $TESTDIR: $!";
my @cmds = grep { /^test([0-9]+)$/ && -f "$TESTDIR/$_" } readdir(DIR);
closedir DIR;

my $TESTCASES; # start with no test cases

# cut off everything but the digits
for(@cmds) {
    $_ =~ s/[a-z\/\.]*//g;
}
# the numbers from low to high
for(sort { $a <=> $b } @cmds) {
    $TESTCASES .= " $_";
}

my $t;

my %k; # keyword count
my %t; # keyword to test case mapping
my @miss; # test cases without keywords set

my $count;

my %errors;

for $t (split(/ /, $TESTCASES)) {
    if(loadtest("${TESTDIR}/test${t}")) {
        # bad case
        next;
    }

    my @ec = getpart("verify", "errorcode");
    if($ec[0]) {
        # count number of check error codes
        $errors{ 0 + $ec[0] } ++;
    }


    my @what = getpart("info", "keywords");

    if(!$what[0]) {
        push @miss, $t;
        next;
    }

    for(@what) {
        chomp;
        #print "Test $t: $_\n";
        $k{$_}++;
        $t{$_} .= "$t ";
    }








    $count++;
}

sub show {
    my ($list)=@_;
    my @a = split(" ", $list);
    my $ret;

    my $c;
    my @l = sort {rand(100) - 50} @a;
    my @ll;

    for(1 .. 11) {
        my $v = shift @l;
        if($v) {
            push @ll, $v;
        }
    }

    for (sort {$a <=> $b} @ll) {
        if($c++ == 10) {
            $ret .= "...";
            last;
        }
        $ret .= "$_ ";
    }
    return $ret;
}

# sort alphabetically
my @mtest = reverse sort { lc($b) cmp lc($a) } keys %k;

print <<TOP
<table><tr><th>Num</th><th>Keyword</th><th>Test Cases</th></tr>
TOP
    ;
for $t (@mtest) {
    printf "<tr><td>%d</td><td>$t</td><td>%s</td></tr>\n", $k{$t},
    show($t{$t});
}
printf "</table><p> $count out of %d tests (%d lack keywords)\n",
    scalar(@miss) + $count,
    scalar(@miss);

for(@miss) {
    print "$_ ";
}

print "\n";

printf "<p> %d different error codes tested for:<br>\n",
    scalar(keys %errors);

# numerically on amount, or alphebetically if same amount
my @etest = sort { $a <=> $b} keys %errors;

for(@etest) {
    print "$_ ";
}
print "\n";
