-
Notifications
You must be signed in to change notification settings - Fork 135
/
is-copy.t
136 lines (114 loc) · 3.06 KB
/
is-copy.t
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
use v6;
use Test;
# L<S06/"Parameter traits"/"=item is copy">
# should be moved with other subroutine tests?
plan 27;
{
sub foo($a is copy) {
$a = 42;
return 19;
}
my $bar = 23;
is $bar, 23, "basic sanity";
is foo($bar), 19, "calling a sub with an is copy param";
is $bar, 23, "sub did not change our variable";
}
{
sub copy_tester ($copy_tester is copy = 5, $bar is copy = 10) {
$copy_tester += $bar;
$copy_tester;
}
is(copy_tester(), 15, 'calling without arguments');
is(copy_tester(10), 20, 'calling with one argument');
is(copy_tester(10, 15), 25, 'calling with two arguments');
my ($baz, $quux) = (10, 15);
is(copy_tester($baz), 20, 'calling with one argument');
is($baz, 10, 'variable was not affected');
is(copy_tester($baz, $quux), 25, 'calling with two arguments');
is($baz, 10, 'variable was not affected');
}
# is copy with arrays
{
sub array_test(@testc is copy) {
is(@testc[0], 1, 'array copied correctly by is copy');
@testc[0] = 123;
is(@testc[0], 123, 'can modify array copied by is copy...');
};
my @test = (1, 2, 3);
array_test(@test);
is(@test[0], 1, '...and original is unmodified.');
}
# is copy with hashes
{
sub hash_test(%h is copy) {
is(%h<x>, 1, 'hash copied correctly by is copy');
%h<x> = 123;
is(%h<x>, 123, 'can modify hash copied by is copy...');
};
my %test = (x => 1);
hash_test(%test);
is(%test<x>, 1, '...and original is unmodified.');
}
# RT #76242
{
sub t(@a is copy) {
my $x = 0;
$x++ for @a;
$x;
}
my $a = [1, 2, 3];
is t($a), 3, 'passing [1,2,3] to @a is copy does results in three array items';
}
# RT #76804
{
sub f($arg is copy) {
my $other;
($arg, $other) = 5, 6;
$arg;
};
is f(0), 5, 'list assignment (0)';
is f(1), 5, 'list assignment (1)';
}
# RT #74454
{
sub g(%hash? is copy) { }; #OK not used
lives-ok { g() }, 'can call a sub with an optional "is copy" hash param';
}
# RT #75302
{
sub h($x is copy) {
$x = 'abc';
$x
}
is h(*), 'abc', 'can re-assign to "is copy" parameter that held a Whatever';
}
# RT #82810
{
sub j(@a is copy) { @a ||= -1, -1, +1, +1; @a.join(',') }
is j([1, 2, 3, 4]), '1,2,3,4', 'can use ||= on "is copy" array';
}
# RT #74430
{
sub foo(@items is copy) { @items[0..^1] };
my @items = 'a'...'g';
is foo(@items), 'a', 'can slice "is copy" arrays';
}
# RT #117583
# the redeclaration thingy is only a warning
eval-lives-ok 'sub f ($x is copy) { my $x }';
# RT #118183
{
sub a ($a is copy) { $a = 5 }
is a(1), 5, 'Simple, easily inlinable, sub with copy trait not broken';
}
# RT #122220
{
sub a (@list is copy, $l = @list.elems) {
@list.elems ~ '-' ~ $l;
}
is a(<a b c d e f g>), '7-7',
'dependent default parameter in sub with \'@list is copy\' updated (1)';
is a(<a b c>), '3-3',
'dependent default parameter in sub with \'@list is copy\' updated (2)';
}
# vim: ft=perl6