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