Convert all tests to done_testing.
[gitmo/Moose.git] / t / 030_roles / 010_run_time_role_composition.t
CommitLineData
d7c04559 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
a28e50e4 6use Test::More;
d7c04559 7
8use Scalar::Util qw(blessed);
9
7ff56534 10
d7c04559 11=pod
12
13This test can be used as a basis for the runtime role composition.
d03bd989 14Apparently it is not as simple as just making an anon class. One of
d7c04559 15the problems is the way that anon classes are DESTROY-ed, which is
16not very compatible with how instances are dealt with.
17
b805c70c 18=cut
19
d7c04559 20{
21 package Bark;
22 use Moose::Role;
23
24 sub talk { 'woof' }
25
26 package Sleeper;
27 use Moose::Role;
28
29 sub sleep { 'snore' }
30 sub talk { 'zzz' }
31
32 package My::Class;
33 use Moose;
34
35 sub sleep { 'nite-nite' }
36}
37
38my $obj = My::Class->new;
d03bd989 39isa_ok($obj, 'My::Class');
40
d71ba374 41my $obj2 = My::Class->new;
d03bd989 42isa_ok($obj2, 'My::Class');
d7c04559 43
44{
d71ba374 45 ok(!$obj->can( 'talk' ), "... the role is not composed yet");
d03bd989 46
d7c04559 47 ok(!$obj->does('Bark'), '... we do not do any roles yet');
d03bd989 48
d7c04559 49 Bark->meta->apply($obj);
50
51 ok($obj->does('Bark'), '... we now do the Bark role');
d03bd989 52 ok(!My::Class->does('Bark'), '... the class does not do the Bark role');
d7c04559 53
54 isa_ok($obj, 'My::Class');
b805c70c 55 isnt(blessed($obj), 'My::Class', '... but it is no longer blessed into My::Class');
d7c04559 56
57 ok(!My::Class->can('talk'), "... the role is not composed at the class level");
58 ok($obj->can('talk'), "... the role is now composed at the object level");
d03bd989 59
d7c04559 60 is($obj->talk, 'woof', '... got the right return value for the newly composed method');
61}
62
63{
d71ba374 64 ok(!$obj2->does('Bark'), '... we do not do any roles yet');
d03bd989 65
d71ba374 66 Bark->meta->apply($obj2);
d03bd989 67
d71ba374 68 ok($obj2->does('Bark'), '... we now do the Bark role');
69 is(blessed($obj), blessed($obj2), '... they share the same anon-class/role thing');
70}
71
72{
d7c04559 73 is($obj->sleep, 'nite-nite', '... the original method responds as expected');
74
b805c70c 75 ok(!$obj->does('Sleeper'), '... we do not do the Sleeper role');
d7c04559 76
77 Sleeper->meta->apply($obj);
78
79 ok($obj->does('Bark'), '... we still do the Bark role');
d03bd989 80 ok($obj->does('Sleeper'), '... we now do the Sleeper role too');
81
82 ok(!My::Class->does('Sleeper'), '... the class does not do the Sleeper role');
83
84 isnt(blessed($obj), blessed($obj2), '... they no longer share the same anon-class/role thing');
85
d7c04559 86 isa_ok($obj, 'My::Class');
87
88 is(My::Class->sleep, 'nite-nite', '... the original method still responds as expected');
89
90 is($obj->sleep, 'snore', '... got the right return value for the newly composed method');
d03bd989 91 is($obj->talk, 'zzz', '... got the right return value for the newly composed method');
d7c04559 92}
d71ba374 93
94{
95 ok(!$obj2->does('Sleeper'), '... we do not do any roles yet');
d03bd989 96
d71ba374 97 Sleeper->meta->apply($obj2);
d03bd989 98
d71ba374 99 ok($obj2->does('Sleeper'), '... we now do the Bark role');
100 is(blessed($obj), blessed($obj2), '... they share the same anon-class/role thing again');
101}
102
a28e50e4 103done_testing;