The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use Test::More tests => 4 * 7; # strings * methods

use DateTime::Format::Oracle;

my $class = 'DateTime::Format::Oracle';

my %tests = (
    '2003-02-15' => {
        format    => 'YYYY-MM-DD',
        year      => 2003,
        month     => 2,
        day       => 15,
        hour      => 0,
        minute    => 0,
        second    => 0,
        time_zone => 'floating',
    },
    '15-FEB-03' => {
        format    => 'DD-MON-RR',
        year      => 2003,
        month     => 2,
        day       => 15,
        hour      => 0,
        minute    => 0,
        second    => 0,
        time_zone => 'floating',
    },
    '2003-02-15 14:39:06' => {
        format    => 'YYYY-MM-DD HH24:MI:SS',
        year      => 2003,
        month     => 2,
        day       => 15,
        hour      => 14,
        minute    => 39,
        second    => 6,
        time_zone => 'floating',
    },
    '15-FEB-03 02.39.06.167901 PM' => {
        format    => 'DD-MON-RR HH.MI.SSXFF AM',
        year      => 2003,
        month     => 2,
        day       => 15,
        hour      => 14,
        minute    => 39,
        second    => 6,
        time_zone => 'floating',
    },
    # time zone parsing seems to not work in DateTime::Format::Builder
    #'2003-02-15 14:39:06 AMERICA/NEW_YORK' => {
    #    format    => 'YYYY-MM-DD HH24:MI:SS TZR',
    #    year      => 2003,
    #    month     => 2,
    #    day       => 15,
    #    hour      => 14,
    #    minute    => 39,
    #    second    => 6,
    #    time_zone => 'America/New_York',
    #},
    #'15-FEB-03 02.39.06.167901 PM AMERICA/NEW_YORK' => {
    #    format    => 'DD-MON-RR HH.MI.SSXFF AM TZR',
    #    year      => 2003,
    #    month     => 2,
    #    day       => 15,
    #    hour      => 14,
    #    minute    => 39,
    #    second    => 6,
    #    time_zone => 'America/New_York',
    #},
);

foreach my $string (keys %tests) {
    my $params = $tests{$string};
    my $nls_format = delete $params->{format};
    local $ENV{NLS_DATE_FORMAT} = $nls_format;
    my $dt;
    eval { $dt = $class->parse_date($string) };
    if ($@) {
        warn "failed to parse date '$string' via format '$nls_format' (" . $class->current_date_format . ")";
        next;
    }
    foreach my $method (keys %$params) {
        if ($method eq 'time_zone') {
            is($dt->$method->name, $params->{$method}, "$nls_format $method");
        } else {
            is($dt->$method, $params->{$method}, "$nls_format $method");
        }
    }
}