Checking in changes prior to tagging of version 0.92.
[gitmo/Mouse.git] / Moose-t-failing / 050_metaclasses / 018_throw_error.t
CommitLineData
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!!!
4use t::lib::MooseCompat;
41888e7d 5
6use strict;
7use warnings;
8
c47cf415 9use Test::More;
10$TODO = q{Mouse is not yet completed};
41888e7d 11use 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
54my $line;
55sub blah { $line = __LINE__; shift->foo(4) }
56
57sub 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
145ok( 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
160ok( Foo::Sub::Sub->meta->error_class->meta->does_role('Role::Foo'),
161 q{Foo::Sub::Sub's error_class does Role::Foo} );
162ok( 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
165done_testing;