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

# Must test all examples in the documentation,
# so as to be sure we're not lying to the poor user.

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('Regexp::Common', 'time');

# Get day/month names in current locale
my ($November, $Thu);
eval
{
    require I18N::Langinfo;
    I18N::Langinfo->import qw(langinfo MON_11 ABDAY_5);
    ($November, $Thu) = map langinfo($_), (MON_11(), ABDAY_5());
};
if ($@)
{
    ($November, $Thu) = qw(November Thu);
}



my ($record, $time);
my ($year, $month, $day, $h24, $h12, $min, $sec, $ampm);
my (@date_data, @time_data);
my $pass = 1;
my $str;
my $result;
my @result;

# Time::Format pattern example 1
$str = "$Thu $November 2, 2005";
eval {@result = $str =~ $RE{time}{tf}{-pat => 'Day Month d, yyyy'}{-keep}};
is ($@, q{}, 'Time::Format example 1, no error');
is_deeply (\@result, [$str, $Thu, $November, 2, 2005],
           'Time::Format example 1, expected values');

# Time::Format pattern example 2
eval {@result = $str =~ $RE{time}{tf}{-pat => '(Weekday|Day) (Month|Mon) d, yyyy'}{-keep}};
is ($@, q{}, 'Time::Format example 2, no error');
is_deeply (\@result, [$Thu, $November],
           'Time::Format example 2, expected values');


# strftime pattern example 1
$str = "$Thu $November 2, 2005";
@result = eval {$str =~ $RE{time}{strftime}{-pat => '%a %B %_d, %Y'}{-keep}};
is ($@, q{}, 'strftime example 1, no error');
is_deeply (\@result, [$str, $Thu, $November, 2, 2005],
           'strftime example 1, expected values');

# strftime pattern example 2
$str = "$Thu $November 2, 2005";
eval {@result = $str =~ $RE{time}{strftime}{-pat => '(%A|%a)? (%B|%b) ?%_d, %Y'}{-keep}};
is ($@, q{}, 'strftime example 2, no error');
is_deeply (\@result, [$Thu, $November],
           'strftime example 2, expected values');



# Typical usage: parsing a data record.
#
$rec = "blah blah 2005/10/21 blah blarrrrrgh";
@date = $rec =~ m{^blah blah $RE{time}{YMD}{-keep}};
ok (scalar @date, 'Fuzzy record parsing matched');
is_deeply (\@date, ['2005/10/21', 2005, 10, 21],
           'Fuzzy record parsing, expected results');

@date = $rec =~ m{^blah blah $RE{time}{tf}{-pat=>'yyyy/mm/dd'}{-keep}};
ok (scalar @date, 'TF record parsing matched');
is_deeply (\@date, ['2005/10/21', 2005, 10, 21],
           'TF record parsing, expected results');

@date = $rec =~ m{^blah blah $RE{time}{strftime}{-pat=>'%Y/%m/%d'}{-keep}};
ok (scalar @date, 'strftime record parsing matched');
is_deeply (\@date, ['2005/10/21', 2005, 10, 21],
           'strftime record parsing, expected results');


# Typical usage: parsing variable-format data.
#
eval
{
    require Time::Normalize;
    Time::Normalize->import();
};
my $dont_have_normalize = $@? 1 : 0;

SKIP:
{
    skip "Test relies on Time::Normalize, which you don't have", 3 if $dont_have_normalize;
    my $pass = 1;
    $record = "10-SEP-2005";

    if ( ((undef,$m,$d,$y) = $record =~ /^$RE{time}{mdy}{-keep}/)
     ||  ((undef,$d,$m,$y) = $record =~ /^$RE{time}{dmy}{-keep}/)
     ||  ((undef,$y,$m,$d) = $record =~ /^$RE{time}{ymd}{-keep}/) )
    {
        eval {($year, $month, $day) = normalize_ymd($y, $m, $d)};
    }
    else      # give up
    {
        $pass = undef;
    }
    is ($@, q{}, 'variable parse: no error');
    ok($pass, 'variable parse: matched');

    # $day is now 10; $month is now 09; $year is now 2005.
    is_deeply ([$day, $month, $year], [10, '09', 2005], 'variable parse: worked');
}

# Time examples
#
$time = '9:10pm';
@time_data = $time =~ /$RE{time}{hms}{-keep}/;
 # captures '9:10pm', '9', ':', '10', undef, 'pm'
is_deeply (\@time_data, ['9:10pm', '9', '10', undef, 'pm'], 'Time example 1');

@time_data = $time =~ /$RE{time}{tf}{-pat => '(h):(mm)(:ss)?(am)?'}{-keep}/;
 # captures '9', '10', undef, 'pm'
is_deeply (\@time_data, ['9', '10', undef, 'pm'], 'Time example 2');