make Moose::Util::does_role respect overridden ->does methods
[gitmo/Moose.git] / t / moose_util / moose_util_does_role.t
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Test::More;
7
8 BEGIN {
9     use_ok('Moose::Util', ':all');
10 }
11
12 {
13   package Foo;
14
15   use Moose::Role;
16 }
17
18 {
19   package Bar;
20
21   use Moose;
22
23   with qw/Foo/;
24 }
25
26 {
27   package Baz;
28
29   use Moose;
30 }
31
32 {
33   package Quux;
34
35   use metaclass;
36 }
37
38 {
39   package Foo::Foo;
40
41   use Moose::Role;
42
43   with 'Foo';
44 }
45
46 {
47   package DoesMethod;
48   use Moose;
49
50   sub does {
51     my $self = shift;
52     my ($role) = @_;
53     return 1 if $role eq 'Something::Else';
54     return $self->SUPER::does(@_);
55   }
56 }
57
58 # Classes
59
60 ok(does_role('Bar', 'Foo'), '... Bar does Foo');
61
62 ok(!does_role('Baz', 'Foo'), '... Baz doesnt do Foo');
63
64 # Objects
65
66 my $bar = Bar->new;
67
68 ok(does_role($bar, 'Foo'), '... $bar does Foo');
69
70 my $baz = Baz->new;
71
72 ok(!does_role($baz, 'Foo'), '... $baz doesnt do Foo');
73
74 # Invalid values
75
76 ok(!does_role(undef,'Foo'), '... undef doesnt do Foo');
77
78 ok(!does_role(1,'Foo'), '... 1 doesnt do Foo');
79
80 # non Moose metaclass
81
82 ok(!does_role('Quux', 'Foo'), '... Quux doesnt do Foo (does not die tho)');
83
84 # overriding the does method works properly
85
86 ok(does_role('DoesMethod', 'Something::Else'), '... can override the does method');
87
88 # TODO: make the below work, maybe?
89
90 # Self
91
92 #ok(does_role('Foo', 'Foo'), '... Foo does do Foo');
93
94 # sub-Roles
95
96 #ok(does_role('Foo::Foo', 'Foo'), '... Foo::Foo does do Foo');
97
98 done_testing;