-
Notifications
You must be signed in to change notification settings - Fork 135
/
lists.t
151 lines (119 loc) · 3.71 KB
/
lists.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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
use v6;
use MONKEY-TYPING;
use Test;
# L<S02/Lists>
plan 29;
# Indexing lists
# RT #105368
{
my $foo = 42;
try { ($foo, "does_not_matter")[0] = 23 };
is $foo, 23, "assigning a list element changed the original variable";
}
{
my $foo = 42;
is ($foo, "does_not_matter")[*-2], 42,
"indexing lists by a negative index works correctly";
throws-like q/sub foo { @_[-1] }/, X::Obsolete,
"indexing lists by explicit negative index is parsefail (compact)";
throws-like q/sub foo { @_[ -42 ] }/, X::Obsolete,
"indexing lists by explicit negative index is parsefail (spaced)";
throws-like q/sub foo { @_[0..-1] }/, X::Obsolete,
"indexing lists by range ending with negative index is parsefail (compact)";
throws-like q/sub foo { @_[ 0 .. -42 ] }/, X::Obsolete,
"indexing lists by range ending with negative index is parsefail (spaced)";
throws-like { EVAL q/my @a = <one two>; @a[*-3] = 'zero'/ },
X::OutOfRange,
"indexing lists by an effective negative index with * dies";
}
# List construction does not create new containers
{
my $foo = 42;
ok ($foo, "does_not_matter")[0] =:= $foo,
"list construction should not create new containers";
}
{
my $foo = 42;
ok ($foo, "does_not_matter", 17)[0,1][0] =:= $foo,
"list construction and list slicing should not create new containers";
}
# Lists as lvalues
{
my $foo = 42;
my $bar = 43;
($foo, $bar) = (23, 24);
ok $foo == 23 && $bar eq 24,
"using lists as lvalues works";
}
{
my $foo = 42;
lives-ok { ($foo, *) = (23, 24) },
"using lists with embedded Whatevers as lvalues works (1)";
ok $foo == 23,
"using lists with embedded Whatevers as lvalues works (2)";
}
# List slices as lvalues
{
my $foo = 42;
my $bar = 43;
try { ($foo, 42, $bar, 19)[0, 2] = (23, 24) };
ok $foo == 23 && $bar == 24,
"using list slices as lvalues works (1)";
throws-like { ($foo, 42, $bar, 19)[1, 3] = (23, 24) },
X::Assignment::RO,
"using list slices as lvalues works (2)";
}
# Lists as lvalues used to swap variables
{
my $foo = 42;
my $bar = 23;
($foo, $bar) = ($bar, $foo);
ok $foo == 23 && $bar == 42,
"using lists as lvalues to swap two variables works";
}
{
my $foo = 1;
my $bar = 2;
my $baz = 3;
($foo, $bar, $baz) = ($baz, $foo, $bar);
ok $foo == 3 && $bar == 1 && $baz == 2,
"using lists as lvalues to swap three variables works";
}
{
my @array = (1,2,3);
my $capture = \(@array);
is +$capture, 1, '\(@array) creates a capture (1)';
is +$capture[0], 3, '\(@array) creates a capture (2)';
}
{
sub List::rt62836 { 62836 }
throws-like { <1 2 3>.rt62836 },
X::Method::NotFound,
'call to user-declared sub in List:: class dies';
try { EVAL '<1 2 3>.rt62836' };
ok "$!" ~~ /rt62836/, 'error message contains name of sub';
ok "$!" ~~ /List/, 'error message contains name of class';
augment class List { method rt62836_x { 62836 } };
is <1 2 3>.rt62836_x, 62836, 'call user-declared method in List:: class';
}
# RT #66304
{
my $rt66304 = (1, 2, 4);
isa-ok $rt66304, List, 'List assigned to scalar is-a List';
is( $rt66304.WHAT.perl, (1, 2, 4).WHAT.perl,
'List.WHAT is the same as .WHAT of list assigned to scalar' );
throws-like { $rt66304[1] = 'ro' },
X::Assignment::RO,
'literal List element is immutable';
is $rt66304, (1, 2, 4), 'List is not changed by attempted assignment';
}
{
my $x = List.new('bacon');
my $y = $x.Str;
my $z = $x.Str;
is $y, 'bacon', "3rd-party reification of List doesn't duplicate rest";
is $z, 'bacon', "3rd-party reification of List doesn't duplicate rest";
}
# RT #112216
is 'foo'[2..*].elems, 0, 'can range-index a Str with infinite range';
# vim: ft=perl6