Blame t/create.t

Packit 9002b2
use strict;
Packit 9002b2
use warnings;
Packit 9002b2
Packit 9002b2
use Test::More;
Packit 9002b2
Packit 9002b2
use DateTime::Format::Builder;
Packit 9002b2
Packit 9002b2
my $should_fail;
Packit 9002b2
Packit 9002b2
my @parsers = (
Packit 9002b2
    {
Packit 9002b2
        params   => [qw( year month day hour minute second )],
Packit 9002b2
        regex    => qr/^(\d\d\d\d)(\d\d)(\d\d)T(\d\d)(\d\d)(\d\d)$/,
Packit 9002b2
        on_fail  => sub { ok( $should_fail, "on_fail called for $_[0]" ) },
Packit 9002b2
        on_match => sub { ok( !$should_fail, "on_match called for $_[0]" ) },
Packit 9002b2
    },
Packit 9002b2
    {
Packit 9002b2
        length   => 8,
Packit 9002b2
        params   => [qw( year month day )],
Packit 9002b2
        regex    => qr/^(\d\d\d\d)(\d\d)(\d\d)$/,
Packit 9002b2
        on_fail  => sub { ok( $should_fail, "on_fail called for $_[0]" ) },
Packit 9002b2
        on_match => sub { ok( !$should_fail, "on_match called for $_[0]" ) },
Packit 9002b2
    },
Packit 9002b2
    {
Packit 9002b2
        length   => 13,
Packit 9002b2
        params   => [qw( year month day hour minute )],
Packit 9002b2
        regex    => qr/^(\d\d\d\d)(\d\d)(\d\d)T(\d\d)(\d\d)$/,
Packit 9002b2
        on_fail  => sub { ok( $should_fail, "on_fail called for $_[0]" ) },
Packit 9002b2
        on_match => sub { ok( !$should_fail, "on_match called for $_[0]" ) },
Packit 9002b2
    },
Packit 9002b2
    {
Packit 9002b2
        length   => 11,
Packit 9002b2
        params   => [qw( year month day hour )],
Packit 9002b2
        regex    => qr/^(\d\d\d\d)(\d\d)(\d\d)T(\d\d)$/,
Packit 9002b2
        on_fail  => sub { ok( $should_fail, "on_fail called for $_[0]" ) },
Packit 9002b2
        on_match => sub { ok( !$should_fail, "on_match called for $_[0]" ) },
Packit 9002b2
    },
Packit 9002b2
);
Packit 9002b2
Packit 9002b2
{
Packit 9002b2
    my $parser = DateTime::Format::Builder->parser( %{ $parsers[0] } );
Packit 9002b2
    isa_ok( $parser => 'DateTime::Format::Builder' );
Packit 9002b2
    {
Packit 9002b2
        $should_fail = 0;
Packit 9002b2
        my $dt = $parser->parse_datetime("20030716T163245");
Packit 9002b2
Packit 9002b2
        isa_ok( $dt => "DateTime" );
Packit 9002b2
Packit 9002b2
        my %methods
Packit 9002b2
            = qw( hour 16 minute 32 second 45 year 2003 month 7 day 16 );
Packit 9002b2
        while ( my ( $method, $expected ) = each %methods ) {
Packit 9002b2
            is( $dt->$method() => $expected, "\$dt->$method() == $expected" );
Packit 9002b2
        }
Packit 9002b2
    }
Packit 9002b2
    {
Packit 9002b2
        $should_fail = 1;
Packit 9002b2
        my $dt = eval { $parser->parse_datetime("20030716T1632456") };
Packit 9002b2
        ok( $@, "Shouldn't've passed or rescued." );
Packit 9002b2
    }
Packit 9002b2
}
Packit 9002b2
Packit 9002b2
{
Packit 9002b2
    my $parser = DateTime::Format::Builder->parser(@parsers);
Packit 9002b2
    isa_ok( $parser => 'DateTime::Format::Builder' );
Packit 9002b2
    my %times = (
Packit 9002b2
        '20030716T163245' => {
Packit 9002b2
            qw(
Packit 9002b2
                hour 16 minute 32 second 45 year 2003 month 7 day 16 )
Packit 9002b2
        },
Packit 9002b2
        '20030716T1632' => {qw( hour 16 minute 32 year 2003 month 7 day 16 )},
Packit 9002b2
        '20030716T16'   => {qw( hour 16 year 2003 month 7 day 16 )},
Packit 9002b2
        '20030716'      => {qw( year 2003 month 7 day 16 )},
Packit 9002b2
    );
Packit 9002b2
    for my $time ( sort keys %times ) {
Packit 9002b2
        $should_fail = 0;
Packit 9002b2
        my $dt = $parser->parse_datetime($time);
Packit 9002b2
Packit 9002b2
        isa_ok( $dt => "DateTime" );
Packit 9002b2
Packit 9002b2
        while ( my ( $method, $expected ) = each %{ $times{$time} } ) {
Packit 9002b2
            is( $dt->$method() => $expected, "\$dt->$method() == $expected" );
Packit 9002b2
        }
Packit 9002b2
    }
Packit 9002b2
}
Packit 9002b2
Packit 9002b2
# A class that already has a new
Packit 9002b2
{
Packit 9002b2
    sub ClassHasNew::new { return 'new' }
Packit 9002b2
Packit 9002b2
    eval q[
Packit 9002b2
	package ClassHasNew;
Packit 9002b2
	use DateTime::Format::Builder
Packit 9002b2
	    parsers => {
Packit 9002b2
		parse_datetime => [
Packit 9002b2
		{
Packit 9002b2
		    regex => qr/^(\d{4})(\d\d)(d\d)(\d\d)(\d\d)(\d\d)$/,
Packit 9002b2
		    params => [qw( year month day hour minute second )],
Packit 9002b2
		},
Packit 9002b2
		{
Packit 9002b2
		    regex => qr/^(\d{4})(\d\d)(\d\d)$/,
Packit 9002b2
		    params => [qw( year month day )],
Packit 9002b2
		},
Packit 9002b2
		],
Packit 9002b2
	    };
Packit 9002b2
    ];
Packit 9002b2
    ok( !$@, "No errors when creating the class." );
Packit 9002b2
    is( ClassHasNew->new, 'new', "Don't overwrite existing new() method" );
Packit 9002b2
}
Packit 9002b2
Packit 9002b2
# A class that tries to make a parser called 'new'
Packit 9002b2
{
Packit 9002b2
    sub ClassHasNewMethod::new { return 'new' }
Packit 9002b2
Packit 9002b2
    eval q[
Packit 9002b2
	package ClassHasNewMethod;
Packit 9002b2
	use DateTime::Format::Builder
Packit 9002b2
	    parsers => {
Packit 9002b2
		new =>
Packit 9002b2
		{
Packit 9002b2
		    regex => qr/^(\d{4})(\d\d)(d\d)(\d\d)(\d\d)(\d\d)$/,
Packit 9002b2
		    params => [qw( year month day hour minute second )],
Packit 9002b2
		},
Packit 9002b2
	    };
Packit 9002b2
    ];
Packit 9002b2
    ok( $@, "Should have errors when creating class." );
Packit 9002b2
    like(
Packit 9002b2
        $@, qr{Will not override a preexisting method},
Packit 9002b2
        "No overriding new with parser"
Packit 9002b2
    );
Packit 9002b2
    is(
Packit 9002b2
        ClassHasNewMethod->new, 'new',
Packit 9002b2
        "Don't overwrite existing new() method"
Packit 9002b2
    );
Packit 9002b2
}
Packit 9002b2
Packit 9002b2
# A class that tries to override an existing 'new'
Packit 9002b2
{
Packit 9002b2
    sub ClassHasNewOver::new { return 'new' }
Packit 9002b2
Packit 9002b2
    eval q[
Packit 9002b2
	package ClassHasNewOver;
Packit 9002b2
	use DateTime::Format::Builder
Packit 9002b2
            constructor => 1,
Packit 9002b2
	    parsers => {
Packit 9002b2
		parse_datetime =>
Packit 9002b2
		{
Packit 9002b2
		    regex => qr/^(\d{4})(\d\d)(d\d)(\d\d)(\d\d)(\d\d)$/,
Packit 9002b2
		    params => [qw( year month day hour minute second )],
Packit 9002b2
		},
Packit 9002b2
	    };
Packit 9002b2
    ];
Packit 9002b2
    ok( $@, "Should have errors when creating class." );
Packit 9002b2
    like(
Packit 9002b2
        $@, qr{Will not override a preexisting constructor},
Packit 9002b2
        "No override new by intention"
Packit 9002b2
    );
Packit 9002b2
    is(
Packit 9002b2
        ClassHasNewOver->new, 'new',
Packit 9002b2
        "Don't overwrite existing new() method"
Packit 9002b2
    );
Packit 9002b2
}
Packit 9002b2
Packit 9002b2
done_testing();