The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More;

use Dios;

func no_sig                                { return @_             }
func no_args()                             { return @_             }
func one_arg($foo)                         { return $foo           }
func two_args($foo, $bar)                  { return ($foo, $bar)   }
func array_at_end($foo, *@stuff)           { return ($foo, @stuff) }
func one_named(:$foo)                      { return $foo;          }
func one_named_one_positional($bar, :$foo) { return($foo, $bar)    }

note "too many arguments"; {
    ok !eval { no_sig(42); 1 },                                   "no args";
    like $@, qr{Func no_sig takes no arguments};

    ok !eval { no_args(42); 1 },                                   "no args";
    like $@, qr{Func no_args takes no arguments};

    ok !eval { one_arg(23, 42); 1 },                               "one arg";
    like $@, qr{Unexpected extra argument \(42\) in call to func one_arg};

    ok !eval { two_args(23, 42, 99, 100); 1 },                          "two args";
    like $@, qr{Unexpected extra arguments \(99, 100\) in call to func two_args};

    is_deeply [array_at_end(23, 42, 99)], [23, 42, 99],         "array at end";
}


note "with positionals"; {
    is one_named(foo => 42), 42;
    ok !eval { one_named(foo => 23, foo => 42); 1 };
    like $@, qr{Unexpected second value \(42\) for named 'foo' parameter in call to func one_named};


    is_deeply [one_named_one_positional(23, foo => 42)], [42, 23];
    ok !eval { one_named_one_positional(23, foo => 42, foo => 23); 1 };
    like $@, qr{Unexpected second value \(23\) for named 'foo' parameter in call to func one_named_one_positional};
}


#func slurpy_named (*:foo(@bar), *:@baz, *%etc) {
#    return { bar=>\@bar, baz=>\@baz, etc=>\%etc };
#}
#
#is_deeply [slurpy_named( baz=>'a', foo=>1, foo=>2, other=>'other', baz=>'b', foo=>3, nother=>'nother'),
#          {
#            bar => [1,2,3],
#            baz => ['a','b'],
#            etc => {other=>'other', nother=>'nother',
#          }
#          => 'Named slurpies';


done_testing;