remove redundant '; 1' after require
[p5sagit/Function-Parameters.git] / t / types_moose_2.t
CommitLineData
a4c13d40 1#!perl
2use warnings FATAL => 'all';
3use strict;
4
5use Test::More
8d34f4d9 6 eval { require Moose::Util }
a4c13d40 7 ? (tests => 49)
8 : (skip_all => "Moose required for testing types")
9;
10use Test::Fatal;
11
12use Function::Parameters qw(:strict);
13
52c18b0f 14fun foo(('Int') $n, ('CodeRef') $f, $x) {
a4c13d40 15 $x = $f->($x) for 1 .. $n;
16 $x
17}
18
19is foo(0, fun {}, undef), undef;
20is foo(0, fun {}, "o hai"), "o hai";
21is foo(3, fun ($x) { "($x)" }, 1.5), "(((1.5)))";
52c18b0f 22is 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
41like exception { foo("ermagerd", fun {}, undef) }, qr/\bparameter 1.+\$n\b.+\bValidation failed\b.+\bInt\b.+ermagerd/;
42like exception { foo(0, {}, undef) }, qr/\bparameter 2.+\$f\b.+\bValidation failed\b.+\bCodeRef\b/;
43
52c18b0f 44fun bar(
45 (
46 do {
47 require Moose;
48 (Function::Parameters::info(\&foo)->positional_required)[0]->type
49 }
50 ) $whoa
51) { $whoa * 2 }
a4c13d40 52
53is 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}