1use Test::More tests => 20;
2
3# Must test all examples in the documentation,
4# so as to be sure we're not lying to the poor user.
5
6sub begins_with
7{
8    my ($got, $exp) = @_;
9    my $ok = substr($got,0,length $exp) eq $exp;
10    if (!$ok)
11    {
12        diag "expected '$exp...'\n",
13             "     got '$got'\n";
14    }
15    return $ok;
16}
17
18use_ok('Regexp::Common', 'time');
19
20# Get day/month names in current locale
21my ($November, $Thu);
22eval
23{
24    require I18N::Langinfo;
25    I18N::Langinfo->import(qw(langinfo MON_11 ABDAY_5));
26    ($November, $Thu) = map langinfo($_), (MON_11(), ABDAY_5());
27};
28if ($@)
29{
30    ($November, $Thu) = qw(November Thu);
31}
32
33
34
35my ($record, $time);
36my ($year, $month, $day, $h24, $h12, $min, $sec, $ampm);
37my (@date_data, @time_data);
38my $pass = 1;
39my $str;
40my $result;
41my @result;
42
43# Time::Format pattern example 1
44$str = "$Thu $November 2, 2005";
45eval {@result = $str =~ $RE{time}{tf}{-pat => 'Day Month d, yyyy'}{-keep}};
46is ($@, q{}, 'Time::Format example 1, no error');
47is_deeply (\@result, [$str, $Thu, $November, 2, 2005],
48           'Time::Format example 1, expected values');
49
50# Time::Format pattern example 2
51eval {@result = $str =~ $RE{time}{tf}{-pat => '(Weekday|Day) (Month|Mon) d, yyyy'}{-keep}};
52is ($@, q{}, 'Time::Format example 2, no error');
53is_deeply (\@result, [$Thu, $November],
54           'Time::Format example 2, expected values');
55
56
57# strftime pattern example 1
58$str = "$Thu $November 2, 2005";
59@result = eval {$str =~ $RE{time}{strftime}{-pat => '%a %B %_d, %Y'}{-keep}};
60is ($@, q{}, 'strftime example 1, no error');
61is_deeply (\@result, [$str, $Thu, $November, 2, 2005],
62           'strftime example 1, expected values');
63
64# strftime pattern example 2
65$str = "$Thu $November 2, 2005";
66eval {@result = $str =~ $RE{time}{strftime}{-pat => '(%A|%a)? (%B|%b) ?%_d, %Y'}{-keep}};
67is ($@, q{}, 'strftime example 2, no error');
68is_deeply (\@result, [$Thu, $November],
69           'strftime example 2, expected values');
70
71
72
73# Typical usage: parsing a data record.
74#
75$rec = "blah blah 2005/10/21 blah blarrrrrgh";
76@date = $rec =~ m{^blah blah $RE{time}{YMD}{-keep}};
77ok (scalar @date, 'Fuzzy record parsing matched');
78is_deeply (\@date, ['2005/10/21', 2005, 10, 21],
79           'Fuzzy record parsing, expected results');
80
81@date = $rec =~ m{^blah blah $RE{time}{tf}{-pat=>'yyyy/mm/dd'}{-keep}};
82ok (scalar @date, 'TF record parsing matched');
83is_deeply (\@date, ['2005/10/21', 2005, 10, 21],
84           'TF record parsing, expected results');
85
86@date = $rec =~ m{^blah blah $RE{time}{strftime}{-pat=>'%Y/%m/%d'}{-keep}};
87ok (scalar @date, 'strftime record parsing matched');
88is_deeply (\@date, ['2005/10/21', 2005, 10, 21],
89           'strftime record parsing, expected results');
90
91
92# Typical usage: parsing variable-format data.
93#
94eval
95{
96    require Time::Normalize;
97    Time::Normalize->import();
98};
99my $dont_have_normalize = $@? 1 : 0;
100
101SKIP:
102{
103    skip "Test relies on Time::Normalize, which you don't have", 3 if $dont_have_normalize;
104    my $pass = 1;
105    $record = "10-SEP-2005";
106
107    if ( ((undef,$m,$d,$y) = $record =~ /^$RE{time}{mdy}{-keep}/)
108     ||  ((undef,$d,$m,$y) = $record =~ /^$RE{time}{dmy}{-keep}/)
109     ||  ((undef,$y,$m,$d) = $record =~ /^$RE{time}{ymd}{-keep}/) )
110    {
111        eval {($year, $month, $day) = normalize_ymd($y, $m, $d)};
112    }
113    else      # give up
114    {
115        $pass = undef;
116    }
117    is ($@, q{}, 'variable parse: no error');
118    ok($pass, 'variable parse: matched');
119
120    # $day is now 10; $month is now 09; $year is now 2005.
121    is_deeply ([$day, $month, $year], [10, '09', 2005], 'variable parse: worked');
122}
123
124# Time examples
125#
126$time = '9:10pm';
127@time_data = $time =~ /$RE{time}{hms}{-keep}/;
128 # captures '9:10pm', '9', ':', '10', undef, 'pm'
129is_deeply (\@time_data, ['9:10pm', '9', '10', undef, 'pm'], 'Time example 1');
130
131@time_data = $time =~ /$RE{time}{tf}{-pat => '(h):(mm)(:ss)?(am)?'}{-keep}/;
132 # captures '9', '10', undef, 'pm'
133is_deeply (\@time_data, ['9', '10', undef, 'pm'], 'Time example 2');
134
135