The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl

use 5.010;
use strict;
use warnings;
use Test::More 0.98;

use Perinci::Sub::ConvertArgs::Array qw(convert_args_to_array);

my $meta10 = {args=>{a=>["int" => {arg_pos=>0}]}};
test_convertargs(
    name=>"meta v1.0 -> dies",
    meta=>$meta10, args=>{a=>1},
    status=>412,
);

my $meta;

$meta = {
    v => 1.1,
    args => {
        arg1 => {meta=>'str*'},
    },
};
test_convertargs(
    name=>'empty -> ok',
    meta=>$meta, args=>{},
    status=>200, array=>[],
);
test_convertargs(
    name=>'no meta -> error',
    meta=>$meta, args=>{arg2=>1},
    status=>412,
);

$meta = {
    v => 1.1,
    args => {
        arg1 => {schema=>'str*', pos=>0},
        arg2 => {schema=>'str*', pos=>1},
    },
};
test_convertargs(
    name=>'arg1 only',
    meta=>$meta, args=>{arg1=>1},
    status=>200, array=>[1],
);
test_convertargs(
    name=>'arg2 only',
    meta=>$meta, args=>{arg2=>2},
    status=>200, array=>[undef, 2],
);
test_convertargs(
    name=>'arg1 & arg2 (1)',
    meta=>$meta, args=>{arg1=>1, arg2=>2},
    status=>200, array=>[1,2],
);
test_convertargs(
    name=>'arg1 & arg2 (2)',
    meta=>$meta, args=>{arg1=>2, arg2=>1},
    status=>200, array=>[2, 1],
);

$meta = {
    v => 1.1,
    args => {
        arg1 => {schema=>['array*' => {of=>'str*'}], pos=>0, greedy=>1},
    },
};
test_convertargs(
    name=>'arg_greedy (1a)',
    meta=>$meta, args=>{arg1=>[1, 2, 3]},
    status=>200, array=>[1, 2, 3],
);
test_convertargs(
    name=>'arg_greedy (1b)',
    meta=>$meta, args=>{arg1=>2},
    status=>200, array=>[2],
);

$meta = {
    v => 1.1,
    args => {
        arg1 => {schema=>'str*', pos=>0},
        arg2 => {schema=>['array*' => {of=>'str*'}], pos=>1, greedy=>1},
    },
};
test_convertargs(
    name=>'arg_greedy (2)',
    meta=>$meta, args=>{arg1=>1, arg2=>[2, 3, 4]},
    status=>200, array=>[1, 2, 3, 4],
);

DONE_TESTING:
done_testing();

sub test_convertargs {
    my (%args) = @_;

    subtest $args{name} => sub {
        my %input_args = (args=>$args{args}, meta=>$args{meta});

        my $res;
        eval { $res = convert_args_to_array(%input_args) };
        my $eval_err = $@;
        if ($args{dies}) {
            ok($eval_err, "dies");
        } else {
            ok(!$eval_err, "doesn't die") or diag "dies: $eval_err";
        }

        is($res->[0], $args{status}, "status=$args{status}")
            or diag explain $res;

        if ($args{array}) {
            is_deeply($res->[2], $args{array}, "result")
                or diag explain $res->[2];
        }
        #if ($args{post_test}) {
        #    $args{post_test}->();
        #}
    };
}