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