forked from stevan/p5-mop-redux
-
Notifications
You must be signed in to change notification settings - Fork 0
/
100-roles.t
69 lines (54 loc) · 1.6 KB
/
100-roles.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
use strict;
use warnings;
use Test::More;
use mop;
role Explosive {
method formatter;
method explode {
return $self->formatter('Bang');
}
}
class Bomb (does => 'Explosive') {
method formatter {
lc($_[1])
}
}
class BigBomb (extends => 'Bomb') {
method formatter {
uc($_[1])
}
}
is_deeply(
Bomb->metaclass->roles,
{ Explosive => Explosive->metaclass },
'metaclass reports `does` correctly',
);
my $x = BigBomb->new;
can_ok('Explosive', 'explode');
can_ok('Bomb', 'explode');
can_ok('BigBomb', 'explode');
can_ok($x, 'explode');
ok(!'Explosive'->can('new'), 'roles cannot be instantiated');
is($x->explode, 'BANG', 'calls to methods defined in roles work');
ok('Explosive'->DOES('Explosive'), 'Explosive DOES Explosive');
ok('Bomb'->DOES('Explosive'), 'Bomb DOES Explosive');
ok('BigBomb'->DOES('Explosive'), 'BigBomb DOES Explosive');
ok($x->DOES('Explosive'), '$x DOES Explosive');
ok(!'Explosive'->DOES('Bomb'), 'not Explosive DOES Bomb');
ok('Bomb'->DOES('Bomb'), 'Bomb DOES Bomb');
ok('BigBomb'->DOES('Bomb'), 'BigBomb DOES Bomb');
ok($x->DOES('Bomb'), '$x DOES Bomb');
ok(!'Explosive'->DOES('BigBomb'), 'not Explosive DOES BigBomb');
ok(!'Bomb'->DOES('BigBomb'), 'not Bomb DOES BigBomb');
ok('BigBomb'->DOES('BigBomb'), 'BigBomb DOES BigBomb');
ok($x->DOES('BigBomb'), '$x DOES BigBomb');
role Big {
method be_big {
return 42;
}
}
ok(!$x->DOES('Big'), 'role has not been applied yet');
BigBomb->metaclass->apply_roles( 'Big'->metaclass );
ok($x->DOES('Big'), 'role has been applied now');
is($x->be_big, 42, 'late role application works');
done_testing;