The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
use strict;
BEGIN{ if (not $] < 5.006) { require warnings; warnings->import } }

select(STDERR); $|=1;
select(STDOUT); $|=1;

use Test::More;
use t::Frontend;
use t::Helper;
use IO::CaptureOutput qw/capture/;

my @good_cases = (
    {
        label   => "empty input",
        option  => "edit_report",
        input   => "",
        output  => {
            default => "no",
        }
    },
    {
        label   => "action (by itself)",
        option  => "edit_report",
        input   => "yes",
        output  => {
            default => "yes",
        },
    },
    {
        label   => "grade (by itself)",
        option  => "edit_report",
        input   => "fail",
        output  => {
            "fail"  => "yes",
        },
    },
    {
        label   => "default:action",
        option  => "edit_report",
        input   => "default:no",
        output  => {
            default => "no",
        },
    },
    {
        label   => "grade:action",
        option  => "edit_report",
        input   => "fail:yes",
        output  => {
            "fail"  => "yes",
        },
    },
    {
        label   => "grade:action action",
        option  => "edit_report",
        input   => "fail:yes no",
        output  => {
            "fail"  => "yes",
            default => "no",
        },
    },
    {
        label   => "grade:action action grade:action",
        option  => "edit_report",
        input   => "fail:yes no fail:no",
        output  => {
            "fail"  => "no",
            default => "no",
        },
    },
    {
        label   => "grade:action action grade2:action",
        option  => "edit_report",
        input   => "fail:yes no na:no",
        output  => {
            "fail"  => "yes",
            "na"    => "no",
            default => "no",
        },
    },
    {
        label   => "grade/grade2:action",
        option  => "edit_report",
        input   => "fail/na:ask/yes",
        output  => {
            "fail"  => "ask/yes",
            "na"    => "ask/yes",
        },
    },
    {
        label   => "grade/grade2",
        option  => "edit_report",
        input   => "fail/na",
        output  => {
            "fail"  => "yes",
            "na"    => "yes",
        },
    },
);
        
my @bad_cases = (
    {
        label   => "bad grade",
        option  => "edit_report",
        input   => "failed",
        output  => undef,
        msg     => 
            "/ignoring invalid grade:action 'failed' for 'edit_report'/",
    },
    {
        label   => "bad action",
        option  => "edit_report",
        input   => "fail:run-away",
        output  => undef,
        msg     => 
            "/ignoring invalid action 'run-away' in 'fail:run-away' for 'edit_report'/",
    },
);

plan tests => 1 + 2 * ( @good_cases + @bad_cases ); 

#--------------------------------------------------------------------------#
# Begin tests
#--------------------------------------------------------------------------#

require_ok( "CPAN::Reporter::Config" );

for my $case ( @good_cases, @bad_cases ) {
    my ($got, $stdout, $stderr);
    capture sub { 
        $got = CPAN::Reporter::Config::_validate_grade_action_pair( 
            $case->{option}, $case->{input} 
        );
    }, \$stdout, \$stderr;
    is_deeply( $got, $case->{output}, $case->{label} );
    if ( $case->{msg} ) {
        like( $stdout, $case->{msg}, $case->{label} );
    }
    else {
        is( $stdout, '', "No warnings seen" );
    }
}