1#!perl -w 2 3# t/007_edge.t - these tests are for edge case bug report errors 4 5use Test::More tests => 16; 6use DateTime; 7use DateTime::Format::Strptime; 8 9#diag("1.0600 - Midnight assumption"); 10test( 11 pattern => "%a %b %e %T %Y", 12 time_zone => 'Asia/Manila', 13 locale => 'en_PH', 14 input => 'Wed Mar 22 01:00:00 1978', 15 epoch => '259344000', 16); 17 18#diag("1.0601 - Timezone defaults to UTC .. shoudld be floating") 19{ 20 my $parser = DateTime::Format::Strptime->new( 21 pattern => '%F %T', 22 locale => 'en', 23 on_error => 'undef', 24 ); 25 isa_ok( $parser, 'DateTime::Format::Strptime' ); 26 my $parsed = $parser->parse_datetime('2005-11-05 09:33:00'); 27 isa_ok( $parsed, 'DateTime' ); 28 is( $parsed->time_zone->name, 'floating' ); 29} 30 31#diag("1.0601 - Olson Time Zones - %O"); 32{ 33 my $parser = DateTime::Format::Strptime->new( 34 pattern => '%F %T %O', 35 on_error => 'undef', 36 ); 37 isa_ok( $parser, 'DateTime::Format::Strptime' ); 38 my $parsed 39 = $parser->parse_datetime('2005-11-05 09:33:00 Australia/Melbourne'); 40 isa_ok( $parsed, 'DateTime' ); 41 is( $parsed->time_zone->name, 'Australia/Melbourne', 42 'Time zone determined from string' ); 43 is( $parsed->epoch, '1131143580', 'Time zone applied to string' ); 44} 45 46#diag("1.08 - Good pattern, illegal datetime"); 47my $bad_input_test = DateTime::Format::Strptime->new( 48 pattern => '%Y-%m-%d', 49 time_zone => 'Australia/Melbourne', 50 locale => 'en_AU', 51 on_error => 'croak', 52 diagnostic => 0, 53); 54 55eval { $bad_input_test->parse_datetime('0000-00-00') }; 56isnt( $@, '', "Illegal input should carp" ); 57is( substr( $@, 0, 39 ), 'Datetime 0000-00-00 is not a valid date', 58 "Croak message should reflect illegal pattern" ); 59 60#diag("1.09 - Time zones with an underscore"); 61{ 62 my $parser = new DateTime::Format::Strptime( pattern => '%O' ); 63 is( $parser->parse_datetime('America/New_York')->time_zone->name, 64 'America/New_York' ); 65} 66 67#diag("1.09 - TZs in the wrong case should work (unless they have a cap in the middle of a word)"); 68{ 69 my $parser 70 = new DateTime::Format::Strptime( pattern => '%O', diagnostic => 1 ); 71 is( $parser->parse_datetime('AMERICA/NEW_YORK')->time_zone->name, 72 'America/New_York' ); 73} 74 75#diag("1.09 - Bogus TZs shouldn't barf, they should follow the on_error setting"); 76{ 77 my $parser = new DateTime::Format::Strptime( pattern => '%O', 78 on_error => 'undef' ); 79 is( $parser->parse_datetime('Oz/Munchkinville'), undef ); 80} 81 82#diag("1.09 - Month name matching was being too greedy"); 83{ 84 my $parser = DateTime::Format::Strptime->new( pattern => "%d%b%y" ); 85 my $dt = $parser->parse_datetime('15AUG07'); 86 is( $dt->ymd, '2007-08-15' ); 87} 88 89sub test { 90 my %arg = @_; 91 92 my $strptime = DateTime::Format::Strptime->new( 93 pattern => $arg{pattern} || '%F %T', 94 locale => $arg{locale} || 'en', 95 time_zone => $arg{time_zone} || 'UTC', 96 diagnostic => $arg{diagnostic} || 0, 97 on_error => 'undef', 98 ); 99 isa_ok( $strptime, 'DateTime::Format::Strptime' ); 100 101 my $parsed = $strptime->parse_datetime( $arg{input} ); 102 isa_ok( $parsed, 'DateTime' ); 103 104 is( $parsed->epoch, $arg{epoch} ); 105} 106