2 use warnings FATAL => 'all';
5 use Test::More tests => 104;
7 use Function::Parameters;
9 fun foo($pr1, $pr2, $po1 = 1, $po2 = 2, :$no1 = 3, :$no2 = 4, %r) {}
12 my $info = Function::Parameters::info \&foo;
13 is $info->keyword, 'fun';
14 is $info->invocant, undef;
15 is_deeply [$info->positional_required], [qw($pr1 $pr2)];
16 is scalar $info->positional_required, 2;
17 is_deeply [$info->positional_optional], [qw($po1 $po2)];
18 is scalar $info->positional_optional, 2;
19 is_deeply [$info->named_required], [];
20 is scalar $info->named_required, 0;
21 is_deeply [$info->named_optional], [qw($no1 $no2)];
22 is scalar $info->named_optional, 2;
23 is $info->slurpy, '%r';
27 my $info = Function::Parameters::info fun ($pr1, :$nr1, :$nr2) {};
28 is $info->keyword, 'fun';
29 is $info->invocant, undef;
30 is_deeply [$info->positional_required], [qw($pr1)];
31 is scalar $info->positional_required, 1;
32 is_deeply [$info->positional_optional], [];
33 is scalar $info->positional_optional, 0;
34 is_deeply [$info->named_required], [qw($nr1 $nr2)];
35 is scalar $info->named_required, 2;
36 is_deeply [$info->named_optional], [];
37 is scalar $info->named_optional, 0;
38 is $info->slurpy, undef;
43 is Function::Parameters::info(\&bar), undef;
45 is Function::Parameters::info(sub {}), undef;
47 method baz($class: $po1 = 1, $po2 = 2, $po3 = 3, :$no1 = 4, @rem) {}
50 my $info = Function::Parameters::info \&baz;
51 is $info->keyword, 'method';
52 is $info->invocant, '$class';
53 is_deeply [$info->positional_required], [];
54 is scalar $info->positional_required, 0;
55 is_deeply [$info->positional_optional], [qw($po1 $po2 $po3)];
56 is scalar $info->positional_optional, 3;
57 is_deeply [$info->named_required], [];
58 is scalar $info->named_required, 0;
59 is_deeply [$info->named_optional], [qw($no1)];
60 is scalar $info->named_optional, 1;
61 is $info->slurpy, '@rem';
65 my $info = Function::Parameters::info method () {};
66 is $info->keyword, 'method';
67 is $info->invocant, '$self';
68 is_deeply [$info->positional_required], [];
69 is scalar $info->positional_required, 0;
70 is_deeply [$info->positional_optional], [];
71 is scalar $info->positional_optional, 0;
72 is_deeply [$info->named_required], [];
73 is scalar $info->named_required, 0;
74 is_deeply [$info->named_optional], [];
75 is scalar $info->named_optional, 0;
76 is $info->slurpy, undef;
80 use Function::Parameters { proc => 'function' };
81 my $info = Function::Parameters::info proc {};
82 is $info->keyword, 'proc';
83 is $info->invocant, undef;
84 is_deeply [$info->positional_required], [];
85 is scalar $info->positional_required, 0;
86 is_deeply [$info->positional_optional], [];
87 is scalar $info->positional_optional, 0;
88 is_deeply [$info->named_required], [];
89 is scalar $info->named_required, 0;
90 is_deeply [$info->named_optional], [];
91 is scalar $info->named_optional, 0;
92 is $info->slurpy, '@_';
96 my $info = Function::Parameters::info method {};
97 is $info->keyword, 'method';
98 is $info->invocant, '$self';
99 is_deeply [$info->positional_required], [];
100 is scalar $info->positional_required, 0;
101 is_deeply [$info->positional_optional], [];
102 is scalar $info->positional_optional, 0;
103 is_deeply [$info->named_required], [];
104 is scalar $info->named_required, 0;
105 is_deeply [$info->named_optional], [];
106 is scalar $info->named_optional, 0;
107 is $info->slurpy, '@_';
112 for my $i (qw(aku soku zan)) {
113 push @fs, [$i => fun (:$sin, :$swift, :$slay) { $i }];
117 my $info = Function::Parameters::info $f;
118 is $info->keyword, 'fun';
119 is $info->invocant, undef;
120 is_deeply [$info->positional_required], [];
121 is scalar $info->positional_required, 0;
122 is_deeply [$info->positional_optional], [];
123 is scalar $info->positional_optional, 0;
124 is_deeply [$info->named_required], [qw($sin $swift $slay)];
125 is scalar $info->named_required, 3;
126 is_deeply [$info->named_optional], [];
127 is scalar $info->named_optional, 0;
128 is $info->slurpy, undef;