/
context.t
122 lines (98 loc) 路 4.23 KB
/
context.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
use v6;
use Test;
plan 38;
# L<S03/List prefix precedence/The list contextualizer>
{
my $a = 3;
my $b = 2;
my $c = 1;
# I'm not sure that smart matching is the best operation for comparison here
# There might be a more specific way to check that prevents false matching
isa-ok(list($a).WHAT, List, 'list(values) returns nothing more than a List');
isa-ok(@($a).WHAT, List, '@(values) returns nothing more than a List');
isa-ok((list $a).WHAT, List, '(list values) returns nothing more than a List');
# These are all no-ops but still need to work correctly
isa-ok(list($a, $b, $c).WHAT, List, 'list(values) returns nothing more than a List');
isa-ok(@($a, $b, $c).WHAT, List, '@(values) returns nothing more than a List');
isa-ok((list $a, $b, $c).WHAT, List, '(list values) returns nothing more than a List');
is((list $a, $b, $c), ($a, $b, $c), 'list($a, $b, $c) is ($a, $b, $c)');
is(@($a, $b, $c), ($a, $b, $c), '@($a, $b, $c) is ($a, $b, $c)');
# Test the only difference between @() and list()
is(list(), (), 'list() should return an empty list');
'foo' ~~ /(o)o/; # run a regex so we have $/ below
is(@(), @($/), '@() should be the same as @($/)');
}
# L<S03/List prefix precedence/The item contextualizer>
# L<S02/Lists/To force a non-flattening item context>
{
my $a = 3;
my $b = 2;
is((item $a).WHAT.gist, $a.WHAT.gist, '(item $a).WHAT matches $a.WHAT');
is((item $a), $a, 'item $a is just $a');
is(item($a), $a, 'item($a) is just $a');
is($($a), $a, '$($a) is just $a');
#?niecza skip 'Excess arguments to item, used 1 of 2 positionals'
isa-ok((item $a, $b).WHAT, Parcel, '(item $a, $b) makes a Parcel');
#?niecza skip 'Excess arguments to item, used 1 of 2 positionals'
isa-ok(item($a, $b).WHAT, Parcel, 'item $a, $b makes a Parcel');
#?niecza skip 'Excess arguments to item, used 1 of 2 positionals'
isa-ok($($a, $b).WHAT, Parcel, '$ $a, $b makes a Parcel');
my @array = ($a, $b);
#?niecza skip 'Excess arguments to item, used 1 of 2 positionals'
is((item $a, $b), @array, 'item($a, $b) is the same as <<$a $b>> in an array');
}
{
my @a = 1, 2;
my %b = 'x' => 42;
is-deeply [@a], [1, 2], '@array flattening';
is-deeply [item @a], [[1, 2]], 'item @array non-flattening';
is-deeply [%b], ['x' => 42], '%hash flattening';
is-deeply [item %b], [{'x' => 42}], 'item %hash non-flattening';
}
{
# Most of these tests pass in Rakudo, but we must compare with
# eqv instead of eq, since the order of hashes is not guaranteed
# with eq. eqv does guarantee the order.
# also, we assign to a hash since rakudo does not recognize
# {} as a hash constructor and () does not make a hash
ok(%('a', 1, 'b', 2) eqv {a => 1, b => 2}, '%(values) builds a hash');
ok(hash('a', 1, 'b', 2) eqv {a => 1, b => 2}, 'hash(values) builds a hash');
ok((hash 'a', 1, 'b', 2) eqv {a => 1, b => 2}, 'hash values builds a hash');
eval-dies-ok('hash("a")', 'building a hash of one item fails');
}
# L<S03/"Changes to Perl聽5 operators"/Perl 5's ${...}, @{...}, %{...}, etc>
# ^ non-breaking space
# Deprecated P5 dereferencing operators:
{
my $scalar = 'abcd';
eval-dies-ok('${$scalar}', 'Perl 5 form of ${$scalar} dies');
my $array = [1, 2, 3];
eval-dies-ok('@{$array}', 'Perl 5 form of @{$array} dies');
my $hash = {a => 1, b => 2, c => 3};
eval-dies-ok('%{$hash}', 'Perl 5 form of %{$hash} dies');
}
is(($).WHAT.gist, '(Any)', 'Anonymous $ variable can be declared');
is((@).WHAT.gist, '(Array)', 'Anonymous @ variable can be declared');
is((%).WHAT.gist, '(Hash)', 'Anonymous % variable can be declared');
is((++$), 1, 'Anonymous $ variable can be incremented');
is((@).push(42,43), '42 43', 'Anonymous @ variable can be pushed');
{
my @seq = map { $_ ~ ++$ }, <a b c>;
is @seq, <a1 b2 c3>, 'Anonymous $ is really a state variable';
}
# RT #76320
{
my $h = <a b c d>;
is ~%$h.keys.sort, 'a c', '%$var coercion';
my $c = 0;
$c++ for @$h;
is $c, 4, '@$var coercion';
}
#?niecza skip "Invalid hard reference syntax"
{
my @a = <a b c d>;
my $c = 0;
$c++ for $@a;
is $c, 1, '$@var itemization'
}
# vim: ft=perl6