use strict; use vars qw(@match $num_tests %RE); use vars qw(@MONTH @MON @WEEKDAY @DAY); BEGIN { # Man, this locale stuff is a pain. Why can't everyone just speak English?! ;-) # Set defaults: @MONTH = qw(January February March April May June July August September October November December); @MON = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec); @WEEKDAY = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday); @DAY = qw(Sun Mon Tue Wed Thu Fri Sat); eval { require POSIX; require I18N::Langinfo; eval { @MONTH = map I18N::Langinfo::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(); }; eval { @MON = map I18N::Langinfo::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(); }; eval { @WEEKDAY = map I18N::Langinfo::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(); }; eval { @DAY = map I18N::Langinfo::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(); }; }; # target, pattern, values, name @match = ( # 'a' : abbreviated weekday name [$DAY[0], '\A%a\z', [$DAY[0]], $DAY[0]], [$DAY[1], '\A%a\z', [$DAY[1]], $DAY[1]], [$DAY[2], '\A%a\z', [$DAY[2]], $DAY[2]], [$DAY[3], '\A%a\z', [$DAY[3]], $DAY[3]], [$DAY[4], '\A%a\z', [$DAY[4]], $DAY[4]], [$DAY[5], '\A%a\z', [$DAY[5]], $DAY[5]], [$DAY[6], '\A%a\z', [$DAY[6]], $DAY[6]], ["blah$DAY[1]blah", 'blah%ablah', ["blah$DAY[1]blah", $DAY[1]], 'M=Mon blahs'], ['*&^@#(','\A%a\z', undef, '"a" garbage'], # 'A' : full weekday name [$WEEKDAY[0], '\A%A\z', [$WEEKDAY[0]], $WEEKDAY[0]], [$WEEKDAY[1], '\A%A\z', [$WEEKDAY[1]], $WEEKDAY[1]], [$WEEKDAY[2], '\A%A\z', [$WEEKDAY[2]], $WEEKDAY[2]], [$WEEKDAY[3], '\A%A\z', [$WEEKDAY[3]], $WEEKDAY[3]], [$WEEKDAY[4], '\A%A\z', [$WEEKDAY[4]], $WEEKDAY[4]], [$WEEKDAY[5], '\A%A\z', [$WEEKDAY[5]], $WEEKDAY[5]], [$WEEKDAY[6], '\A%A\z', [$WEEKDAY[6]], $WEEKDAY[6]], ["blah$WEEKDAY[1]blah", 'blah%Ablah', ["blah$WEEKDAY[1]blah", $WEEKDAY[1]], 'M=Monday blahs'], ['*&^@#(', '\A%A\z', undef, '"A" garbage'], # 'b' : abbreviated month name [$MON[ 0], '\A%b\z', [$MON[ 0]], $MON[ 0]], [$MON[ 1], '\A%b\z', [$MON[ 1]], $MON[ 1]], [$MON[ 2], '\A%b\z', [$MON[ 2]], $MON[ 2]], [$MON[ 3], '\A%b\z', [$MON[ 3]], $MON[ 3]], [$MON[ 4], '\A%b\z', [$MON[ 4]], $MON[ 4]], [$MON[ 5], '\A%b\z', [$MON[ 5]], $MON[ 5]], [$MON[ 6], '\A%b\z', [$MON[ 6]], $MON[ 6]], [$MON[ 7], '\A%b\z', [$MON[ 7]], $MON[ 7]], [$MON[ 8], '\A%b\z', [$MON[ 8]], $MON[ 8]], [$MON[ 9], '\A%b\z', [$MON[ 9]], $MON[ 9]], [$MON[10], '\A%b\z', [$MON[10]], $MON[10]], [$MON[11], '\A%b\z', [$MON[11]], $MON[11]], # 'B' : full month name [$MONTH[ 0], '\A%B\z', [$MONTH[ 0]], $MONTH[ 0]], [$MONTH[ 1], '\A%B\z', [$MONTH[ 1]], $MONTH[ 1]], [$MONTH[ 2], '\A%B\z', [$MONTH[ 2]], $MONTH[ 2]], [$MONTH[ 3], '\A%B\z', [$MONTH[ 3]], $MONTH[ 3]], [$MONTH[ 4], '\A%B\z', [$MONTH[ 4]], $MONTH[ 4]], [$MONTH[ 5], '\A%B\z', [$MONTH[ 5]], $MONTH[ 5]], [$MONTH[ 6], '\A%B\z', [$MONTH[ 6]], $MONTH[ 6]], [$MONTH[ 7], '\A%B\z', [$MONTH[ 7]], $MONTH[ 7]], [$MONTH[ 8], '\A%B\z', [$MONTH[ 8]], $MONTH[ 8]], [$MONTH[ 9], '\A%B\z', [$MONTH[ 9]], $MONTH[ 9]], [$MONTH[10], '\A%B\z', [$MONTH[10]], $MONTH[10]], [$MONTH[11], '\A%B\z', [$MONTH[11]], $MONTH[11]], # 'c' : locale-specific format # Not sure how to test this. # 'C' : century ['abcd00', '%C', ['00'], 'Century 00'], ['10' , '\A%C\z', ['10'], 'Century 10'], ['a18', 'a(%C)', ['18'], 'Century 18'], ['(19)', '\(%C\)', ['(19)', 19], 'Century 19'], ['abcd20', '%C\z', ['20'], 'Century 20'], ['a2100', 'a%C', ['a21','21'], 'Century 21'], # 'd' : Day number ['01', '\A%d\z', ['01'], 'Day 01'], ['09', '\A%d\z', ['09'], 'Day 09'], ['10', '\A%d\z', ['10'], 'Day 10'], ['21', '\A%d\z', ['21'], 'Day 21'], ['30', '\A%d\z', ['30'], 'Day 30'], ['31', '\A%d\z', ['31'], 'Day 31'], ['00', '\A%d\z', undef, 'Day 00'], ['32', '\A%d\z', undef, 'Day 32'], ['99', '\A%d\z', undef, 'Day 99'], [' 8', '\A%d\z', undef, 'Day 8'], ['8', '\A%d\z', undef, 'Day 8'], # '_d' : Day number ['01', '\A%_d\z', ['01'], '_d Day 01'], ['09', '\A%_d\z', ['09'], '_d Day 09'], ['10', '\A%_d\z', ['10'], '_d Day 10'], ['21', '\A%_d\z', ['21'], '_d Day 21'], ['30', '\A%_d\z', ['30'], '_d Day 30'], ['31', '\A%_d\z', ['31'], '_d Day 31'], ['00', '\A%_d\z', undef, '_d Day 00'], ['32', '\A%_d\z', undef, '_d Day 32'], ['99', '\A%_d\z', undef, '_d Day 99'], [' 8', '\A%_d\z', undef, '_d Day 8'], ['8', '\A%_d\z', ['8'], '_d Day 8'], ['0', '\A%_d\z', undef, '_d Day 0'], # 'D' : m/d/y ['01/02/03', '%D', ['01/02/03'], '%D 01/02/03'], ['00/02/03', '%D', undef, '%D 00/02/03'], ['13/02/03', '%D', undef, '%D 13/02/03'], ['03/31/03', '%D', ['03/31/03'], '%D 03/31/03'], ['03/32/03', '%D', undef, '%D 03/31/03'], # 'e' : Day number, leading space [' 1', '%e', [' 1'], 'eDay 1'], [' 9', '%e', [' 9'], 'eDay 9'], ['10', '%e', ['10'], 'eDay 10'], ['21', '%e', ['21'], 'eDay 21'], ['30', '%e', ['30'], 'eDay 30'], ['31', '%e', ['31'], 'eDay 31'], [' 0', '%e', undef, 'eDay 0'], ['32', '%e', undef, 'eDay 32'], ['99', '%e', undef, 'eDay 99'], ['08', '%e', undef, 'eDay 08'], # 'h' : same as %b [$MON[ 0], '\A%h\z', [$MON[ 0]], 'hJan'], [$MON[ 1], '\A%h\z', [$MON[ 1]], 'hFeb'], [$MON[ 2], '\A%h\z', [$MON[ 2]], 'hMar'], [$MON[ 3], '\A%h\z', [$MON[ 3]], 'hApr'], [$MON[ 4], '\A%h\z', [$MON[ 4]], 'hMay'], [$MON[ 5], '\A%h\z', [$MON[ 5]], 'hJun'], [$MON[ 6], '\A%h\z', [$MON[ 6]], 'hJul'], [$MON[ 7], '\A%h\z', [$MON[ 7]], 'hAug'], [$MON[ 8], '\A%h\z', [$MON[ 8]], 'hSep'], [$MON[ 9], '\A%h\z', [$MON[ 9]], 'hOct'], [$MON[10], '\A%h\z', [$MON[10]], 'hNov'], [$MON[11], '\A%h\z', [$MON[11]], 'hDec'], # 'H' : hour, 00-23 ['00', '%H', ['00'], 'hour24 00'], ['01', '%H', ['01'], 'hour24 01'], ['10', '%H', ['10'], 'hour24 10'], ['13', '%H', ['13'], 'hour24 13'], ['20', '%H', ['20'], 'hour24 20'], ['23', '%H', ['23'], 'hour24 23'], [' 0', '%H', undef, 'hour24 0'], [' 1', '%H', undef, 'hour24 1'], ['24', '%H', undef, 'hour24 24'], # '_H' : hour, 0-23 ['00', '%_H', ['00'], '_H hour24 00'], ['01', '%_H', ['01'], '_H hour24 01'], ['10', '%_H', ['10'], '_H hour24 10'], ['13', '%_H', ['13'], '_H hour24 13'], ['20', '%_H', ['20'], '_H hour24 20'], ['23', '%_H', ['23'], '_H hour24 23'], [' 0', '\A%_H\z', undef, '_H hour24 0'], [' 1', '\A%_H\z', undef, '_H hour24 1'], ['0', '\A%_H\z', ['0'], '_H hour24 0'], ['1', '\A%_H\z', ['1'], '_H hour24 1'], ['24', '\A%_H\z', undef, '_H hour24 24'], # 'I' : hour, 01-12 ['01', '%I', ['01'], 'hour12 01'], ['10', '%I', ['10'], 'hour12 10'], ['12', '%I', ['12'], 'hour12 12'], ['13', '%I', undef, 'hour12 13'], ['00', '%I', undef, 'hour12 00'], [' 0', '%I', undef, 'hour12 0'], [' 1', '%I', undef, 'hour12 1'], # '_I' : hour, 1-12 ['01', '%_I', ['01'], '_I hour12 01'], ['10', '%_I', ['10'], '_I hour12 10'], ['12', '%_I', ['12'], '_I hour12 12'], ['13', '\A%_I\z', undef, '_I hour12 13'], ['00', '%_I', undef, '_I hour12 00'], [' 0', '\A%_I\z', undef, '_I hour12 0'], [' 1', '\A%_I\z', undef, '_I hour12 1'], ['0', '\A%_I\z', undef, '_I hour12 0'], ['1', '\A%_I\z', ['1'], '_I hour12 1'], # 'j' : day of year, 001-366 ['001', '%j', ['001'], 'doy 001'], ['101', '%j', ['101'], 'doy 101'], ['201', '%j', ['201'], 'doy 201'], ['301', '%j', ['301'], 'doy 301'], ['366', '%j', ['366'], 'doy 366'], ['000', '%j', undef, 'doy 000'], ['367', '%j', undef, 'doy 367'], [' 1', '%j', undef, 'doy 1'], [ '27', '%j', undef, 'doy 27' ], # 'm' : month number, 01-12 ['01', '%m', ['01'], 'month num 01'], ['10', '%m', ['10'], 'month num 10'], ['12', '%m', ['12'], 'month num 12'], ['13', '%m', undef, 'month num 13'], ['00', '%m', undef, 'month num 00'], [' 0', '%m', undef, 'month num 0'], [' 1', '%m', undef, 'month num 1'], # '_m' : month number, 1-12 ['01', '%_m', ['01'], '_m month num 01'], ['10', '%_m', ['10'], '_m month num 10'], ['12', '%_m', ['12'], '_m month num 12'], ['13', '\A%_m\z', undef, '_m month num 13'], ['00', '%_m', undef, '_m month num 00'], [' 0', '\A%_m\z', undef, '_m month num 0'], [' 1', '\A%_m\z', undef, '_m month num 1'], ['0', '\A%_m\z', undef, '_m month num 0'], ['1', '\A%_m\z', ['1'], '_m month num 1'], # 'M' : minute number, 00-59 ['00', '%M', ['00'], 'minute 00'], ['01', '%M', ['01'], 'minute 01'], ['10', '%M', ['10'], 'minute 10'], ['20', '%M', ['20'], 'minute 20'], ['30', '%M', ['30'], 'minute 30'], ['40', '%M', ['40'], 'minute 40'], ['50', '%M', ['50'], 'minute 50'], ['59', '%M', ['59'], 'minute 59'], ['60', '%M', undef, 'minute 60'], [' 0', '%M', undef, 'minute 0'], [ '1', '%M', undef, 'minute 1' ], # '_M' : minute number, 0-59 ['00', '%_M', ['00'], 'minute 00'], ['01', '%_M', ['01'], 'minute 01'], ['10', '%_M', ['10'], 'minute 10'], ['20', '%_M', ['20'], 'minute 20'], ['30', '%_M', ['30'], 'minute 30'], ['40', '%_M', ['40'], 'minute 40'], ['50', '%_M', ['50'], 'minute 50'], ['59', '%_M', ['59'], 'minute 59'], ['60', '\A%_M\z', undef, 'minute 60'], [' 0', '\A%_M\z', undef, 'minute 0'], [' 1', '\A%_M\z', undef, 'minute 1'], ['0', '\A%_M\z', ['0'], 'minute 0' ], ['1', '\A%_M\z', ['1'], 'minute 1' ], # Not sure how to test 'p' or 'r'. # 'R' : hour24:minute ['00:00', '%R', ['00:00'], 'h24:minute 00:00'], ['01:00', '%R', ['01:00'], 'h24:minute 01:00'], ['10:00', '%R', ['10:00'], 'h24:minute 10:00'], ['13:00', '%R', ['13:00'], 'h24:minute 13:00'], ['20:00', '%R', ['20:00'], 'h24:minute 20:00'], ['23:00', '%R', ['23:00'], 'h24:minute 23:00'], [' 0:00', '%R', undef, 'h24:minute 0:00'], [' 1:00', '%R', undef, 'h24:minute 1:00'], ['24:00', '%R', undef, 'h24:minute 24:00'], ['02:00', '%R', ['02:00'], 'h24:minute 02:00'], ['02:01', '%R', ['02:01'], 'h24:minute 02:01'], ['02:10', '%R', ['02:10'], 'h24:minute 02:10'], ['02:20', '%R', ['02:20'], 'h24:minute 02:20'], ['02:30', '%R', ['02:30'], 'h24:minute 02:30'], ['02:40', '%R', ['02:40'], 'h24:minute 02:40'], ['02:50', '%R', ['02:50'], 'h24:minute 02:50'], ['02:59', '%R', ['02:59'], 'h24:minute 02:59'], ['02:60', '%R', undef, 'h24:minute 02:60'], ['02: 0', '%R', undef, 'h24:minute 02: 0'], ['02:1' , '%R', undef, 'h24:minute 02:1' ], # 'S' : second, 00-61 ['00', '%S', ['00'], 'second 00'], ['01', '%S', ['01'], 'second 01'], ['10', '%S', ['10'], 'second 10'], ['20', '%S', ['20'], 'second 20'], ['30', '%S', ['30'], 'second 30'], ['40', '%S', ['40'], 'second 40'], ['50', '%S', ['50'], 'second 50'], ['59', '%S', ['59'], 'second 59'], ['60', '%S', ['60'], 'second 60'], ['61', '%S', ['61'], 'second 61'], ['62', '%S', undef, 'second 62'], [' 0', '%S', undef, 'second 0'], [ '1', '%S', undef, 'second 1' ], # 'T' : H24:M:S ['00:00:00', '%T', ['00:00:00'], 'h24:min:sec 00:00:00'], ['01:00:00', '%T', ['01:00:00'], 'h24:min:sec 01:00:00'], ['10:00:00', '%T', ['10:00:00'], 'h24:min:sec 10:00:00'], ['13:00:00', '%T', ['13:00:00'], 'h24:min:sec 13:00:00'], ['20:00:00', '%T', ['20:00:00'], 'h24:min:sec 20:00:00'], ['23:00:00', '%T', ['23:00:00'], 'h24:min:sec 23:00:00'], [' 0:00:00', '%T', undef, 'h24:min:sec 0:00:00'], [' 1:00:00', '%T', undef, 'h24:min:sec 1:00:00'], ['24:00:00', '%T', undef, 'h24:min:sec 24:00:00'], ['02:00:00', '%T', ['02:00:00'], 'h24:min:sec 02:00:00'], ['02:01:00', '%T', ['02:01:00'], 'h24:min:sec 02:01:00'], ['02:10:00', '%T', ['02:10:00'], 'h24:min:sec 02:10:00'], ['02:20:00', '%T', ['02:20:00'], 'h24:min:sec 02:20:00'], ['02:30:00', '%T', ['02:30:00'], 'h24:min:sec 02:30:00'], ['02:40:00', '%T', ['02:40:00'], 'h24:min:sec 02:40:00'], ['02:50:00', '%T', ['02:50:00'], 'h24:min:sec 02:50:00'], ['02:59:00', '%T', ['02:59:00'], 'h24:min:sec 02:59:00'], ['02:60:00', '%T', undef, 'h24:min:sec 02:60:00'], ['02: 0:00', '%T', undef, 'h24:min:sec 02: 0:00'], ['02:1:00' , '%T', undef, 'h24:min:sec 02:1:00' ], ['13:45:00', '%T', ['13:45:00'], 'h24:min:sec 13:45:00'], ['13:45:01', '%T', ['13:45:01'], 'h24:min:sec 13:45:01'], ['13:45:10', '%T', ['13:45:10'], 'h24:min:sec 13:45:10'], ['13:45:20', '%T', ['13:45:20'], 'h24:min:sec 13:45:20'], ['13:45:30', '%T', ['13:45:30'], 'h24:min:sec 13:45:30'], ['13:45:40', '%T', ['13:45:40'], 'h24:min:sec 13:45:40'], ['13:45:50', '%T', ['13:45:50'], 'h24:min:sec 13:45:50'], ['13:45:59', '%T', ['13:45:59'], 'h24:min:sec 13:45:59'], ['13:45:60', '%T', ['13:45:60'], 'h24:min:sec 13:45:60'], ['13:45:61', '%T', ['13:45:61'], 'h24:min:sec 13:45:61'], ['13:45:62', '%T', undef, 'h24:min:sec 13:45:62'], ['13:45: 0', '%T', undef, 'h24:min:sec 13:45: 0'], ['13:45:1', '%T', undef, 'h24:min:sec 13:45:1' ], # 'u' : Weekday number, 1-7 ['0', '%u', undef, 'wkd1-7 0'], ['1', '%u', ['1'], 'wkd1-7 1'], ['2', '%u', ['2'], 'wkd1-7 2'], ['3', '%u', ['3'], 'wkd1-7 3'], ['4', '%u', ['4'], 'wkd1-7 4'], ['5', '%u', ['5'], 'wkd1-7 5'], ['6', '%u', ['6'], 'wkd1-7 6'], ['7', '%u', ['7'], 'wkd1-7 7'], ['8', '%u', undef, 'wkd1-7 8'], # 'U' : week number, 00-53 ['00', '%U', ['00'], 'week num U 00'], ['01', '%U', ['01'], 'week num U 01'], ['10', '%U', ['10'], 'week num U 10'], ['20', '%U', ['20'], 'week num U 20'], ['30', '%U', ['30'], 'week num U 30'], ['40', '%U', ['40'], 'week num U 40'], ['50', '%U', ['50'], 'week num U 50'], ['51', '%U', ['51'], 'week num U 51'], ['52', '%U', ['52'], 'week num U 52'], ['53', '%U', ['53'], 'week num U 53'], ['54', '%U', undef, 'week num U 54'], [' 0', '%U', undef, 'week num U 0'], [ '1', '%U', undef, 'week num U 1' ], # 'V' : week number, 01-53 ['00', '%V', undef, 'week num V 00'], ['01', '%V', ['01'], 'week num V 01'], ['10', '%V', ['10'], 'week num V 10'], ['20', '%V', ['20'], 'week num V 20'], ['30', '%V', ['30'], 'week num V 30'], ['40', '%V', ['40'], 'week num V 40'], ['50', '%V', ['50'], 'week num V 50'], ['51', '%V', ['51'], 'week num V 51'], ['52', '%V', ['52'], 'week num V 52'], ['53', '%V', ['53'], 'week num V 53'], ['54', '%V', undef, 'week num V 54'], [' 0', '%V', undef, 'week num V 0'], [ '1', '%V', undef, 'week num V 1' ], # 'w' : Weekday number, 1-7 ['', '%w', undef, 'wkd0-6 ""'], ['0', '%w', ['0'], 'wkd0-6 0'], ['1', '%w', ['1'], 'wkd0-6 1'], ['2', '%w', ['2'], 'wkd0-6 2'], ['3', '%w', ['3'], 'wkd0-6 3'], ['4', '%w', ['4'], 'wkd0-6 4'], ['5', '%w', ['5'], 'wkd0-6 5'], ['6', '%w', ['6'], 'wkd0-6 6'], ['7', '%w', undef, 'wkd0-6 7'], # 'W' : week number, 00-53 ['00', '%W', ['00'], 'week num W 00'], ['01', '%W', ['01'], 'week num W 01'], ['10', '%W', ['10'], 'week num W 10'], ['20', '%W', ['20'], 'week num W 20'], ['30', '%W', ['30'], 'week num W 30'], ['40', '%W', ['40'], 'week num W 40'], ['50', '%W', ['50'], 'week num W 50'], ['51', '%W', ['51'], 'week num W 51'], ['52', '%W', ['52'], 'week num W 52'], ['53', '%W', ['53'], 'week num W 53'], ['54', '%W', undef, 'week num W 54'], [' 0', '%W', undef, 'week num W 0'], [ '1', '%W', undef, 'week num W 1' ], # Not sure how to test 'x' or 'X' # 'y' : 2-digit year number ['00', '%y', ['00'], '2-digit year 00'], ['01', '%y', ['01'], '2-digit year 01'], ['90', '%y', ['90'], '2-digit year 90'], ['99', '%y', ['99'], '2-digit year 99'], ['3', '%y', undef, '2-digit year 3'], # 'Y' : 4-digit year number ['0000', '%Y', ['0000'], '4-digit year 0000'], ['1801', '%Y', ['1801'], '4-digit year 1801'], ['1990', '%Y', ['1990'], '4-digit year 1990'], ['2099', '%Y', ['2099'], '4-digit year 2099'], ['30', '%Y', undef, '4-digit year 30'], # TODO: add some mix&match tests here. ); # How many matches will succeed? my $to_succeed = scalar grep $_->[2], @match; # Run two tests per match, plus two additional per expected success $num_tests = 2 * scalar(@match) + 2 * $to_succeed; # Plus one for the 'use_ok' call $num_tests += 1; } use Test::More tests => $num_tests; use_ok('Regexp::Common', 'time'); foreach my $match (@match) { my ($text, $pattern, $matchvars, $testname) = @$match; my $did_succeed; my $should_succeed = defined $matchvars; my @captures; # Regexp captures # FIRST: check whether it succeeded or failed as expected. # 'keep' option is OFF; should be no captures. @captures = $text =~ /$RE{time}{strftime}{-pat=>$pattern}/; $did_succeed = @captures > 0; # TEST 1: simple matching my $ought = $should_succeed? 'match' : 'fail'; my $actual = $did_succeed == $should_succeed? "${ought}ed" : "did not $ought"; ok ( ($should_succeed && $did_succeed) || (!$should_succeed && !$did_succeed), "$testname - $actual as expected (nokeep)."); # TEST 2: Shouldn't capture anything if ($should_succeed) { SKIP: { skip "$testname - can't check captures since match unsuccessful", 1 if !$did_succeed; skip "$testname - user-controlled captures", 1 if $pattern =~ /\(/; is_deeply(\@captures, [1], "$testname - didn't unduly capture"); } } # SECOND: use 'keep' option to check captures. @captures = $text =~ /$RE{time}{strftime}{-pat=>$pattern}{-keep}/; $did_succeed = @captures > 0; # TEST 3: matching with 'keep' ok ( ($should_succeed && $did_succeed) || (!$should_succeed && !$did_succeed), "$testname - $actual as expected (keep)."); # TEST 4: capture variables should be set. if ($should_succeed) { SKIP: { skip "$testname - can't check captures since match unsuccessful", 1 if !$did_succeed; is_deeply(\@captures, $matchvars, "$testname - correct capture variables"); } } }