1#!perl -w
2
3# t/007_edge.t - these tests are for edge case bug report errors
4
5use Test::More 0.88;
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
107done_testing();
108