1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
use warnings qw(all FATAL uninitialized);
use strict;
use Test::More tests => 140;
use Function::Parameters;
use constant Inf => 0 + 'Inf';
fun foo($pr1, $pr2, $po1 = 1, $po2 = 2, :$no1 = 3, :$no2 = 4, %r) {}
{
my $info = Function::Parameters::info \&foo;
is $info->keyword, 'fun';
is_deeply [$info->invocants], [];
is scalar $info->invocants, 0;
is $info->invocant, undef;
is_deeply [$info->positional_required], [qw($pr1 $pr2)];
is scalar $info->positional_required, 2;
is_deeply [$info->positional_optional], [qw($po1 $po2)];
is scalar $info->positional_optional, 2;
is_deeply [$info->named_required], [];
is scalar $info->named_required, 0;
is_deeply [$info->named_optional], [qw($no1 $no2)];
is scalar $info->named_optional, 2;
is $info->slurpy, '%r';
is $info->args_min, 2;
is $info->args_max, Inf;
}
{
my $info = Function::Parameters::info fun ($pr1, :$nr1, :$nr2) {};
is $info->keyword, 'fun';
is_deeply [$info->invocants], [];
is scalar $info->invocants, 0;
is $info->invocant, undef;
is_deeply [$info->positional_required], [qw($pr1)];
is scalar $info->positional_required, 1;
is_deeply [$info->positional_optional], [];
is scalar $info->positional_optional, 0;
is_deeply [$info->named_required], [qw($nr1 $nr2)];
is scalar $info->named_required, 2;
is_deeply [$info->named_optional], [];
is scalar $info->named_optional, 0;
is $info->slurpy, undef;
is $info->args_min, 5;
is $info->args_max, Inf;
}
sub bar {}
is Function::Parameters::info(\&bar), undef;
is Function::Parameters::info(sub {}), undef;
method baz($class: $po1 = 1, $po2 = 2, $po3 = 3, :$no1 = 4, @rem) {}
{
my $info = Function::Parameters::info \&baz;
is $info->keyword, 'method';
is_deeply [$info->invocants], [qw($class)];
is scalar $info->invocants, 1;
is $info->invocant, '$class';
is_deeply [$info->positional_required], [];
is scalar $info->positional_required, 0;
is_deeply [$info->positional_optional], [qw($po1 $po2 $po3)];
is scalar $info->positional_optional, 3;
is_deeply [$info->named_required], [];
is scalar $info->named_required, 0;
is_deeply [$info->named_optional], [qw($no1)];
is scalar $info->named_optional, 1;
is $info->slurpy, '@rem';
is $info->args_min, 1;
is $info->args_max, Inf;
}
{
my $info = Function::Parameters::info method () {};
is $info->keyword, 'method';
is_deeply [$info->invocants], [qw($self)];
is scalar $info->invocants, 1;
is $info->invocant, '$self';
is_deeply [$info->positional_required], [];
is scalar $info->positional_required, 0;
is_deeply [$info->positional_optional], [];
is scalar $info->positional_optional, 0;
is_deeply [$info->named_required], [];
is scalar $info->named_required, 0;
is_deeply [$info->named_optional], [];
is scalar $info->named_optional, 0;
is $info->slurpy, undef;
is $info->args_min, 1;
is $info->args_max, 1;
}
{
use Function::Parameters { proc => 'function' };
my $info = Function::Parameters::info proc (@) {};
is $info->keyword, 'proc';
is_deeply [$info->invocants], [];
is scalar $info->invocants, 0;
is $info->invocant, undef;
is_deeply [$info->positional_required], [];
is scalar $info->positional_required, 0;
is_deeply [$info->positional_optional], [];
is scalar $info->positional_optional, 0;
is_deeply [$info->named_required], [];
is scalar $info->named_required, 0;
is_deeply [$info->named_optional], [];
is scalar $info->named_optional, 0;
is $info->slurpy, '@';
is $info->args_min, 0;
is $info->args_max, Inf;
}
{
my $info = Function::Parameters::info method (@) {};
is $info->keyword, 'method';
is_deeply [$info->invocants], [qw($self)];
is scalar $info->invocants, 1;
is $info->invocant, '$self';
is_deeply [$info->positional_required], [];
is scalar $info->positional_required, 0;
is_deeply [$info->positional_optional], [];
is scalar $info->positional_optional, 0;
is_deeply [$info->named_required], [];
is scalar $info->named_required, 0;
is_deeply [$info->named_optional], [];
is scalar $info->named_optional, 0;
is $info->slurpy, '@';
is $info->args_min, 1;
is $info->args_max, Inf;
}
{
my @fs;
for my $i (qw(aku soku zan)) {
push @fs, [$i => fun (:$sin, :$swift, :$slay) { $i }];
}
for my $kf (@fs) {
my ($i, $f) = @$kf;
my $info = Function::Parameters::info $f;
is $info->keyword, 'fun';
is_deeply [$info->invocants], [];
is scalar $info->invocants, 0;
is $info->invocant, undef;
is_deeply [$info->positional_required], [];
is scalar $info->positional_required, 0;
is_deeply [$info->positional_optional], [];
is scalar $info->positional_optional, 0;
is_deeply [$info->named_required], [qw($sin $swift $slay)];
is scalar $info->named_required, 3;
is_deeply [$info->named_optional], [];
is scalar $info->named_optional, 0;
is $info->slurpy, undef;
is $info->args_min, 6;
is $info->args_max, Inf;
is $f->(sin => 1, swift => 2, slay => 3), $i;
}
}
|