-
Notifications
You must be signed in to change notification settings - Fork 135
/
open.t
73 lines (57 loc) · 1.76 KB
/
open.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
use v6;
use MONKEY-TYPING;
use Test;
plan 10;
# L<S12/Open vs Closed Classes>
class Something {
has $.attribute;
method in_Something { 'a' ~ $.attribute };
}
my $x = Something.new(attribute => 'b');
is $x.in_Something, 'ab', 'basic OO sanity';
# although we use curlies here to be better fudge-able, remeber
# that 'augment' class extensions are *not* lexically scoped
{
augment class Something {
method later_added {
'later'
}
method uses-other-methods {
'blubb|' ~ self.in_Something;
}
}
my $y = Something.new(attribute => 'c');
is $y.later_added, 'later', 'can call method that was later added';
is $y.uses-other-methods, 'blubb|ac', 'can call new method that calls other methods';
is $x.later_added, 'later', 'can call method on object that was instantiated earlier';
is $x.uses-other-methods, 'blubb|ab', 'works with other method too';
}
# now try to extend "core" types
# RT #75114
{
augment class Str {
method mydouble {
self.uc ~ self.lc;
}
}
is 'aBc'.mydouble, 'ABCabc', 'can extend Str';
}
# RT #75114
{
augment class Int {
method triple { self * 3 }
}
is 3.triple, 9, 'can extend Int';
}
{
augment class Array {
method last-and-first {
self[self - 1] ~ self[0]
}
}
my @a = 1, 3, 7, 0;
is @a.last-and-first, '01', 'can extend class Array';
}
throws-like 'use MONKEY-TYPING; class RT124017_A {}; augment class RT124017_A:D {}', X::Syntax::Augment::Adverb, "can't pass :D when augmenting class";
throws-like 'use MONKEY-TYPING; class RT124017_B {}; augment class RT124017_B:auth<random_auth> {}', X::Syntax::Augment::Adverb, "can't pass :auth when augmenting class";
# vim: ft=perl6