Changelogging
[gitmo/Mouse.git] / t-failing / 050_metaclasses / 018_throw_error.t
1 #!/usr/bin/perl
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;
5
6 use strict;
7 use warnings;
8
9 use Test::More;
10 $TODO = q{Mouse is not yet completed};
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
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     }
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
112     Mouse::Util::MetaRole::apply_metaroles(
113         for             => __PACKAGE__,
114         class_metaroles => { class => ['Role::Foo'] },
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
139     Mouse::Util::MetaRole::apply_metaroles(
140         for             => __PACKAGE__,
141         class_metaroles => { class => ['Role::Foo'] },
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
154     Mouse::Util::MetaRole::apply_metaroles(
155         for             => __PACKAGE__,
156         class_metaroles => { error => ['Role::Foo'] },
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} );
164
165 done_testing;