449474a58618819a51b550e1f029b109d74a1a6f
[p5sagit/Function-Parameters.git] / t / checkered_2.t
1 #!perl
2
3 use Test::More tests => 120;
4
5 use warnings FATAL => 'all';
6 use strict;
7
8 use Function::Parameters {
9         method => {
10                 check_argument_count => 1,
11                 shift => '$self',
12                 attrs => ':method',
13         },
14
15         cathod => {
16                 check_argument_count => 0,
17                 shift => '$self',
18                 attrs => ':method',
19         },
20
21         fun => 'function',
22 };
23
24 fun error_like($re, $body, $name = undef) {
25         local $@;
26         ok !eval { $body->(); 1 };
27         like $@, $re, $name;
28 }
29
30 method foo_any { [@_] }
31 method foo_any_a(@args) { [@args] }
32 method foo_any_b($x = undef, @rest) { [@_] }
33 method foo_0() { [@_] }
34 method foo_1($x) { [@_] }
35 method foo_2($x, $y) { [@_] }
36 method foo_3($x, $y, $z) { [@_] }
37 method foo_0_1($x = 'D0') { [$x] }
38 method foo_0_2($x = 'D0', $y = 'D1') { [$x, $y] }
39 method foo_0_3($x = 'D0', $y, $z = 'D2') { [$x, $y, $z] }
40 method foo_1_2($x, $y = 'D1') { [$x, $y] }
41 method foo_1_3($x, $y = 'D1', $z = 'D2') { [$x, $y, $z] }
42 method foo_2_3($x, $y, $z = 'D2') { [$x, $y, $z] }
43 method foo_1_($x, @y) { [@_] }
44
45 error_like qr/Not enough arguments.*foo_any/, sub { foo_any };
46 is_deeply foo_any('a'), [];
47 is_deeply foo_any('a', 'b'), ['b'];
48 is_deeply foo_any('a', 'b', 'c'), ['b', 'c'];
49 is_deeply foo_any('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
50
51 error_like qr/Not enough arguments.*foo_any_a/, sub { foo_any_a };
52 is_deeply foo_any_a('a'), [];
53 is_deeply foo_any_a('a', 'b'), ['b'];
54 is_deeply foo_any_a('a', 'b', 'c'), ['b', 'c'];
55 is_deeply foo_any_a('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
56
57 error_like qr/Not enough arguments.*foo_any_b/, sub { foo_any_b };
58 is_deeply foo_any_b('a'), [];
59 is_deeply foo_any_b('a', 'b'), ['b'];
60 is_deeply foo_any_b('a', 'b', 'c'), ['b', 'c'];
61 is_deeply foo_any_b('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
62
63 error_like qr/Not enough arguments.*foo_0/, sub { foo_0 };
64 is_deeply foo_0('a'), [];
65 error_like qr/Too many arguments.*foo_0/, sub { foo_0 'a', 'b' };
66 error_like qr/Too many arguments.*foo_0/, sub { foo_0 'a', 'b', 'c' };
67 error_like qr/Too many arguments.*foo_0/, sub { foo_0 'a', 'b', 'c', 'd' };
68
69 error_like qr/Not enough arguments.*foo_1/, sub { foo_1 };
70 error_like qr/Not enough arguments.*foo_1/, sub { foo_1 'a' };
71 is_deeply foo_1('a', 'b'), ['b'];
72 error_like qr/Too many arguments.*foo_1/, sub { foo_1 'a', 'b', 'c' };
73 error_like qr/Too many arguments.*foo_1/, sub { foo_1 'a', 'b', 'c', 'd' };
74
75 error_like qr/Not enough arguments.*foo_2/, sub { foo_2 };
76 error_like qr/Not enough arguments.*foo_2/, sub { foo_2 'a' };
77 error_like qr/Not enough arguments.*foo_2/, sub { foo_2 'a', 'b' };
78 is_deeply foo_2('a', 'b', 'c'), ['b', 'c'];
79 error_like qr/Too many arguments.*foo_2/, sub { foo_2 'a', 'b', 'c', 'd' };
80
81 error_like qr/Not enough arguments.*foo_3/, sub { foo_3 };
82 error_like qr/Not enough arguments.*foo_3/, sub { foo_3 'a' };
83 error_like qr/Not enough arguments.*foo_3/, sub { foo_3 'a', 'b' };
84 error_like qr/Not enough arguments.*foo_3/, sub { foo_3 'a', 'b', 'c' };
85 is_deeply foo_3('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
86 error_like qr/Too many arguments.*foo_3/, sub { foo_3 'a', 'b', 'c', 'd', 'e' };
87
88 error_like qr/Not enough arguments.*foo_0_1/, sub { foo_0_1 };
89 is_deeply foo_0_1('a'), ['D0'];
90 is_deeply foo_0_1('a', 'b'), ['b'];
91 error_like qr/Too many arguments.*foo_0_1/, sub { foo_0_1 'a', 'b', 'c' };
92 error_like qr/Too many arguments.*foo_0_1/, sub { foo_0_1 'a', 'b', 'c', 'd' };
93
94 error_like qr/Not enough arguments.*foo_0_2/, sub { foo_0_2 };
95 is_deeply foo_0_2('a'), ['D0', 'D1'];
96 is_deeply foo_0_2('a', 'b'), ['b', 'D1'];
97 is_deeply foo_0_2('a', 'b', 'c'), ['b', 'c'];
98 error_like qr/Too many arguments.*foo_0_2/, sub { foo_0_2 'a', 'b', 'c', 'd' };
99
100 error_like qr/Not enough arguments.*foo_0_3/, sub { foo_0_3 };
101 is_deeply foo_0_3('a'), ['D0', undef, 'D2'];
102 is_deeply foo_0_3('a', 'b'), ['b', undef, 'D2'];
103 is_deeply foo_0_3('a', 'b', 'c'), ['b', 'c', 'D2'];
104 is_deeply foo_0_3('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
105 error_like qr/Too many arguments.*foo_0_3/, sub { foo_0_3 'a', 'b', 'c', 'd', 'e' };
106
107 error_like qr/Not enough arguments.*foo_1_2/, sub { foo_1_2 };
108 error_like qr/Not enough arguments.*foo_1_2/, sub { foo_1_2 'a' };
109 is_deeply foo_1_2('a', 'b'), ['b', 'D1'];
110 is_deeply foo_1_2('a', 'b', 'c'), ['b', 'c'];
111 error_like qr/Too many arguments.*foo_1_2/, sub { foo_1_2 'a', 'b', 'c', 'd' };
112
113 error_like qr/Not enough arguments.*foo_1_3/, sub { foo_1_3 };
114 error_like qr/Not enough arguments.*foo_1_3/, sub { foo_1_3 'a' };
115 is_deeply foo_1_3('a', 'b'), ['b', 'D1', 'D2'];
116 is_deeply foo_1_3('a', 'b', 'c'), ['b', 'c', 'D2'];
117 is_deeply foo_1_3('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
118 error_like qr/Too many arguments.*foo_1_3/, sub { foo_1_3 'a', 'b', 'c', 'd', 'e' };
119
120 error_like qr/Not enough arguments.*foo_2_3/, sub { foo_2_3 };
121 error_like qr/Not enough arguments.*foo_2_3/, sub { foo_2_3 'a' };
122 error_like qr/Not enough arguments.*foo_2_3/, sub { foo_2_3 'a', 'b' };
123 is_deeply foo_2_3('a', 'b', 'c'), ['b', 'c', 'D2'];
124 is_deeply foo_2_3('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
125 error_like qr/Too many arguments.*foo_2_3/, sub { foo_2_3 'a', 'b', 'c', 'd', 'e' };
126
127 error_like qr/Not enough arguments.*foo_1_/, sub { foo_1_ };
128 error_like qr/Not enough arguments.*foo_1_/, sub { foo_1_ 'a' };
129 is_deeply foo_1_('a', 'b'), ['b'];
130 is_deeply foo_1_('a', 'b', 'c'), ['b', 'c'];
131 is_deeply foo_1_('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
132
133
134 cathod puppy($eyes) { [@_] }
135 cathod frog($will, $never) { $will * 3 + (pop) - $never }
136
137 is_deeply puppy, [];
138 is_deeply puppy('a'), [];
139 is_deeply puppy('a', 'b'), ['b'];
140 is_deeply puppy('a', 'b', 'c'), ['b', 'c'];
141 is_deeply puppy('a', 'b', 'c', 'd'), ['b', 'c', 'd'];
142
143 is +main->frog(7, 4, 1), 18;
144 is +main->frog(7, 4), 21;