use strict; use warnings; use Test::More import => ['!pass']; use Dancer::Exception qw(:all); ok(1, "load ok"); # test try/catch/continuation { my $v1 = 0; eval { try { $v1 = 1 }; }; ok(! $@); is($v1, 1); } { my $v1 = 0; eval { try { $v1 = 1 } catch { $v1 = 2; }; }; ok(! $@); is($v1, 1); } { my $v1 = 0; eval { try { $v1 = 1; die "plop"; } catch { $v1 = 2; }; }; ok(! $@); is($v1, 2); } { my $v1 = 0; eval { try { $v1 = 1; die bless {}, 'Dancer::Continuation'; } catch { $v1 = 2; }; }; my $e = $@; ok(defined $e); is($v1, 1); ok($e->isa('Dancer::Continuation')); } { my $v1 = 0; eval { try { $v1 = 1; die bless {}, 'Dancer::Continuation'; } catch { $v1 = 2; } continuation { $v1 = 3; }; }; ok(! $@); is($v1, 3); } { my $v1 = 0; eval { try { $v1 = 1; die bless {}, 'Dancer::Continuation'; } continuation { $v1 = 3; } catch { $v1 = 2; }; }; ok(! $@); is($v1, 3); } { my $v1 = 0; eval { try { $v1 = 1; die bless {}, 'plop'; } continuation { $v1 = 3; } catch { $v1 = 2; }; }; ok(! $@); is($v1, 2); } { my $v1 = 0; eval { try { $v1 = 1; die "plop"; } continuation { $v1 = 3; } catch { $v1 = 2; }; }; ok(! $@); is($v1, 2); } { my $registered = [ registered_exceptions ]; is_deeply($registered, [ qw( Base Core Core::App Core::Config Core::Deprecation Core::Engine Core::Factory Core::Factory::Hook Core::Fileutils Core::Handler Core::Handler::PSGI Core::Hook Core::Plugin Core::Renderer Core::Request Core::Route Core::Serializer Core::Session Core::Template ) ]); } register_exception ('Test', message_pattern => "test - %s", ); register_exception ('InvalidCredentials', message_pattern => "invalid credentials : %s", ); register_exception ('InvalidPassword', composed_from => [qw(Test InvalidCredentials)], message_pattern => "wrong password", ); register_exception ('InvalidLogin', composed_from => [qw(Test InvalidCredentials)], message_pattern => "wrong login (login was %s)", ); register_exception ('HarmlessInvalidLogin', composed_from => [qw(InvalidLogin)], message_pattern => "ignored invalid login", ); { my $registered = [ registered_exceptions ]; is_deeply($registered, [ qw( Base Core Core::App Core::Config Core::Deprecation Core::Engine Core::Factory Core::Factory::Hook Core::Fileutils Core::Handler Core::Handler::PSGI Core::Hook Core::Plugin Core::Renderer Core::Request Core::Route Core::Serializer Core::Session Core::Template HarmlessInvalidLogin InvalidCredentials InvalidLogin InvalidPassword Test ) ]); } { my $v1 = 0; my $e; eval { try { $v1 = 1; raise InvalidLogin => 'douglas' } continuation { $v1 = 3; } catch { $e = shift; $v1 = 2; }; }; ok(! $@); like($e, qr/^wrong login \(login was douglas\)/); # check stringification works in other cases ok($e =~ /^wrong login \(login was douglas\)/); ok($e->does('InvalidLogin')); ok($e->does('Test')); ok($e->does('Base')); is($v1, 2); } { eval { raise HarmlessInvalidLogin => 'plop' }; my $exception = $@; is_deeply([ sort { $a cmp $b } $exception->get_composition], [ qw(Base HarmlessInvalidLogin InvalidCredentials InvalidLogin Test) ]); } done_testing;