Merge branch 'master' into metadata
[p5sagit/Function-Parameters.git] / t / info.t
CommitLineData
53c979f0 1#!perl
2use warnings FATAL => 'all';
3use strict;
4
ebdc721b 5use Test::More tests => 122;
53c979f0 6
7use Function::Parameters;
8
ebdc721b 9sub Inf () { 0 + 'Inf' }
10
53c979f0 11fun 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';
ebdc721b 26 is $info->args_min, 2;
27 is $info->args_max, Inf;
53c979f0 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;
ebdc721b 43 is $info->args_min, 5;
44 is $info->args_max, Inf;
53c979f0 45}
46
47sub bar {}
48
49is Function::Parameters::info(\&bar), undef;
50
51is Function::Parameters::info(sub {}), undef;
52
53method 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';
ebdc721b 68 is $info->args_min, 1;
69 is $info->args_max, Inf;
53c979f0 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;
ebdc721b 85 is $info->args_min, 1;
86 is $info->args_max, 1;
53c979f0 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, '@_';
ebdc721b 103 is $info->args_min, 0;
104 is $info->args_max, Inf;
53c979f0 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, '@_';
ebdc721b 120 is $info->args_min, 1;
121 is $info->args_max, Inf;
53c979f0 122}
123
33bb66c0 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;
ebdc721b 143 is $info->args_min, 6;
144 is $info->args_max, Inf;
33bb66c0 145 is $f->(), $i;
146 }
147}