The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w

# t/002_basic.t - check module dates in various formats

use Test::More 0.88;
use DateTime::Format::Strptime;
use DateTime;
use DateTime::TimeZone;

my $object = DateTime::Format::Strptime->new(
    pattern => '%D',

    #	time_zone => 'Australia/Melbourne',
    diagnostic => 1,
    on_error   => 'croak',
);

my @tests = (

    # Simple dates
    [ '%Y-%m-%d',          '1998-12-31' ],
    [ '%y-%m-%d',          '98-12-31' ],
    [ '%Y years, %j days', '1998 years, 312 days' ],
    [ '%b %d, %Y',         'Jan 24, 2003' ],
    [ '%B %d, %Y',         'January 24, 2003' ],

    # Simple times
    [ '%H:%M:%S',    '23:45:56' ],
    [ '%l:%M:%S %p', '11:34:56 PM' ],

    # With Nanoseconds
    [ '%H:%M:%S.%N',  '23:45:56.123456789' ],
    [ '%H:%M:%S.%6N', '23:45:56.123456' ],
    [ '%H:%M:%S.%3N', '23:45:56.123' ],

    # Complex dates
    [ '%Y;%j = %Y-%m-%d',      '2003;056 = 2003-02-25' ],
    [ q|%d %b '%y = %Y-%m-%d|, q|25 Feb '03 = 2003-02-25| ],

    # Leading spaces
    [ '%e-%b-%Y %T %z', '13-Jun-2010 09:20:47 -0400' ],
    [ '%e-%b-%Y %T %z', ' 3-Jun-2010 09:20:47 -0400' ],
);

foreach (@tests) {
    my ( $pattern, $data, $expect ) = @$_;
    $expect ||= $data;
    $object->pattern($pattern);
    is(
        $object->format_datetime( $object->parse_datetime($data) ), $expect,
        $pattern
    );
}

SKIP: {
    skip
        "You don't have the latest DateTime. Older version have a bug whereby 12am and 12pm are shown as 0am and 0pm. You should upgrade.",
        1
        unless $DateTime::VERSION >= 0.11;

    $object->pattern('%l:%M:%S %p');
    is(
        $object->format_datetime( $object->parse_datetime('12:34:56 AM') ),
        '12:34:56 AM', '%l:%M:%S %p'
    );
}

# Timezones
SKIP: {
    skip
        "You don't have the latest DateTime::TimeZone. Older versions don't display all time zone information. You should upgrade.",
        3
        unless $DateTime::TimeZone::VERSION >= 0.13;

    $object->pattern('%H:%M:%S %z');
    is(
        $object->format_datetime( $object->parse_datetime('23:45:56 +1000') ),
        '23:45:56 +1000', '%H:%M:%S %z'
    );

    $object->pattern('%H:%M:%S %Z');
    is(
        $object->format_datetime( $object->parse_datetime('23:45:56 AEST') ),
        '23:45:56 +1000', '%H:%M:%S %Z'
    );

    $object->pattern('%H:%M:%S %z %Z');
    is(
        $object->format_datetime(
            $object->parse_datetime('23:45:56 +1000 AEST')
        ),
        '23:45:56 +1000 +1000',
        '%H:%M:%S %z %Z'
    );
}

$object->time_zone('Australia/Perth');
$object->pattern('%Y %H:%M:%S %Z');
is(
    $object->format_datetime( $object->parse_datetime('2003 23:45:56 MDT') ),
    '2003 13:45:56 WST', $object->pattern
);

done_testing();