fc771c3dc212e20f9b36a41539c245f07ec6855c
[p5sagit/Function-Parameters.git] / t / defaults.t
1 #!perl
2
3 use Test::More tests => 46;
4
5 use warnings FATAL => 'all';
6 use strict;
7
8 use Function::Parameters {
9         fun => {
10                 default_arguments => 1,
11         },
12
13         nofun => {
14                 default_arguments => 0,
15         },
16 };
17
18 fun foo0($x, $y = 1, $z = 3) { $x * 5 + $y * 2 + $z }
19
20 is foo0(10), 55;
21 is foo0(5, -2), 24;
22 is foo0(6, 10, 1), 51;
23
24 is fun ($answer = 42) { $answer }->(), 42;
25
26 fun sharingan($input, $x = [], $y = {}) {
27         push @$x, $input;
28         $y->{$#$x} = $input;
29         $x, $y
30 }
31
32 {
33         is_deeply [sharingan 'e'], [['e'], {0 => 'e'}];
34         my $sneaky = ['ants'];
35         is_deeply [sharingan $sneaky], [[['ants']], {0 => ['ants']}];
36         unshift @$sneaky, 'thanks';
37         is_deeply [sharingan $sneaky], [[['thanks', 'ants']], {0 => ['thanks', 'ants']}];
38         @$sneaky = 'thants';
39         is_deeply [sharingan $sneaky], [[['thants']], {0 => ['thants']}];
40 }
41
42 is eval('fun ($x, $y = $powersauce) {}'), undef;
43 like $@, qr/^Global symbol.*explicit package name/;
44
45 {
46         my $d = 'outer';
47         my $f;
48         {
49                 my $d = 'herp';
50                 fun guy($d = $d, $x = $d . '2') {
51                         return [$d, $x];
52                 }
53
54                 is_deeply guy('a', 'b'), ['a', 'b'];
55                 is_deeply guy('c'), ['c', 'c2'];
56                 is_deeply guy, ['herp', 'herp2'];
57
58                 $d = 'ort';
59                 is_deeply guy('a', 'b'), ['a', 'b'];
60                 is_deeply guy('c'), ['c', 'c2'];
61                 is_deeply guy, ['ort', 'ort2'];
62
63                 my $g = fun ($alarum = $d) { "[$alarum]" };
64                 is $g->(""), "[]";
65                 is $g->(), "[ort]";
66
67                 $d = 'flowerpot';
68                 is_deeply guy('bloodstain'), ['bloodstain', 'bloodstain2'];
69                 is $g->(), "[flowerpot]";
70
71                 $f = $g;
72         }
73
74         is $f->(), "[flowerpot]";
75         is $f->("Q"), "[Q]";
76 }
77
78 {
79         my $c = 0;
80         fun edelweiss($x = $c++) :(;$) { $x }
81 }
82
83 is edelweiss "AAAAA", "AAAAA";
84 is_deeply edelweiss [], [];
85 is edelweiss, 0;
86 is edelweiss, 1;
87 is_deeply edelweiss {}, {};
88 is edelweiss 0, 0;
89 is edelweiss, 2;
90
91 for my $f (fun ($wtf = return 'ohi') { "~$wtf" }) {
92         is $f->(""), "~";
93         is $f->("a"), "~a";
94         is $f->(), "ohi";
95 }
96
97 is eval('fun (@x = 42) {}'), undef;
98 like $@, qr/default value/;
99
100 is eval('fun ($x, %y = ()) {}'), undef;
101 like $@, qr/default value/;
102
103 is eval('nofun ($x = 42) {}'), undef;
104 like $@, qr/nofun.*unexpected.*=.*parameter/;
105
106
107 {
108         my $var = "outer";
109
110         fun scope_check(
111                 $var,  # inner
112                 $snd = "${var}2",  # initialized from $var)
113                 $both = "$var and $snd",
114         ) {
115                 return $var, $snd, $both;
116         }
117
118         is_deeply [scope_check 'A'],      ['A', 'A2', 'A and A2'];
119         is_deeply [scope_check 'B', 'C'], ['B', 'C', 'B and C'];
120         is_deeply [scope_check 4, 5, 6],  [4, 5, 6];
121
122         is eval('fun ($QQQ = $QQQ) {}; 1'), undef;
123         like $@, qr/Global symbol.*\$QQQ.*explicit package name/;
124
125
126         use Function::Parameters { method => 'method' };
127
128         method mscope_check(
129                 $var,  # inner
130                 $snd = "${var}2",  # initialized from $var
131                 $both = "($self) $var and $snd",  # and $self!
132         ) {
133                 return $self, $var, $snd, $both;
134         }
135
136         is_deeply [mscope_check '$x', 'A'],      ['$x', 'A', 'A2', '($x) A and A2'];
137         is_deeply [mscope_check '$x', 'B', 'C'], ['$x', 'B', 'C', '($x) B and C'];
138         is_deeply [mscope_check '$x', 4, 5, 6],  ['$x', 4, 5, 6];
139 }