The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Test::More tests => 31;

sub begins_with
{
    my ($got, $exp) = @_;
    my $ok = substr($got,0,length $exp) eq $exp;
    if (!$ok)
    {
        diag "expected '$exp...'\n",
             "     got '$got'\n";
    }
    return $ok;
}

use_ok ('Time::Normalize');

# function exported okay?
ok (defined &normalize_rct, 'normalize_rct sub imported');


# Figure out the month and day names in this locale
my ($JANUARY, $FEBRUARY, $MARCH, $APRIL, $MAY_FULL, $JUNE, $JULY, $AUGUST, $SEPTEMBER, $OCTOBER, $NOVEMBER, $DECEMBER);
my ($JAN, $FEB, $MAR, $APR, $MAY, $JUN, $JUL, $AUG, $SEP, $OCT, $NOV, $DEC);
my ($SUNDAY, $MONDAY, $TUESDAY, $WEDNESDAY, $THURSDAY, $FRIDAY, $SATURDAY);
my ($SUN, $MON, $TUE, $WED, $THU, $FRI, $SAT);
eval
{
    require I18N::Langinfo;
    I18N::Langinfo->import qw(langinfo);
    ($JANUARY, $FEBRUARY, $MARCH, $APRIL, $MAY_FULL, $JUNE, $JULY, $AUGUST, $SEPTEMBER, $OCTOBER, $NOVEMBER, $DECEMBER)
        = map langinfo($_), I18N::Langinfo::MON_1(), I18N::Langinfo::MON_2(), I18N::Langinfo::MON_3(), I18N::Langinfo::MON_4(), I18N::Langinfo::MON_5(), I18N::Langinfo::MON_6(), I18N::Langinfo::MON_7(), I18N::Langinfo::MON_8(), I18N::Langinfo::MON_9(), I18N::Langinfo::MON_10(), I18N::Langinfo::MON_11(), I18N::Langinfo::MON_12();
    ($JAN, $FEB, $MAR, $APR, $MAY, $JUN, $JUL, $AUG, $SEP, $OCT, $NOV, $DEC)
        = map langinfo($_), I18N::Langinfo::ABMON_1(), I18N::Langinfo::ABMON_2(), I18N::Langinfo::ABMON_3(), I18N::Langinfo::ABMON_4(), I18N::Langinfo::ABMON_5(), I18N::Langinfo::ABMON_6(), I18N::Langinfo::ABMON_7(), I18N::Langinfo::ABMON_8(), I18N::Langinfo::ABMON_9(), I18N::Langinfo::ABMON_10(), I18N::Langinfo::ABMON_11(), I18N::Langinfo::ABMON_12();
    ($SUNDAY, $MONDAY, $TUESDAY, $WEDNESDAY, $THURSDAY, $FRIDAY, $SATURDAY)
        = map langinfo($_), I18N::Langinfo::DAY_1(), I18N::Langinfo::DAY_2(), I18N::Langinfo::DAY_3(), I18N::Langinfo::DAY_4(), I18N::Langinfo::DAY_5(), I18N::Langinfo::DAY_6(), I18N::Langinfo::DAY_7();
    ($SUN, $MON, $TUE, $WED, $THU, $FRI, $SAT)
        = map langinfo($_), I18N::Langinfo::ABDAY_1(), I18N::Langinfo::ABDAY_2(), I18N::Langinfo::ABDAY_3(), I18N::Langinfo::ABDAY_4(), I18N::Langinfo::ABDAY_5(), I18N::Langinfo::ABDAY_6(), I18N::Langinfo::ABDAY_7();
};
if ($@)
{
    ($JANUARY, $FEBRUARY, $MARCH, $APRIL, $MAY_FULL, $JUNE, $JULY, $AUGUST, $SEPTEMBER, $OCTOBER, $NOVEMBER, $DECEMBER)
        = qw(January February March April May June July August September October November December);
    ($JAN, $FEB, $MAR, $APR, $MAY, $JUN, $JUL, $AUG, $SEP, $OCT, $NOV, $DEC)
        = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
    ($SUNDAY, $MONDAY, $TUESDAY, $WEDNESDAY, $THURSDAY, $FRIDAY, $SATURDAY)
        = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
    ($SUN, $MON, $TUE, $WED, $THU, $FRI, $SAT)
        = qw(Sun Mon Tue Wed Thu Fri Sat);
}


my ($year, $mon, $day, $hour, $min, $sec, $hash, @vals);

# ISO
# scalar return
eval { $hash = normalize_rct('iso',
                             '2008-05-11T09:59:19',
                             '2008', '05', '11', '09', '59', '19') };
is ($@,    '', q{iso, scalar: no error});
is_deeply ($hash,
       {
        year => 2008, mon => '05', day => 11,
        dow  => 0,
        dow_name => $SUNDAY,
        dow_abbr => $SUN,
        mon_name => $MAY_FULL,
        mon_abbr => $MAY,
        h12  => 9,
        h24  => '09',
        hour => '09',
        min  => 59,
        sec  => 19,
        ampm => 'a',
        since_midnight => ((9*60)+59)*60+19,
       },
       'iso, scalar');

# list return
eval { @vals = normalize_rct('iso',
                             '2008-05-11T09:59:19',
                             '2008', '05', '22', '09', '59', '19') };
is ($@,    '', q{iso, list: no error});
is_deeply (\@vals,
       [
        2008, '05', 22,
        '09', 59, 19,
       ],
       'iso, list');

# mail
# scalar context
eval { $hash = normalize_rct('mail',
                             '11 May 2008 09:59:19 +0500',
                             '11', 'May', '2008', '09', '59', '19', '+0500') };
is ($@,    '', q{mail, scalar: no error});
is_deeply ($hash,
       {
        year => 2008, mon => '05', day => 11,
        dow  => 0,
        dow_name => $SUNDAY,
        dow_abbr => $SUN,
        mon_name => $MAY_FULL,
        mon_abbr => $MAY,
        h12  => 9,
        h24  => '09',
        hour => '09',
        min  => 59,
        sec  => 19,
        ampm => 'a',
        since_midnight => ((9*60)+59)*60+19,
       },
       'mail, scalar');

# list context
eval { @vals = normalize_rct('MAIL',
                             '11 May 2008 09:59:19 +0500',
                             '11', 'May', '2008', '09', '59', '19', '+0500') };
is ($@,    '', q{MAIL, list: no error});
is_deeply (\@vals,
       [
        2008, '05', 11,
        '09', 59, 19,
       ],
       'mail, list');


# american
# scalar context
eval { $hash = normalize_rct('american',
                             "$MARCH 9, '02",
                             $MARCH, 9, "'02") };
is ($@,    '', q{american, scalar: no error});
is_deeply ($hash,
       {
        year => 2002, mon => '03', day => '09',
        dow  => 6,
        dow_name => $SATURDAY,
        dow_abbr => $SAT,
        mon_name => $MARCH,
        mon_abbr => $MAR,
       },
       'american, scalar');

# list context
eval { @vals = normalize_rct('american',
                             "$MARCH 9, '02",
                             $MARCH, 9, "'02") };
is ($@,    '', q{american, list: no error});
is_deeply (\@vals,
       [
        2002, '03', '09',
        6, $SATURDAY, $SAT,
        $MARCH, $MAR,
       ],
       'american, list');


# ymd
# scalar context
eval { $hash = normalize_rct('ymd',
                             '01.02.03',
                             '01', '02', '03') };
is ($@,    '', q{ymd, scalar: no error});
is_deeply ($hash,
       {
        year => 2001, mon => '02', day => '03',
        dow  => 6,
        dow_name => $SATURDAY,
        dow_abbr => $SAT,
        mon_name => $FEBRUARY,
        mon_abbr => $FEB,
       },
       'ymd, scalar');

# list context
eval { @vals = normalize_rct('ymd',
                             '01.02.03',
                             '01', '02', '03') };
is ($@,    '', q{ymd, list: no error});
is_deeply (\@vals,
       [
        2001, '02', '03',
        6, $SATURDAY, $SAT,
        $FEBRUARY, $FEB,
       ],
       'ymd, list');


# mdy
# scalar context
eval { $hash = normalize_rct('mdy',
                             '01.02.03',
                             '01', '02', '03') };
is ($@,    '', q{mdy, scalar: no error});
is_deeply ($hash,
       {
        year => 2003, mon => '01', day => '02',
        dow  => 4,
        dow_name => $THURSDAY,
        dow_abbr => $THU,
        mon_name => $JANUARY,
        mon_abbr => $JAN,
       },
       'mdy, scalar');

# list context
eval { @vals = normalize_rct('mdy',
                             '01.02.03',
                             '01', '02', '03') };
is ($@,    '', q{mdy, list: no error});
is_deeply (\@vals,
       [
        2003, '01', '02',
        4, $THURSDAY, $THU,
        $JANUARY, $JAN,
       ],
       'mdy, list');


# dmy
# scalar context
eval { $hash = normalize_rct('dmy',
                             '01.02.03',
                             '01', '02', '03') };
is ($@,    '', q{dmy, scalar: no error});
is_deeply ($hash,
       {
        year => 2003, mon => '02', day => '01',
        dow  => 6,
        dow_name => $SATURDAY,
        dow_abbr => $SAT,
        mon_name => $FEBRUARY,
        mon_abbr => $FEB,
       },
       'dmy, scalar');

# list context
eval { @vals = normalize_rct('dmy',
                             '01.02.03',
                             '01', '02', '03') };
is ($@,    '', q{dmy, list: no error});
is_deeply (\@vals,
       [
        2003, '02', '01',
        6, $SATURDAY, $SAT,
        $FEBRUARY, $FEB,
       ],
       'dmy, list');


# hms
# scalar context
eval { $hash = normalize_rct('hms',
                             '01.02.03',
                             '01', '02', '03') };
is ($@,    '', q{hms, scalar: no error});
is_deeply ($hash,
       {
        h12  => 1,
        h24  => '01',
        hour => '01',
        min  => '02',
        sec  => '03',
        ampm => 'a',
        since_midnight => ((1*60)+2)*60+3,
       },
       'hms, scalar');

# list context
eval { @vals = normalize_rct('hms',
                             '01.02.03',
                             '01', '02', '03') };
is ($@,    '', q{hms, list: no error});
is_deeply (\@vals,
       [
        '01', '02', '03',
        1,
        'a',
        ((1*60)+2)*60+3,
       ],
       'hms, list');


# Unknown
eval { $hash = normalize_rct('brzyxct',
                             '01.02.03.04.05',
                             '01', '02', '03', '04', '05') };
ok begins_with ($@, 'Unknown Regexp::Common::time pattern: "brzyxct"', q{Unknown type: error});