-
Notifications
You must be signed in to change notification settings - Fork 135
/
walk.t
111 lines (92 loc) · 2.09 KB
/
walk.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
use v6;
use Test;
plan 11;
=begin pod
Tests for WALK, defined in L<S12/Calling sets of methods>
=end pod
#L<S12/Calling sets of methods>
class A {
method m { 'A' }
}
class B {
method m { 'B' }
}
class C is A is B {
method m { 'C' }
method n { 'OH NOES' }
}
class D is A {
method m { 'D' }
}
class E is C is D {
method m { 'E' }
}
sub cand_order(@cands, $instance) {
my $result = '';
for @cands -> $cand {
$result ~= $cand($instance);
}
$result
}
# :canonical
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :canonical);
is cand_order(@cands, $x), 'ECDAB', ':canonical (explicit) works';
@cands = $x.WALK(:name<m>);
is cand_order(@cands, $x), 'ECDAB', ':canonical (as default) works';
}
# :super
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :super);
is cand_order(@cands, $x), 'CD', ':super works';
}
# :breadth
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :breadth);
is cand_order(@cands, $x), 'ECDAB', ':breadth works';
}
# :descendant
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :descendant);
is cand_order(@cands, $x), 'ABCDE', ':descendant works';
}
# :ascendant
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :ascendant);
is cand_order(@cands, $x), 'ECABD', ':ascendant works';
}
# :preorder
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :preorder);
is cand_order(@cands, $x), 'ECABD', ':preorder works';
}
# :omit
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :omit({ .^can('n') }));
is cand_order(@cands, $x), 'DAB', ':omit works';
}
# :include
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :include({ $^c.gist ~~ regex { <[CDE]> } }));
is cand_order(@cands, $x), 'ECD', ':include works';
}
# :include and :omit
{
my $x = E.new;
my @cands = $x.WALK(:name<m>, :include({ $^c.gist ~~ regex { <[CDE]> } }), :omit({ .^can('n') }));
is cand_order(@cands, $x), 'D', ':include and :omit together work';
}
# Grammar.WALK had issues once
{
my ($meth) = Grammar.WALK(:name<parse>);
is $meth.name, 'parse', 'Grammar.WALK works';
}
# vim: ft=perl6