022c89c495ed083aefc1a1d9be13bab0dac35fc7
[gitmo/Mouse.git] / t / 025-more-isa.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4 use Test::More tests => 34;
5 use Test::Exception;
6
7 do {
8     package Class;
9     use Mouse;
10
11     has tb => (
12         is  => 'rw',
13         isa => 'Test::Builder',
14     );
15
16     package Test::Builder::Subclass;
17     our @ISA = qw(Test::Builder);
18 };
19
20 can_ok(Class => 'tb');
21
22 lives_ok {
23     Class->new(tb => Test::Builder->new);
24 };
25
26 lives_ok {
27     # Test::Builder was a bizarre choice, because it's a singleton.  Because of
28     # that calling new on T:B:S won't work.  Blessing directly -- rjbs,
29     # 2008-12-04
30     Class->new(tb => (bless {} => 'Test::Builder::Subclass'));
31 };
32
33 lives_ok {
34     my $class = Class->new;
35     $class->tb(Test::Builder->new);
36     isa_ok($class->tb, 'Test::Builder');
37 };
38
39 throws_ok {
40     Class->new(tb => 3);
41 } qr/Attribute \(tb\) does not pass the type constraint because: Validation failed for 'Test::Builder' failed with value 3/;
42
43 throws_ok {
44     my $class = Class->new;
45     $class->tb(3);
46 } qr/Attribute \(tb\) does not pass the type constraint because: Validation failed for 'Test::Builder' failed with value 3/;
47
48 throws_ok {
49     Class->new(tb => Class->new);
50 } qr/Attribute \(tb\) does not pass the type constraint because: Validation failed for 'Test::Builder' failed with value Class=HASH\(\w+\)/;
51
52 do {
53     package Other;
54     use Mouse;
55
56     has oops => (
57         is      => 'bare',
58         isa     => 'Int',
59         default => "yikes",
60     );
61 };
62
63 throws_ok {
64     Other->new;
65 } qr/Attribute \(oops\) does not pass the type constraint because: Validation failed for 'Int' failed with value yikes/;
66
67 lives_ok {
68     Other->new(oops => 10);
69 };
70
71 # ClassName coverage tests
72
73 do {
74     package A;
75     our @VERSION;
76
77     package B;
78     our $VERSION = 1;
79
80     package C;
81     our %ISA;
82
83     package D;
84     our @ISA = 'Mouse::Object';
85
86     package E;
87     sub foo {}
88
89     package F;
90
91     package G::H;
92     sub bar {}
93
94     package I;
95     our $NOT_CODE = 1;
96 };
97
98 do {
99     package ClassNameTests;
100     use Mouse;
101
102     has class => (
103         is => 'rw',
104         isa => 'ClassName',
105     );
106 };
107
108 for ('B'..'E', 'G::H') {
109     lives_ok {
110         ClassNameTests->new(class => $_);
111     };
112
113     lives_ok {
114         my $obj = ClassNameTests->new;
115         $obj->class($_);
116     };
117 }
118
119 TODO: {
120     local $TODO = "Moose throws errors here. Mouse does not";
121     throws_ok {
122         ClassNameTests->new(class => 'A');
123     } qr/Attribute \(class\) does not pass the type constraint because: Validation failed for 'ClassName' failed with value A/;
124
125     throws_ok {
126             my $obj = ClassNameTests->new;
127             $obj->class('A');
128     } qr/Attribute \(class\) does not pass the type constraint because: Validation failed for 'ClassName' failed with value A/;
129 }
130
131 for ('F', 'G', 'I', 'Z') {
132     throws_ok {
133         ClassNameTests->new(class => $_);
134     } qr/Attribute \(class\) does not pass the type constraint because: Validation failed for 'ClassName' failed with value $_/;
135
136     throws_ok {
137             my $obj = ClassNameTests->new;
138             $obj->class($_);
139     } qr/Attribute \(class\) does not pass the type constraint because: Validation failed for 'ClassName' failed with value $_/;
140 };
141
142
143 # Check that Roles can be used in 'isa' and they are constrained with
144 # 'does'
145 do {
146     package SausageRole;
147     use Mouse::Role;
148
149     package DoesSausage;
150     use Mouse;
151     with 'SausageRole';
152
153     package HasSausage;
154     use Mouse;
155
156     has sausage =>
157         (isa => 'SausageRole',
158          is => 'rw');
159
160 };
161
162 my $hs;
163 lives_ok {
164     $hs = HasSausage->new(sausage => DoesSausage->new);    
165 };
166 lives_ok {
167     $hs->sausage(DoesSausage->new);
168 };
169 throws_ok {
170     HasSausage->new(sausage => Class->new);   
171 } qr/^Attribute \(sausage\) does not pass the type constraint because: Validation failed for 'SausageRole' failed with value Class=/;
172 throws_ok {
173     $hs->sausage(Class->new);   
174 } qr/^Attribute \(sausage\) does not pass the type constraint because: Validation failed for 'SausageRole' failed with value Class=/;
175