remove redundant '; 1' after require
[p5sagit/Function-Parameters.git] / t / info.t
1 #!perl
2 use warnings FATAL => 'all';
3 use strict;
4
5 use Test::More
6         eval { require Moo }
7         ? (tests => 122)
8         : (skip_all => "Moo required for testing parameter introspection")
9 ;
10
11 use Function::Parameters;
12
13 sub Inf () { 0 + 'Inf' }
14
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';
30         is $info->args_min, 2;
31         is $info->args_max, Inf;
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;
47         is $info->args_min, 5;
48         is $info->args_max, Inf;
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';
72         is $info->args_min, 1;
73         is $info->args_max, Inf;
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;
89         is $info->args_min, 1;
90         is $info->args_max, 1;
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, '@_';
107         is $info->args_min, 0;
108         is $info->args_max, Inf;
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, '@_';
124         is $info->args_min, 1;
125         is $info->args_max, Inf;
126 }
127
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;
147                 is $info->args_min, 6;
148                 is $info->args_max, Inf;
149                 is $f->(), $i;
150         }
151 }