don't require Test::Exception on production environment =)
[gitmo/Mouse.git] / t / 025-more-isa.t
1 #!/usr/bin/env perl
2 use strict;
3 use warnings;
4 use Test::More tests => 29;
5 use t::Exception;
6
7 do {
8     package Class;
9     use Mouse;
10
11     has tb => (
12         is  => 'rw',
13         isa => 'Test::Builder',
14     );
15 };
16
17 can_ok(Class => 'tb');
18
19 lives_ok {
20     Class->new(tb => Test::Builder->new);
21 };
22
23 lives_ok {
24     my $class = Class->new;
25     $class->tb(Test::Builder->new);
26     isa_ok($class->tb, 'Test::Builder');
27 };
28
29 throws_ok {
30     Class->new(tb => 3);
31 } qr/Attribute \(tb\) does not pass the type constraint because: Validation failed for 'Test::Builder' failed with value 3/;
32
33 throws_ok {
34     my $class = Class->new;
35     $class->tb(3);
36 } qr/Attribute \(tb\) does not pass the type constraint because: Validation failed for 'Test::Builder' failed with value 3/;
37
38 throws_ok {
39     Class->new(tb => Class->new);
40 } qr/Attribute \(tb\) does not pass the type constraint because: Validation failed for 'Test::Builder' failed with value Class=HASH\(\w+\)/;
41
42 do {
43     package Other;
44     use Mouse;
45
46     has oops => (
47         isa     => 'Int',
48         default => "yikes",
49     );
50 };
51
52 throws_ok {
53     Other->new;
54 } qr/Attribute \(oops\) does not pass the type constraint because: Validation failed for 'Int' failed with value yikes/;
55
56 lives_ok {
57     Other->new(oops => 10);
58 };
59
60 # ClassName coverage tests
61
62 do {
63     package A;
64     our @VERSION;
65
66     package B;
67     our $VERSION = 1;
68
69     package C;
70     our %ISA;
71
72     package D;
73     our @ISA = 'Mouse::Object';
74
75     package E;
76     sub foo {}
77
78     package F;
79
80     package G::H;
81     sub bar {}
82
83     package I;
84     our $NOT_CODE = 1;
85 };
86
87 do {
88     package ClassNameTests;
89     use Mouse;
90
91     has class => (
92         is => 'rw',
93         isa => 'ClassName',
94     );
95 };
96
97 for ('A'..'E', 'G::H') {
98     lives_ok {
99         ClassNameTests->new(class => $_);
100     };
101
102     lives_ok {
103         my $obj = ClassNameTests->new;
104         $obj->class($_);
105     };
106 }
107
108 for ('F', 'G', 'I', 'Z') {
109     throws_ok {
110         ClassNameTests->new(class => $_);
111     } qr/Attribute \(class\) does not pass the type constraint because: Validation failed for 'ClassName' failed with value $_/;
112
113     throws_ok {
114             my $obj = ClassNameTests->new;
115             $obj->class($_);
116     } qr/Attribute \(class\) does not pass the type constraint because: Validation failed for 'ClassName' failed with value $_/;
117 };
118