expand this test a bit
[gitmo/Moose.git] / t / 050_metaclasses / 018_throw_error.t
index 35df769..5988905 100644 (file)
@@ -22,17 +22,20 @@ use Test::Exception;
 
     has foo => ( is => "ro" );
 
-    package Baz::Error;
-    use Moose;
-
-    has message    => ( isa => "Str",                    is => "ro" );
-    has attr       => ( isa => "Moose::Meta::Attribute", is => "ro" );
-    has method     => ( isa => "Moose::Meta::Method",    is => "ro" );
-    has metaclass  => ( isa => "Moose::Meta::Class",     is => "ro" );
-    has data       => ( is  => "ro" );
-    has line       => ( isa => "Int",                    is => "ro" );
-    has file       => ( isa => "Str",                    is => "ro" );
-    has last_error => ( isa => "Any",                    is => "ro" );
+    BEGIN {
+        package Baz::Error;
+        use Moose;
+        extends 'Moose::Object', 'Moose::Error::Default';
+
+        has message    => ( isa => "Str",                    is => "ro" );
+        has attr       => ( isa => "Moose::Meta::Attribute", is => "ro" );
+        has method     => ( isa => "Moose::Meta::Method",    is => "ro" );
+        has metaclass  => ( isa => "Moose::Meta::Class",     is => "ro" );
+        has data       => ( is  => "ro" );
+        has line       => ( isa => "Int",                    is => "ro" );
+        has file       => ( isa => "Str",                    is => "ro" );
+        has last_error => ( isa => "Any",                    is => "ro" );
+    }
 
     package Baz;
     use metaclass (
@@ -102,9 +105,9 @@ sub create_error {
     use Moose;
     extends 'Baz';
 
-    Moose::Util::MetaRole::apply_metaclass_roles(
-        for_class       => __PACKAGE__,
-        metaclass_roles => ['Role::Foo'],
+    Moose::Util::MetaRole::apply_metaroles(
+        for             => __PACKAGE__,
+        class_metaroles => { class => ['Role::Foo'] },
     );
 }
 
@@ -129,9 +132,9 @@ sub create_error {
 
     use Moose;
 
-    Moose::Util::MetaRole::apply_metaclass_roles(
-        for_class         => __PACKAGE__,
-        metaclass_roles => ['Role::Foo'],
+    Moose::Util::MetaRole::apply_metaroles(
+        for             => __PACKAGE__,
+        class_metaroles => { class => ['Role::Foo'] },
     );
 }
 
@@ -144,9 +147,9 @@ ok( Foo::Sub->meta->error_class->isa('Moose::Error::Croak'),
 
     ::lives_ok { extends 'Foo::Sub' } 'error_class differs by role so incompat is handled';
 
-    Moose::Util::MetaRole::apply_metaclass_roles(
-        for_class         => __PACKAGE__,
-        error_class_roles => ['Role::Foo'],
+    Moose::Util::MetaRole::apply_metaroles(
+        for             => __PACKAGE__,
+        class_metaroles => { error => ['Role::Foo'] },
     );
 }
 
@@ -155,4 +158,75 @@ ok( Foo::Sub::Sub->meta->error_class->meta->does_role('Role::Foo'),
 ok( Foo::Sub::Sub->meta->error_class->isa('Moose::Error::Croak'),
     q{Foo::Sub::Sub's error_class now subclasses Moose::Error::Croak} );
 
+{
+    package Quux::Default;
+    use Moose;
+
+    has foo => (is => 'ro');
+    sub bar { shift->foo(1) }
+}
+
+{
+    package Quux::Croak;
+    use metaclass 'Moose::Meta::Class', error_class => 'Moose::Error::Croak';
+    use Moose;
+
+    has foo => (is => 'ro');
+    sub bar { shift->foo(1) }
+}
+
+{
+    package Quux::Confess;
+    use metaclass 'Moose::Meta::Class', error_class => 'Moose::Error::Confess';
+    use Moose;
+
+    has foo => (is => 'ro');
+    sub bar { shift->foo(1) }
+}
+
+sub stacktrace_ok (&) {
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
+    my $code = shift;
+    eval { $code->() };
+    my @lines = split /\n/, $@;
+    cmp_ok(scalar(@lines), '>', 1, "got a stacktrace");
+}
+
+sub stacktrace_not_ok (&) {
+    local $Test::Builder::Level = $Test::Builder::Level + 1;
+    my $code = shift;
+    eval { $code->() };
+    my @lines = split /\n/, $@;
+    cmp_ok(scalar(@lines), '==', 1, "didn't get a stacktrace");
+}
+
+my $default = Quux::Default->new;
+my $croak = Quux::Croak->new;
+my $confess = Quux::Confess->new;
+
+is($default->meta->error_class, 'Moose::Error::Default');
+is($croak->meta->error_class, 'Moose::Error::Croak');
+is($confess->meta->error_class, 'Moose::Error::Confess');
+
+{
+    local $ENV{MOOSE_ERROR_STYLE};
+    stacktrace_ok { $default->bar };
+    stacktrace_not_ok { $croak->bar };
+    stacktrace_ok { $confess->bar };
+}
+
+{
+    local $ENV{MOOSE_ERROR_STYLE} = 'croak';
+    stacktrace_not_ok { $default->bar };
+    stacktrace_not_ok { $croak->bar };
+    stacktrace_ok { $confess->bar };
+}
+
+{
+    local $ENV{MOOSE_ERROR_STYLE} = 'confess';
+    stacktrace_ok { $default->bar };
+    stacktrace_not_ok { $croak->bar };
+    stacktrace_ok { $confess->bar };
+}
+
 done_testing;