The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

use strict;
use warnings;
use Lucy::Test;

package Nirvana;

sub enter {
    die Clownfish::Err->new("blam");
}

package GloriousDeath;
use base qw( Clownfish::Err );

package main;
use Test::More tests => 10;

isa_ok( Clownfish::Err->new("Bad stuff happened"),
    'Clownfish::Err', "new" );

my $glorious = GloriousDeath->new("Banzai");
isa_ok( $glorious, 'GloriousDeath',     "subclass" );
isa_ok( $glorious, 'Clownfish::Err', "subclass" );

isa_ok( Clownfish::Err::trap( "bite_the_dust", undef ),
    'Clownfish::Err', "trap string call" );

isa_ok( Clownfish::Err::trap( "Nirvana::enter", undef ),
    'Clownfish::Err', "trap string call in another package" );

isa_ok( Clownfish::Err::trap( \&bite_the_dust, undef ),
    'Clownfish::Err', "trap sub ref" );

isa_ok( Clownfish::Err::trap( \&Nirvana::enter, undef ),
    'Clownfish::Err', "trap sub ref to another package" );

isa_ok( Clownfish::Err::trap( \&judge_gladiator, "down" ),
    'Clownfish::Err', "pass argument to 'trap'" );

my $last_words = sub { die "Rosebud" };
isa_ok( Clownfish::Err::trap( $last_words, undef ),
    'Clownfish::Err', "Wrap host exception in Err" );

my $succeed = sub { };
ok( !defined( Clownfish::Err::trap( $succeed, undef ) ),
    "nothing to trap" );

sub bite_the_dust { die Clownfish::Err->new("gasp") }

sub judge_gladiator {
    my $thumb = shift;
    if ( $thumb and $thumb eq 'down' ) {
        die GloriousDeath->new("gurgle");
    }
}