use strict;
use warnings;
use Test::More;

use t::lib::Exceptions;

use Try::Lite;

subtest 'simple' => sub {
    my @exceptions;

    try {
        MyException->throw;
    }
        'MyException' => sub {
            push @exceptions, ref($@);
        };

    try {
        YourException->throw;
    }
        'MyException' => sub {
            push @exceptions, ref($@);
        },
        'YourException' => sub {
            push @exceptions, ref($@);
        };

    is_deeply \@exceptions, [qw/ MyException YourException /];
};

subtest 'nested_class' => sub {
    my $e;
    try {
        MyException->throw;
    }
        'BaseException' => sub {
            $e = $@;
        };
    isa_ok($e, 'BaseException');
    isa_ok($e, 'MyException');
};

subtest 'wildcard' => sub {
    my $e;
    try {
        die;
    }
        'MyException' => sub {
        },
        '*' => sub {
            $e = $@;
        };
    like $e, qr/^Died/;
};

subtest 'not catch' => sub {
    eval {
        try {
            YourException->throw;
        }
            'MyException' => sub {
            };
        ok 0;
    };
    isa_ok $@, 'YourException';
};

done_testing;
