Reorder changes to put most interesting ones first
[gitmo/Moose.git] / t / 050_metaclasses / 018_throw_error.t
CommitLineData
95f1ef68 1#!/usr/bin/perl
2
3use strict;
4use warnings;
5
a28e50e4 6use Test::More;
1aa93ae8 7use 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
47my $line;
48sub blah { $line = __LINE__; shift->foo(4) }
49
50sub 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
138ok( 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
153ok( Foo::Sub::Sub->meta->error_class->meta->does_role('Role::Foo'),
154 q{Foo::Sub::Sub's error_class does Role::Foo} );
155ok( 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
158done_testing;