|
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();
|