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