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