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