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