The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use Test::More tests => 24;
use Mail::Log::Exceptions;

BASE: {
# Throw one to catch.
eval { Mail::Log::Exceptions->throw('Test Exception.') };

my $test_val = Mail::Log::Exceptions->caught();
ok(defined($test_val), 'Caught returns defined variable.');
isa_ok($test_val, 'Mail::Log::Exceptions', 'Generic throw/catch.');

is($test_val->description(), 'A generic Mail::Log::Exception.', 'Base description exists.');
is($test_val->message(), 'Test Exception.', 'Base message exists.');
is($test_val->error(), 'Test Exception.', 'Base error exists.');
is($test_val->as_string(), 'Test Exception.', 'Base as_string exists.');
}

UNIMPLEMENTED: {
# Throw one to catch.
eval { Mail::Log::Exceptions::Unimplemented->throw('Test Exception.') };

my $test_val = Mail::Log::Exceptions->caught();
ok(defined($test_val), '(Unimplemented) Caught returns defined variable.');
isa_ok($test_val, 'Mail::Log::Exceptions::Unimplemented', 'Unimplemented throw/catch.');

is($test_val->description(), 'Stuff that should be implemented by subclasses.', 'Unimplemented description exists.');
is($test_val->message(), 'Test Exception.', 'Unimplemented message exists.');
is($test_val->error(), 'Test Exception.', 'Unimplemented error exists.');
is($test_val->as_string(), 'Test Exception.', 'Unimplemented as_string exists.');
}

LOGFILE: {
# Throw one to catch.
eval { Mail::Log::Exceptions::LogFile->throw('Test Exception.') };

my $test_val = Mail::Log::Exceptions->caught();
ok(defined($test_val), '(LogFile) Caught returns defined variable.');
isa_ok($test_val, 'Mail::Log::Exceptions::LogFile', 'LogFile throw/catch.');

is($test_val->description(), 'An error with the logfile.','LogFile description exists.');
is($test_val->message(), 'Test Exception.','LogFile message exists.');
is($test_val->error(), 'Test Exception.','LogFile error exists.');
is($test_val->as_string(), 'Test Exception.','LogFile as_string exists.');
}

MESSAGE: {
# Throw one to catch.
eval { Mail::Log::Exceptions::Message->throw('Test Exception.') };

my $test_val = Mail::Log::Exceptions->caught();
ok(defined($test_val), '(Message) Caught returns defined variable.');
isa_ok($test_val, 'Mail::Log::Exceptions::Message', 'Message throw/catch.');

is($test_val->description(), 'An error with the message info.','Message description exists.');
is($test_val->message(), 'Test Exception.','Message message exists.');
is($test_val->error(), 'Test Exception.','Message error exists.');
is($test_val->as_string(), 'Test Exception.','Message as_string exists.');
}