Commit | Line | Data |
41888e7d |
1 | #!/usr/bin/perl |
c47cf415 |
2 | # This is automatically generated by author/import-moose-test.pl. |
3 | # DO NOT EDIT THIS FILE. ANY CHANGES WILL BE LOST!!! |
4 | use t::lib::MooseCompat; |
41888e7d |
5 | |
6 | use strict; |
7 | use warnings; |
8 | |
c47cf415 |
9 | use Test::More; |
10 | $TODO = q{Mouse is not yet completed}; |
41888e7d |
11 | use Test::Exception; |
12 | |
13 | { |
14 | |
15 | package Foo; |
16 | use Mouse; |
17 | |
18 | has foo => ( is => "ro" ); |
19 | |
20 | package Bar; |
21 | use metaclass ( |
22 | metaclass => "Mouse::Meta::Class", |
23 | error_class => "Mouse::Error::Croak", |
24 | ); |
25 | use Mouse; |
26 | |
27 | has foo => ( is => "ro" ); |
28 | |
c47cf415 |
29 | BEGIN { |
30 | package Baz::Error; |
31 | use Mouse; |
32 | extends 'Mouse::Object', 'Mouse::Error::Default'; |
33 | |
34 | has message => ( isa => "Str", is => "ro" ); |
35 | has attr => ( isa => "Mouse::Meta::Attribute", is => "ro" ); |
36 | has method => ( isa => "Mouse::Meta::Method", is => "ro" ); |
37 | has metaclass => ( isa => "Mouse::Meta::Class", is => "ro" ); |
38 | has data => ( is => "ro" ); |
39 | has line => ( isa => "Int", is => "ro" ); |
40 | has file => ( isa => "Str", is => "ro" ); |
41 | has last_error => ( isa => "Any", is => "ro" ); |
42 | } |
41888e7d |
43 | |
44 | package Baz; |
45 | use metaclass ( |
46 | metaclass => "Mouse::Meta::Class", |
47 | error_class => "Baz::Error", |
48 | ); |
49 | use Mouse; |
50 | |
51 | has foo => ( is => "ro" ); |
52 | } |
53 | |
54 | my $line; |
55 | sub blah { $line = __LINE__; shift->foo(4) } |
56 | |
57 | sub create_error { |
58 | eval { |
59 | eval { die "Blah" }; |
60 | blah(shift); |
61 | }; |
62 | ok( my $e = $@, "got some error" ); |
63 | return { |
64 | file => __FILE__, |
65 | line => $line, |
66 | error => $e, |
67 | }; |
68 | } |
69 | |
70 | { |
71 | my $e = create_error( Foo->new ); |
72 | ok( !ref( $e->{error} ), "error is a string" ); |
73 | like( $e->{error}, qr/line $e->{line}\n.*\n/s, "confess" ); |
74 | } |
75 | |
76 | { |
77 | my $e = create_error( Bar->new ); |
78 | ok( !ref( $e->{error} ), "error is a string" ); |
79 | like( $e->{error}, qr/line $e->{line}$/s, "croak" ); |
80 | } |
81 | |
82 | { |
83 | my $e = create_error( my $baz = Baz->new ); |
84 | isa_ok( $e->{error}, "Baz::Error" ); |
85 | unlike( $e->{error}->message, qr/line $e->{line}/s, |
86 | "no line info, just a message" ); |
87 | isa_ok( $e->{error}->metaclass, "Mouse::Meta::Class", "metaclass" ); |
88 | is( $e->{error}->metaclass, Baz->meta, "metaclass value" ); |
89 | isa_ok( $e->{error}->attr, "Mouse::Meta::Attribute", "attr" ); |
90 | is( $e->{error}->attr, Baz->meta->get_attribute("foo"), "attr value" ); |
91 | isa_ok( $e->{error}->method, "Mouse::Meta::Method", "method" ); |
92 | is( $e->{error}->method, Baz->meta->get_method("foo"), "method value" ); |
93 | is( $e->{error}->line, $e->{line}, "line attr" ); |
94 | is( $e->{error}->file, $e->{file}, "file attr" ); |
95 | is_deeply( $e->{error}->data, [ $baz, 4 ], "captured args" ); |
96 | like( $e->{error}->last_error, qr/Blah/, "last error preserved" ); |
97 | } |
98 | |
99 | { |
100 | package Role::Foo; |
101 | use Mouse::Role; |
102 | |
103 | sub foo { } |
104 | } |
105 | |
106 | { |
107 | package Baz::Sub; |
108 | |
109 | use Mouse; |
110 | extends 'Baz'; |
111 | |
c47cf415 |
112 | Mouse::Util::MetaRole::apply_metaroles( |
113 | for => __PACKAGE__, |
114 | class_metaroles => { class => ['Role::Foo'] }, |
41888e7d |
115 | ); |
116 | } |
117 | |
118 | { |
119 | package Baz::Sub::Sub; |
120 | use metaclass ( |
121 | metaclass => 'Mouse::Meta::Class', |
122 | error_class => 'Mouse::Error::Croak', |
123 | ); |
124 | use Mouse; |
125 | |
126 | ::dies_ok { extends 'Baz::Sub' } 'error_class is included in metaclass compatibility checks'; |
127 | } |
128 | |
129 | { |
130 | package Foo::Sub; |
131 | |
132 | use metaclass ( |
133 | metaclass => 'Mouse::Meta::Class', |
134 | error_class => 'Mouse::Error::Croak', |
135 | ); |
136 | |
137 | use Mouse; |
138 | |
c47cf415 |
139 | Mouse::Util::MetaRole::apply_metaroles( |
140 | for => __PACKAGE__, |
141 | class_metaroles => { class => ['Role::Foo'] }, |
41888e7d |
142 | ); |
143 | } |
144 | |
145 | ok( Foo::Sub->meta->error_class->isa('Mouse::Error::Croak'), |
146 | q{Foo::Sub's error_class still isa Mouse::Error::Croak} ); |
147 | |
148 | { |
149 | package Foo::Sub::Sub; |
150 | use Mouse; |
151 | |
152 | ::lives_ok { extends 'Foo::Sub' } 'error_class differs by role so incompat is handled'; |
153 | |
c47cf415 |
154 | Mouse::Util::MetaRole::apply_metaroles( |
155 | for => __PACKAGE__, |
156 | class_metaroles => { error => ['Role::Foo'] }, |
41888e7d |
157 | ); |
158 | } |
159 | |
160 | ok( Foo::Sub::Sub->meta->error_class->meta->does_role('Role::Foo'), |
161 | q{Foo::Sub::Sub's error_class does Role::Foo} ); |
162 | ok( Foo::Sub::Sub->meta->error_class->isa('Mouse::Error::Croak'), |
163 | q{Foo::Sub::Sub's error_class now subclasses Mouse::Error::Croak} ); |
c47cf415 |
164 | |
165 | done_testing; |