The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More tests => 27;
use vars qw( $class );
BEGIN {
    $class = 'DateTime::Format::Mail';
    use_ok $class;
}

sub run_our_tests
{
    my ($fn, $testsuite) = @_;
    for my $label (sort keys %$testsuite)
    {
	my $tests = $testsuite->{$label};
	for my $input (sort keys %$tests)
	{
	    my $expected = $tests->{$input};
	    is $fn->( $input ) => $expected => "$label ($input)";
	}
    }
}

# Test defaults

{
    my $fn = sub {
	$class->fix_year( @_ );
    };

    my %testsuite = (
	'valid' => {
	    '1900' => '1900',
	    '2000' => '2000',
	    '2900' => '2900',
	},
	'low' => {
	    '10' => '2010',
	    '40' => '2040',
	},
	'high' => {
	    '70' => '1970',
	    '90' => '1990',
	},
        default => {
            '49' => '2049',
            '50' => '1950',
        },
    );
    run_our_tests( $fn => \%testsuite );
}

# Test customs

{
    my $parser = $class->new();
    isa_ok( $parser => $class );
    is( $parser->year_cutoff => 49, "Default is default." );
    $parser->set_year_cutoff( 20 );
    is( $parser->year_cutoff => 20, "Default overriden." );
}

{
    my $parser = $class->new( year_cutoff => 20 );
    my $fn = sub {
	$parser->fix_year( @_ );
    };

    my %testsuite = (
	'valid' => {
	    '1900' => '1900',
	    '2000' => '2000',
	    '2900' => '2900',
	},
	'low' => {
	    '10' => '2010',
	},
	'high' => {
	    '40' => '1940',
	    '70' => '1970',
	    '90' => '1990',
	},
    );
    run_our_tests( $fn => \%testsuite );
}

# Test bad arguments
{
    my $parser = $class->new();
    isa_ok( $parser => $class );
    is( $parser->year_cutoff => 49, "Default is default." );
    eval { $parser->set_year_cutoff( ) };
    ok( $@, "Error with no args" );
    eval { $parser->set_year_cutoff( 20, 40) };
    ok( $@, "Error with two args" );
    eval { $parser->set_year_cutoff( undef ) };
    ok( $@, "Error with undef arg" );
    eval { $parser->set_year_cutoff( 100 ) };
    ok( $@, "Error with arg too big" );
    eval { $parser->set_year_cutoff( -1 ) };
    ok( $@, "Error with arg negative" );
}