/
can.t
120 lines (100 loc) 路 3.44 KB
/
can.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
use v6;
use Test;
=begin pod
Tests for can.
=end pod
plan 29;
# L<S12/"Introspection"/Unlike in Perl 5 where .can returns a single Code object>
lives-ok { Str.can("split") }, "method can on built-in Str works";
ok "foo".can("split"), "methd can on built-in Str gives correct result if method found";
ok "foo".can("split") ~~ Positional, '.can returns something Positional';
ok !"foo".can("hazcheezburger"), "methd can on built-in Str gives correct result if method not found";
ok "bar".^can("split"), "calling ^can also works";
ok "x".HOW.can("x", "split"), "and also through the HOW";
ok Str.can("split"), "can call on the proto-object too";
ok !Str.can("hazcheezburger"), "can call on the proto-object too";
class Dog {
method bark {
"bow";
}
}
my $dog = Dog.new;
lives-ok { $dog.can("bark") }, "method can on custom class works";
ok $dog.can("bark"), "method can on custom class gives correct result if method found (on instance)";
ok !$dog.can("w00f"), "method can on custom class gives correct result if method not found (on instance)";
ok Dog.can("bark"), "method can on custom class gives correct result if method found (on proto)";
ok !Dog.can("w00f"), "method can on custom class gives correct result if method not found (on proto)";
my $meth = $dog.can("bark");
is $meth[0]($dog), "bow", "the result for can contains an invokable, giving us the sub (on instance)";
$meth = Dog.can("bark");
is $meth[0](Dog), "bow", "the result for can contains an invokable, giving us the sub (on proto)";
{
my $iters = 0;
my $found = "";
for $dog.can("bark") -> $meth {
$found ~= $meth($dog);
$iters++;
}
is $iters, 1, "had right number of methods found (on instance)";
is $found, "bow", "got right method called (on instance)";
}
{
my $iters = 0;
my $found = "";
for Dog.can("bark") -> $meth {
$found ~= $meth($dog);
$iters++;
}
is $iters, 1, "had right number of methods found (on proto)";
is $found, "bow", "got right method called (on proto)";
}
class Puppy is Dog {
method bark {
"yap";
}
}
my $pup = Puppy.new();
{
my $iters = 0;
my $found = "";
for $pup.can("bark") -> $meth {
$found ~= $meth($pup);
$iters++;
}
is $iters, 2, "subclass had right number of methods found (on instance)";
is $found, "yapbow", "subclass got right methods called (on instance)";
}
{
my $iters = 0;
my $found = "";
for Puppy.can("bark") -> $meth {
$found ~= $meth($pup);
$iters++;
}
is $iters, 2, "subclass had right number of methods found (on proto)";
is $found, "yapbow", "subclass got right methods called (on proto)";
}
# RT #76584
ok Str.can('split') ~~ /split/, 'return value of .can stringifies sensibly';
{
# RT #76882
my class A {
method b() { 'butterfly' }
}
sub callit($invocant, $method) { $method($invocant) };
is callit(A.new, A.^can('b')[0]), 'butterfly',
'can call method reference outside the class';
}
{
# RT #123621
my class A {
submethod x() { 42 }
}
ok A.^can("x"), 'submethods found by .^can';
ok A.can("x"), 'submethods found by .can';
class B is A {
}
nok B.^can("x"), 'submethods from base classes not bogusly found by .^can';
nok B.can("x"), 'submethods from base classes not bogusly found by .can';
}
# vim: ft=perl6