record and extract metadata
[p5sagit/Function-Parameters.git] / t / info.t
1 #!perl
2 use warnings FATAL => 'all';
3 use strict;
4
5 use Test::More tests => 68;
6
7 use Function::Parameters;
8
9 fun foo($pr1, $pr2, $po1 = 1, $po2 = 2, :$no1 = 3, :$no2 = 4, %r) {}
10
11 {
12         my $info = Function::Parameters::info \&foo;
13         is $info->keyword, 'fun';
14         is $info->invocant, undef;
15         is_deeply [$info->positional_required], [qw($pr1 $pr2)];
16         is scalar $info->positional_required, 2;
17         is_deeply [$info->positional_optional], [qw($po1 $po2)];
18         is scalar $info->positional_optional, 2;
19         is_deeply [$info->named_required], [];
20         is scalar $info->named_required, 0;
21         is_deeply [$info->named_optional], [qw($no1 $no2)];
22         is scalar $info->named_optional, 2;
23         is $info->slurpy, '%r';
24 }
25
26 {
27         my $info = Function::Parameters::info fun ($pr1, :$nr1, :$nr2) {};
28         is $info->keyword, 'fun';
29         is $info->invocant, undef;
30         is_deeply [$info->positional_required], [qw($pr1)];
31         is scalar $info->positional_required, 1;
32         is_deeply [$info->positional_optional], [];
33         is scalar $info->positional_optional, 0;
34         is_deeply [$info->named_required], [qw($nr1 $nr2)];
35         is scalar $info->named_required, 2;
36         is_deeply [$info->named_optional], [];
37         is scalar $info->named_optional, 0;
38         is $info->slurpy, undef;
39 }
40
41 sub bar {}
42
43 is Function::Parameters::info(\&bar), undef;
44
45 is Function::Parameters::info(sub {}), undef;
46
47 method baz($class: $po1 = 1, $po2 = 2, $po3 = 3, :$no1 = 4, @rem) {}
48
49 {
50         my $info = Function::Parameters::info \&baz;
51         is $info->keyword, 'method';
52         is $info->invocant, '$class';
53         is_deeply [$info->positional_required], [];
54         is scalar $info->positional_required, 0;
55         is_deeply [$info->positional_optional], [qw($po1 $po2 $po3)];
56         is scalar $info->positional_optional, 3;
57         is_deeply [$info->named_required], [];
58         is scalar $info->named_required, 0;
59         is_deeply [$info->named_optional], [qw($no1)];
60         is scalar $info->named_optional, 1;
61         is $info->slurpy, '@rem';
62 }
63
64 {
65         my $info = Function::Parameters::info method () {};
66         is $info->keyword, 'method';
67         is $info->invocant, '$self';
68         is_deeply [$info->positional_required], [];
69         is scalar $info->positional_required, 0;
70         is_deeply [$info->positional_optional], [];
71         is scalar $info->positional_optional, 0;
72         is_deeply [$info->named_required], [];
73         is scalar $info->named_required, 0;
74         is_deeply [$info->named_optional], [];
75         is scalar $info->named_optional, 0;
76         is $info->slurpy, undef;
77 }
78
79 {
80         use Function::Parameters { proc => 'function' };
81         my $info = Function::Parameters::info proc {};
82         is $info->keyword, 'proc';
83         is $info->invocant, undef;
84         is_deeply [$info->positional_required], [];
85         is scalar $info->positional_required, 0;
86         is_deeply [$info->positional_optional], [];
87         is scalar $info->positional_optional, 0;
88         is_deeply [$info->named_required], [];
89         is scalar $info->named_required, 0;
90         is_deeply [$info->named_optional], [];
91         is scalar $info->named_optional, 0;
92         is $info->slurpy, '@_';
93 }
94
95 {
96         my $info = Function::Parameters::info method {};
97         is $info->keyword, 'method';
98         is $info->invocant, '$self';
99         is_deeply [$info->positional_required], [];
100         is scalar $info->positional_required, 0;
101         is_deeply [$info->positional_optional], [];
102         is scalar $info->positional_optional, 0;
103         is_deeply [$info->named_required], [];
104         is scalar $info->named_required, 0;
105         is_deeply [$info->named_optional], [];
106         is scalar $info->named_optional, 0;
107         is $info->slurpy, '@_';
108 }
109