Commit | Line | Data |
a4c13d40 |
1 | #!perl |
2 | use warnings FATAL => 'all'; |
3 | use strict; |
4 | |
5 | use Test::More |
52c18b0f |
6 | eval { require Moose::Util; 1 } |
a4c13d40 |
7 | ? (tests => 49) |
8 | : (skip_all => "Moose required for testing types") |
9 | ; |
10 | use Test::Fatal; |
11 | |
12 | use Function::Parameters qw(:strict); |
13 | |
52c18b0f |
14 | fun foo(('Int') $n, ('CodeRef') $f, $x) { |
a4c13d40 |
15 | $x = $f->($x) for 1 .. $n; |
16 | $x |
17 | } |
18 | |
19 | is foo(0, fun {}, undef), undef; |
20 | is foo(0, fun {}, "o hai"), "o hai"; |
21 | is foo(3, fun ($x) { "($x)" }, 1.5), "(((1.5)))"; |
52c18b0f |
22 | is foo(3, fun (('Str') $x) { "($x)" }, 1.5), "(((1.5)))"; |
a4c13d40 |
23 | |
24 | { |
25 | my $info = Function::Parameters::info \&foo; |
26 | is $info->invocant, undef; |
27 | is $info->slurpy, undef; |
28 | is $info->positional_optional, 0; |
29 | is $info->named_required, 0; |
30 | is $info->named_optional, 0; |
31 | my @req = $info->positional_required; |
32 | is @req, 3; |
33 | is $req[0]->name, '$n'; |
34 | ok $req[0]->type->equals('Int'); |
35 | is $req[1]->name, '$f'; |
36 | ok $req[1]->type->equals('CodeRef'); |
37 | is $req[2]->name, '$x'; |
38 | is $req[2]->type, undef; |
39 | } |
40 | |
41 | like exception { foo("ermagerd", fun {}, undef) }, qr/\bparameter 1.+\$n\b.+\bValidation failed\b.+\bInt\b.+ermagerd/; |
42 | like exception { foo(0, {}, undef) }, qr/\bparameter 2.+\$f\b.+\bValidation failed\b.+\bCodeRef\b/; |
43 | |
52c18b0f |
44 | fun bar( |
45 | ( |
46 | do { |
47 | require Moose; |
48 | (Function::Parameters::info(\&foo)->positional_required)[0]->type |
49 | } |
50 | ) $whoa |
51 | ) { $whoa * 2 } |
a4c13d40 |
52 | |
53 | is bar(21), 42; |
54 | { |
55 | my $info = Function::Parameters::info \&bar; |
56 | is $info->invocant, undef; |
57 | is $info->slurpy, undef; |
58 | is $info->positional_optional, 0; |
59 | is $info->named_required, 0; |
60 | is $info->named_optional, 0; |
61 | my @req = $info->positional_required; |
62 | is @req, 1; |
63 | is $req[0]->name, '$whoa'; |
64 | ok $req[0]->type->equals('Int'); |
65 | } |
66 | |
67 | { |
52c18b0f |
68 | my $info = Function::Parameters::info(fun ( (q~ArrayRef [ Int | CodeRef ]~ )@nom) {}); |
a4c13d40 |
69 | is $info->invocant, undef; |
70 | is $info->positional_required, 0; |
71 | is $info->positional_optional, 0; |
72 | is $info->named_required, 0; |
73 | is $info->named_optional, 0; |
74 | my $slurpy = $info->slurpy; |
75 | is $slurpy->name, '@nom'; |
76 | ok $slurpy->type->equals(Moose::Util::TypeConstraints::find_or_parse_type_constraint('ArrayRef[Int|CodeRef]')); |
77 | } |
78 | |
79 | { |
80 | my $phase = 'runtime'; |
81 | BEGIN { $phase = 'A'; } |
82 | fun |
83 | baz |
84 | ( |
85 | ( |
86 | is |
87 | ( |
88 | $phase |
89 | ++ |
90 | , |
91 | 'A' |
92 | ) |
93 | , |
94 | 'Int' |
95 | ) |
96 | : |
97 | $marco |
98 | , |
99 | ( |
100 | is |
101 | ( |
102 | $phase |
103 | ++ |
104 | , |
105 | 'B' |
106 | ) |
107 | , |
108 | q |
109 | $ArrayRef[Str]$ |
110 | ) |
111 | : |
112 | $polo |
113 | ) |
114 | { |
115 | [ |
116 | $marco |
117 | , |
118 | $polo |
119 | ] |
120 | } |
121 | BEGIN { is $phase, 'C'; } |
122 | is $phase, 'runtime'; |
123 | |
124 | is_deeply baz(polo => [qw(foo bar baz)], marco => 11), [11, [qw(foo bar baz)]]; |
125 | |
126 | my $info = Function::Parameters::info \&baz; |
127 | is $info->invocant, undef; |
128 | is $info->slurpy, undef; |
129 | is $info->positional_required, 0; |
130 | is $info->positional_optional, 0; |
131 | is $info->named_optional, 0; |
132 | my @req = $info->named_required; |
133 | is @req, 2; |
134 | is $req[0]->name, '$marco'; |
135 | ok $req[0]->type->equals('Int'); |
136 | is $req[1]->name, '$polo'; |
137 | ok $req[1]->type->equals('ArrayRef[Str]'); |
138 | } |