Merge branch 'master' into metadata
[p5sagit/Function-Parameters.git] / t / info.t
1 #!perl
2 use warnings FATAL => 'all';
3 use strict;
4
5 use Test::More tests => 122;
6
7 use Function::Parameters;
8
9 sub Inf () { 0 + 'Inf' }
10
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';
26         is $info->args_min, 2;
27         is $info->args_max, Inf;
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;
43         is $info->args_min, 5;
44         is $info->args_max, Inf;
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';
68         is $info->args_min, 1;
69         is $info->args_max, Inf;
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;
85         is $info->args_min, 1;
86         is $info->args_max, 1;
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, '@_';
103         is $info->args_min, 0;
104         is $info->args_max, Inf;
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, '@_';
120         is $info->args_min, 1;
121         is $info->args_max, Inf;
122 }
123
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;
143                 is $info->args_min, 6;
144                 is $info->args_max, Inf;
145                 is $f->(), $i;
146         }
147 }