The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use vars qw(@match $num_tests %RE);

# Get day/month names in current locale
my ($Jan, $Feb, $Mar, $Apr, $May, $Jun, $Jul, $Aug, $Sep, $Oct, $Nov, $Dec);
my ($January, $February, $March, $April, $MayFull, $June, $July, $August, $September, $October, $November, $December);

BEGIN
{
    eval
    {
        require I18N::Langinfo;
        I18N::Langinfo->import(qw(langinfo MON_1 ABMON_1 MON_2 ABMON_2 MON_3 ABMON_3 MON_4 ABMON_4 MON_5 ABMON_5 MON_6 ABMON_6 MON_7 ABMON_7 MON_8 ABMON_8 MON_9 ABMON_9 MON_10 ABMON_10 MON_11 ABMON_11 MON_12 ABMON_12));
        ($Jan, $Feb, $Mar, $Apr, $May, $Jun, $Jul, $Aug, $Sep, $Oct, $Nov, $Dec)
            = map langinfo($_), (ABMON_1(), ABMON_2(), ABMON_3(), ABMON_4(), ABMON_5(), ABMON_6(), ABMON_7(), ABMON_8(), ABMON_9(), ABMON_10(), ABMON_11(), ABMON_12());
        ($January, $February, $March, $April, $MayFull, $June, $July, $August, $September, $October, $November, $December)
            = map langinfo($_), (MON_1(), MON_2(), MON_3(), MON_4(), MON_5(), MON_6(), MON_7(), MON_8(), MON_9(), MON_10(), MON_11(), MON_12());
    };
    if ($@)
    {
        ($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);
        ($January, $February, $March, $April, $MayFull, $June, $July, $August, $September, $October, $November, $December)
            = qw(January February March April May June July August September October November December);
    }

    @match = (
# mdy tests.
              ['10/19/2005', 'mdy', [], 1, [qw(10/19/2005 10 19 2005)]],
              ['10.19.2005', 'mdy', [], 1, [qw(10.19.2005 10 19 2005)]],
              ['10-19-2005', 'mdy', [], 1, [qw(10-19-2005 10 19 2005)]],
              ['10x19x2005', 'mdy', [], 0, ],
              ['10192005',   'mdy', [], 1, [qw(10192005   10 19 2005)]],
              # leading/trailing junk shouldn't cause the match to change
              ['abc10/19/2005xyz', 'mdy', [], 1, [qw(10/19/2005 10 19 2005)]],
              ['abc10.19.2005xyz', 'mdy', [], 1, [qw(10.19.2005 10 19 2005)]],
              ['abc10-19-2005xyz', 'mdy', [], 1, [qw(10-19-2005 10 19 2005)]],
              ['abc10x19x2005xyz', 'mdy', [], 0, ],
              ['abc10192005xyz',   'mdy', [], 1, [qw(10192005 10 19 2005)]],
              # However, leading digits cause loose m to fail, and trailing digits cause loose y to fail
              ['010/19/2005', 'mdy', [], 0, ],
              ['10/19/20050', 'mdy', [], 0, ],
              ['10/19/050',   'mdy', [], 0, ],
              # Mismatched or invalid separators
              ['10/19-2005', 'mdy', [], 0, ],
              ['10-19.2005', 'mdy', [], 0, ],
              ['10%19%2005', 'mdy', [], 0, ],
              # Two-year date should match mdy as well
              ['10/19/05', 'mdy', [], 1, [qw(10/19/05 10 19 05)]],
              ['10.19.05', 'mdy', [], 1, [qw(10.19.05 10 19 05)]],
              ['10-19-05', 'mdy', [], 1, [qw(10-19-05 10 19 05)]],
              ['10x19x05', 'mdy', [], 0, ],
              ['101905',   'mdy', [], 1, [qw(101905 10 19 05)]],
              # one-digit month
              ['1/19/2005', 'mdy', [], 1, [qw(1/19/2005 1 19 2005)]],
              ['1.19.2005', 'mdy', [], 1, [qw(1.19.2005 1 19 2005)]],
              ['1-19-2005', 'mdy', [], 1, [qw(1-19-2005 1 19 2005)]],
              ['1x19x2005', 'mdy', [], 0, ],
              ['1192005',   'mdy', [], 0, ],
              # one-digit day
              ['10/9/2005', 'mdy', [], 1, [qw(10/9/2005 10 9 2005)]],
              ['10.9.2005', 'mdy', [], 1, [qw(10.9.2005 10 9 2005)]],
              ['10-9-2005', 'mdy', [], 1, [qw(10-9-2005 10 9 2005)]],
              ['10x9x2005', 'mdy', [], 0, ],
              ['1092005',   'mdy', [], 0, ],
              # one-digit month and day
              ['1/9/2005', 'mdy', [], 1, [qw(1/9/2005 1 9 2005)]],
              ['1.9.2005', 'mdy', [], 1, [qw(1.9.2005 1 9 2005)]],
              ['1-9-2005', 'mdy', [], 1, [qw(1-9-2005 1 9 2005)]],
              ['1x9x2005', 'mdy', [], 0, ],
              ['192005',   'mdy', [], 0, ],
              # m/dd/yy
              ['1/19/05', 'mdy', [], 1, [qw(1/19/05 1 19 05)]],
              ['1.19.05', 'mdy', [], 1, [qw(1.19.05 1 19 05)]],
              ['1-19-05', 'mdy', [], 1, [qw(1-19-05 1 19 05)]],
              ['1x19x05', 'mdy', [], 0, ],
              ['11905',   'mdy', [], 0, ],
              # mm/d/yy
              ['10/9/05', 'mdy', [], 1, [qw(10/9/05 10 9 05)]],
              ['10.9.05', 'mdy', [], 1, [qw(10.9.05 10 9 05)]],
              ['10-9-05', 'mdy', [], 1, [qw(10-9-05 10 9 05)]],
              ['10x9x05', 'mdy', [], 0, ],
              ['10905',   'mdy', [], 0, ],
              # m/d/yy
              ['1/9/05', 'mdy', [], 1, [qw(1/9/05 1 9 05)]],
              ['1.9.05', 'mdy', [], 1, [qw(1.9.05 1 9 05)]],
              ['1-9-05', 'mdy', [], 1, [qw(1-9-05 1 9 05)]],
              ['1x9x05', 'mdy', [], 0, ],
              ['1905',   'mdy', [], 0, ],
              # Invalid month
              ['13/19/2005', 'mdy', [], 0, ],
              ['21/19/2005', 'mdy', [], 0, ],
              ['0/19/2005',  'mdy', [], 0, ],
              ['00/19/2005', 'mdy', [], 0, ],
              # Invalid day
              ['12/0/2005', 'mdy',  [], 0, ],
              ['12/00/2005', 'mdy', [], 0, ],
              ['12/40/2005', 'mdy', [], 0, ],
              ['12/32/2005', 'mdy', [], 0, ],

# mdy4 tests.  Mostly the same as above.
              ['10/19/2005', 'mdy4', [], 1, [qw(10/19/2005 10 19 2005)]],
              ['10.19.2005', 'mdy4', [], 1, [qw(10.19.2005 10 19 2005)]],
              ['10-19-2005', 'mdy4', [], 1, [qw(10-19-2005 10 19 2005)]],
              ['10x19x2005', 'mdy4', [], 0, ],
              ['10192005',   'mdy4', [], 1, [qw(10192005 10 19 2005)]],
              # leading/trailing junk shouldn't cause the match to change
              ['abc10/19/2005000', 'mdy4', [], 1, [qw(10/19/2005 10 19 2005)]],
              ['abc10.19.2005000', 'mdy4', [], 1, [qw(10.19.2005 10 19 2005)]],
              ['abc10-19-2005xyz', 'mdy4', [], 1, [qw(10-19-2005 10 19 2005)]],
              ['abc10x19x2005xyz', 'mdy4', [], 0, ],
              ['abc10192005000',   'mdy4', [], 1, [qw(10192005 10 19 2005)]],
              # However, leading digits cause loose m to fail
              ['010/19/2005', 'mdy4', [], 0, ],
              # Mismatched or invalid separators
              ['10/19-2005', 'mdy4', [], 0, ],
              ['10-19.2005', 'mdy4', [], 0, ],
              ['10%19%2005', 'mdy4', [], 0, ],
              # Two-year date should not match mdy4
              ['10/19/05', 'mdy4', [], 0, ],
              ['10.19.05', 'mdy4', [], 0, ],
              ['10-19-05', 'mdy4', [], 0, ],
              ['10x19x05', 'mdy4', [], 0, ],
              ['101905',   'mdy4', [], 0, ],
              # one-digit month
              ['1/19/2005', 'mdy4', [], 1, [qw(1/19/2005 1 19 2005)]],
              ['1.19.2005', 'mdy4', [], 1, [qw(1.19.2005 1 19 2005)]],
              ['1-19-2005', 'mdy4', [], 1, [qw(1-19-2005 1 19 2005)]],
              ['1x19x2005', 'mdy4', [], 0, ],
              ['1192005',   'mdy4', [], 0, ],
              # one-digit day
              ['10/9/2005', 'mdy4', [], 1, [qw(10/9/2005 10 9 2005)]],
              ['10.9.2005', 'mdy4', [], 1, [qw(10.9.2005 10 9 2005)]],
              ['10-9-2005', 'mdy4', [], 1, [qw(10-9-2005 10 9 2005)]],
              ['10x9x2005', 'mdy4', [], 0, ],
              ['1092005',   'mdy4', [], 0, ],
              # one-digit month and day
              ['1/9/2005', 'mdy4', [], 1, [qw(1/9/2005 1 9 2005)]],
              ['1.9.2005', 'mdy4', [], 1, [qw(1.9.2005 1 9 2005)]],
              ['1-9-2005', 'mdy4', [], 1, [qw(1-9-2005 1 9 2005)]],
              ['1x9x2005', 'mdy4', [], 0, ],
              ['192005',   'mdy4', [], 0, ],
              # m/dd/yy
              ['1/19/05', 'mdy4', [], 0, ],
              ['1.19.05', 'mdy4', [], 0, ],
              ['1-19-05', 'mdy4', [], 0, ],
              ['1x19x05', 'mdy4', [], 0, ],
              ['11905',   'mdy4', [], 0, ],
              ['11905',   'mdy4', [], 0, ],
              # mm/d/yy
              ['10/9/05', 'mdy4', [], 0, ],
              ['10.9.05', 'mdy4', [], 0, ],
              ['10-9-05', 'mdy4', [], 0, ],
              ['10x9x05', 'mdy4', [], 0, ],
              ['10905',   'mdy4', [], 0, ],
              # m/d/yy
              ['1/9/05', 'mdy4', [], 0, ],
              ['1.9.05', 'mdy4', [], 0, ],
              ['1-9-05', 'mdy4', [], 0, ],
              ['1x9x05', 'mdy4', [], 0, ],
              ['1905',   'mdy4', [], 0, ],
              # Invalid month
              ['13/19/2005', 'mdy4', [], 0, ],
              ['21/19/2005', 'mdy4', [], 0, ],
              ['0/19/2005',  'mdy4', [], 0, ],
              ['00/19/2005', 'mdy4', [], 0, ],
              # Invalid day
              ['12/0/2005', 'mdy4',  [], 0, ],
              ['12/00/2005', 'mdy4', [], 0, ],
              ['12/40/2005', 'mdy4', [], 0, ],
              ['12/32/2005', 'mdy4', [], 0, ],

# mdy2 tests
              ['10/19/2005', 'mdy2', [], 1, [qw(10/19/20 10 19 20)]],
              ['10.19.2005', 'mdy2', [], 1, [qw(10.19.20 10 19 20)]],
              ['10-19-2005', 'mdy2', [], 1, [qw(10-19-20 10 19 20)]],
              ['10x19x2005', 'mdy2', [], 0, ],
              ['10192005',   'mdy2', [], 1, [qw(101920 10 19 20)]],
              # leading/trailing junk shouldn't cause the match to change
              ['abc10/19/2005000', 'mdy2', [], 1, [qw(10/19/20 10 19 20)]],
              ['abc10.19.2005000', 'mdy2', [], 1, [qw(10.19.20 10 19 20)]],
              ['abc10-19-20vwxyz', 'mdy2', [], 1, [qw(10-19-20 10 19 20)]],
              ['abc10x19x20vwxyz', 'mdy2', [], 0, ],
              ['abc10192005000',   'mdy2', [], 1, [qw(101920 10 19 20)]],
              # However, leading digits cause loose m to fail
              ['910/19/2005000', 'mdy2', [], 0, ],
              # Mismatched or invalid separators
              ['10/19-05', 'mdy2', [], 0, ],
              ['10-19.05', 'mdy2', [], 0, ],
              ['10%19%05', 'mdy2', [], 0, ],
              # Two-year date should match
              ['10/19/05', 'mdy2', [], 1, [qw(10/19/05 10 19 05)]],
              ['10.19.05', 'mdy2', [], 1, [qw(10.19.05 10 19 05)]],
              ['10-19-05', 'mdy2', [], 1, [qw(10-19-05 10 19 05)]],
              ['10x19x05', 'mdy2', [], 0, ],
              ['101905',   'mdy2', [], 1, [qw(101905 10 19 05)]],
              # one-digit month
              ['1/19/2005', 'mdy2', [], 1, [qw(1/19/20 1 19 20)]],
              ['1.19.2005', 'mdy2', [], 1, [qw(1.19.20 1 19 20)]],
              ['1-19-2005', 'mdy2', [], 1, [qw(1-19-20 1 19 20)]],
              ['1x19x2005', 'mdy2', [], 0, ],
              ['1192005',   'mdy2', [], 0, ],
              # one-digit day
              ['10/9/2005', 'mdy2', [], 1, [qw(10/9/20 10 9 20)]],
              ['10.9.2005', 'mdy2', [], 1, [qw(10.9.20 10 9 20)]],
              ['10-9-2005', 'mdy2', [], 1, [qw(10-9-20 10 9 20)]],
              ['10x9x2005', 'mdy2', [], 0, ],
              ['1092005',   'mdy2', [], 0, ],
              # one-digit month and day
              ['1/9/2005', 'mdy2', [], 1, [qw(1/9/20 1 9 20)]],
              ['1.9.2005', 'mdy2', [], 1, [qw(1.9.20 1 9 20)]],
              ['1-9-2005', 'mdy2', [], 1, [qw(1-9-20 1 9 20)]],
              ['1x9x2005', 'mdy2', [], 0, ],
              ['192005',   'mdy2', [], 0, ],
              # m/dd/yy
              ['1/19/05', 'mdy2', [], 1, [qw(1/19/05 1 19 05)]],
              ['1.19.05', 'mdy2', [], 1, [qw(1.19.05 1 19 05)]],
              ['1-19-05', 'mdy2', [], 1, [qw(1-19-05 1 19 05)]],
              ['1x19x05', 'mdy2', [], 0, ],
              ['11905',   'mdy2', [], 0, ],
              # mm/d/yy
              ['10/9/05', 'mdy2', [], 1, [qw(10/9/05 10 9 05)]],
              ['10.9.05', 'mdy2', [], 1, [qw(10.9.05 10 9 05)]],
              ['10-9-05', 'mdy2', [], 1, [qw(10-9-05 10 9 05)]],
              ['10x9x05', 'mdy2', [], 0, ],
              ['10905',   'mdy2', [], 0, ],
              # m/d/yy
              ['1/9/05', 'mdy2', [], 1, [qw(1/9/05 1 9 05)]],
              ['1.9.05', 'mdy2', [], 1, [qw(1.9.05 1 9 05)]],
              ['1-9-05', 'mdy2', [], 1, [qw(1-9-05 1 9 05)]],
              ['1x9x05', 'mdy2', [], 0, ],
              ['1905',   'mdy2', [], 0, ],
              # Invalid month
              ['13/19/05', 'mdy2', [], 0, ],
              ['21/19/05', 'mdy2', [], 0, ],
              ['0/19/05',  'mdy2', [], 0, ],
              ['00/19/05', 'mdy2', [], 0, ],
              # Invalid day
              ['12/0/05',  'mdy2', [], 0, ],
              ['12/00/05', 'mdy2', [], 0, ],
              ['12/40/05', 'mdy2', [], 0, ],
              ['12/32/05', 'mdy2', [], 0, ],

# m2d2y4 tests
              ['10/19/2005', 'm2d2y4', [], 1, [qw(10/19/2005 10 19 2005)]],
              ['10.19.2005', 'm2d2y4', [], 1, [qw(10.19.2005 10 19 2005)]],
              ['10-19-2005', 'm2d2y4', [], 1, [qw(10-19-2005 10 19 2005)]],
              ['10x19x2005', 'm2d2y4', [], 0, ],
              ['10192005',   'm2d2y4', [], 1, [qw(10192005 10 19 2005)]],
              # leading/trailing junk shouldn't cause the match to change
              ['abc10/19/2005000', 'm2d2y4', [], 1, [qw(10/19/2005 10 19 2005)]],
              ['abc10.19.2005000', 'm2d2y4', [], 1, [qw(10.19.2005 10 19 2005)]],
              ['00010-19-2005000', 'm2d2y4', [], 1, [qw(10-19-2005 10 19 2005)]],
              ['abc10x19x2005000', 'm2d2y4', [], 0, ],
              ['10192005000',   'm2d2y4', [], 1, [qw(10192005 10 19 2005)]],
              # Mismatched or invalid separators
              ['10/19-2005', 'm2d2y4', [], 0, ],
              ['10-19.2005', 'm2d2y4', [], 0, ],
              ['10%19%2005', 'm2d2y4', [], 0, ],
              # Two-year date should not match
              ['10/19/05', 'm2d2y4', [], 0, ],
              ['10.19.05', 'm2d2y4', [], 0, ],
              ['10-19-05', 'm2d2y4', [], 0, ],
              ['10x19x05', 'm2d2y4', [], 0, ],
              ['101905',   'm2d2y4', [], 0, ],
              # one-digit month
              ['1/19/2005', 'm2d2y4', [], 0, ],
              ['1.19.2005', 'm2d2y4', [], 0, ],
              ['1-19-2005', 'm2d2y4', [], 0, ],
              ['1x19x2005', 'm2d2y4', [], 0, ],
              ['1192005',   'm2d2y4', [], 0, ],
              # one-digit day
              ['10/9/2005', 'm2d2y4', [], 0, ],
              ['10.9.2005', 'm2d2y4', [], 0, ],
              ['10-9-2005', 'm2d2y4', [], 0, ],
              ['10x9x2005', 'm2d2y4', [], 0, ],
              ['1092005',   'm2d2y4', [], 0, ],
              # one-digit month and day
              ['1/9/2005', 'm2d2y4', [], 0, ],
              ['1.9.2005', 'm2d2y4', [], 0, ],
              ['1-9-2005', 'm2d2y4', [], 0, ],
              ['1x9x2005', 'm2d2y4', [], 0, ],
              ['192005',   'm2d2y4', [], 0, ],
              # m/dd/yy
              ['1/19/05', 'm2d2y4', [], 0, ],
              ['1.19.05', 'm2d2y4', [], 0, ],
              ['1-19-05', 'm2d2y4', [], 0, ],
              ['1x19x05', 'm2d2y4', [], 0, ],
              ['11905',   'm2d2y4', [], 0, ],
              # mm/d/yy
              ['10/9/05', 'm2d2y4', [], 0, ],
              ['10.9.05', 'm2d2y4', [], 0, ],
              ['10-9-05', 'm2d2y4', [], 0, ],
              ['10x9x05', 'm2d2y4', [], 0, ],
              ['10905',   'm2d2y4', [], 0, ],
              # m/d/yy
              ['1/9/05', 'm2d2y4', [], 0, ],
              ['1.9.05', 'm2d2y4', [], 0, ],
              ['1-9-05', 'm2d2y4', [], 0, ],
              ['1x9x05', 'm2d2y4', [], 0, ],
              ['1905',   'm2d2y4', [], 0, ],
              # Invalid month
              ['13/19/2005', 'm2d2y4', [], 0, ],
              ['21/19/2005', 'm2d2y4', [], 0, ],
              ['0/19/2005',  'm2d2y4', [], 0, ],
              ['00/19/2005', 'm2d2y4', [], 0, ],
              # Invalid day
              ['12/0/2005',  'm2d2y4', [], 0, ],
              ['12/00/2005', 'm2d2y4', [], 0, ],
              ['12/40/2005', 'm2d2y4', [], 0, ],
              ['12/32/2005', 'm2d2y4', [], 0, ],

# m2d2y2 tests
              ['10/19/2005', 'm2d2y2', [], 1, [qw(10/19/20 10 19 20)]],
              ['10.19.2005', 'm2d2y2', [], 1, [qw(10.19.20 10 19 20)]],
              ['10-19-2005', 'm2d2y2', [], 1, [qw(10-19-20 10 19 20)]],
              ['10x19x2005', 'm2d2y2', [], 0, ],
              ['10192005',   'm2d2y2', [], 1, [qw(101920 10 19 20)]],
              # leading/trailing junk shouldn't cause the match to change
              ['abc10/19/2005000', 'm2d2y2', [], 1, [qw(10/19/20 10 19 20)]],
              ['abc10.19.2005000', 'm2d2y2', [], 1, [qw(10.19.20 10 19 20)]],
              ['00010-19-2005000', 'm2d2y2', [], 1, [qw(10-19-20 10 19 20)]],
              ['abc10x19x2005000', 'm2d2y2', [], 0, ],
              ['abc10192005000',   'm2d2y2', [], 1, [qw(101920 10 19 20)]],
              # Mismatched or invalid separators
              ['10/19-05', 'm2d2y2', [], 0, ],
              ['10-19.05', 'm2d2y2', [], 0, ],
              ['10%19%05', 'm2d2y2', [], 0, ],
              # Two-year date should match
              ['10/19/05', 'm2d2y2', [], 1, [qw(10/19/05 10 19 05)]],
              ['10.19.05', 'm2d2y2', [], 1, [qw(10.19.05 10 19 05)]],
              ['10-19-05', 'm2d2y2', [], 1, [qw(10-19-05 10 19 05)]],
              ['10x19x05', 'm2d2y2', [], 0, ],
              ['101905',   'm2d2y2', [], 1, [qw(101905 10 19 05)]],
              # one-digit month
              ['1/19/2005', 'm2d2y2', [], 0, ],
              ['1.19.2005', 'm2d2y2', [], 0, ],
              ['1-19-2005', 'm2d2y2', [], 0, ],
              ['1x19x2005', 'm2d2y2', [], 0, ],
              ['1192005',   'm2d2y2', [], 0, ],
              # one-digit day
              ['10/9/2005', 'm2d2y2', [], 0, ],
              ['10.9.2005', 'm2d2y2', [], 0, ],
              ['10-9-2005', 'm2d2y2', [], 0, ],
              ['10x9x2005', 'm2d2y2', [], 0, ],
              ['1092005',   'm2d2y2', [], 1, [qw(092005 09 20 05)]],
              # one-digit month and day
              ['1/9/2005', 'm2d2y2', [], 0, ],
              ['1.9.2005', 'm2d2y2', [], 0, ],
              ['1-9-2005', 'm2d2y2', [], 0, ],
              ['1x9x2005', 'm2d2y2', [], 0, ],
              ['192005',   'm2d2y2', [], 0, ],
              # m/dd/yy
              ['1/19/05', 'm2d2y2', [], 0, ],
              ['1.19.05', 'm2d2y2', [], 0, ],
              ['1-19-05', 'm2d2y2', [], 0, ],
              ['1x19x05', 'm2d2y2', [], 0, ],
              ['11905',   'm2d2y2', [], 0, ],
              # mm/d/yy
              ['10/9/05', 'm2d2y2', [], 0, ],
              ['10.9.05', 'm2d2y2', [], 0, ],
              ['10-9-05', 'm2d2y2', [], 0, ],
              ['10x9x05', 'm2d2y2', [], 0, ],
              ['10905',   'm2d2y2', [], 0, ],
              # m/d/yy
              ['1/9/05', 'm2d2y2', [], 0, ],
              ['1.9.05', 'm2d2y2', [], 0, ],
              ['1-9-05', 'm2d2y2', [], 0, ],
              ['1x9x05', 'm2d2y2', [], 0, ],
              ['1905',   'm2d2y2', [], 0, ],
              # Invalid month
              ['13/19/05', 'm2d2y2', [], 0, ],
              ['21/19/05', 'm2d2y2', [], 0, ],
              ['0/19/05',  'm2d2y2', [], 0, ],
              ['00/19/05', 'm2d2y2', [], 0, ],
              # Invalid day
              ['12/0/05',  'm2d2y2', [], 0, ],
              ['12/00/05', 'm2d2y2', [], 0, ],
              ['12/40/05', 'm2d2y2', [], 0, ],
              ['12/32/05', 'm2d2y2', [], 0, ],

# mdy tests with named month.
              # Basic test case
              ["$Jan 01, 2005",       "mdy", [], 1, ["$Jan 01, 2005",      $Jan, qw( 01 2005)]],
              # 2-digit year
              ["$Jan 01, 05",         "mdy", [], 1, ["$Jan 01, 05",        $Jan, qw( 01 05)]],
              # No separator
              ["${Jan}012005",        "mdy", [], 1, ["${Jan}012005",       $Jan, qw( 01 2005)]],
              ["${Jan}0105",          "mdy", [], 1, ["${Jan}0105",         $Jan, qw( 01 05)]],
              # odd number of digits in year
              [   "$Jan 01, 9",       "mdy", [], 0, ],
              [ "$Jan 01, 120",       "mdy", [], 0, ],
              ["$Jan 01, 90120",      "mdy", [], 0, ],
              # Name spelled out
              ["$January 01, 2005",   "mdy", [], 1, ["$January 01, 2005",  $January, qw( 01 2005)]],
              # Partial name should fail
              ["${Jan}u 01, 2005",    "mdy", [], 0, ],
              # All twelve names (and abbreviations)  Also valid day formats.
              ["$February 1, 2005",   "mdy", [], 1, ["$February 1, 2005",   $February, qw(   1 2005)]],
              ["$March 2, 2005",      "mdy", [], 1, ["$March 2, 2005",      $March, qw(      2 2005)]],
              ["$April 09, 2005",     "mdy", [], 1, ["$April 09, 2005",     $April, qw(     09 2005)]],
              ["$MayFull 9, 2005",    "mdy", [], 1, ["$MayFull 9, 2005",    "$MayFull", qw(        9 2005)]],
              ["$June 10, 2005",      "mdy", [], 1, ["$June 10, 2005",      $June, qw(      10 2005)]],
              ["$July 11, 2005",      "mdy", [], 1, ["$July 11, 2005",      $July, qw(      11 2005)]],
              ["$August 19, 2005",    "mdy", [], 1, ["$August 19, 2005",    $August, qw(    19 2005)]],
              ["$September 20, 2005", "mdy", [], 1, ["$September 20, 2005", $September, qw( 20 2005)]],
              ["$October 21, 2005",   "mdy", [], 1, ["$October 21, 2005",   $October, qw(   21 2005)]],
              ["$November 30, 2005",  "mdy", [], 1, ["$November 30, 2005",  $November, qw(  30 2005)]],
              ["$December 31, 2005",  "mdy", [], 1, ["$December 31, 2005",  $December, qw(  31 2005)]],
              ["$Feb 1, 2005",        "mdy", [], 1, ["$Feb 1, 2005",        $Feb, qw(  1 2005)]],
              ["$Mar 2, 2005",        "mdy", [], 1, ["$Mar 2, 2005",        $Mar, qw(  2 2005)]],
              ["$Apr 09, 2005",       "mdy", [], 1, ["$Apr 09, 2005",       $Apr, qw( 09 2005)]],
              ["$May 9, 2005",        "mdy", [], 1, ["$May 9, 2005",        $May, qw(  9 2005)]],
              ["$Jun 10, 2005",       "mdy", [], 1, ["$Jun 10, 2005",       $Jun, qw( 10 2005)]],
              ["$Jul 11, 2005",       "mdy", [], 1, ["$Jul 11, 2005",       $Jul, qw( 11 2005)]],
              ["$Aug 19, 2005",       "mdy", [], 1, ["$Aug 19, 2005",       $Aug, qw( 19 2005)]],
              ["$Sep 20, 2005",       "mdy", [], 1, ["$Sep 20, 2005",       $Sep, qw( 20 2005)]],
              ["$Oct 21, 2005",       "mdy", [], 1, ["$Oct 21, 2005",       $Oct, qw( 21 2005)]],
              ["$Nov 30, 2005",       "mdy", [], 1, ["$Nov 30, 2005",       $Nov, qw( 30 2005)]],
              ["$Dec 31, 2005",       "mdy", [], 1, ["$Dec 31, 2005",       $Dec, qw( 31 2005)]],
              # Case insensitivity
              ["\L$Jan 01, 2005",     "mdy", [], 1, ["\L$Jan 01, 2005",     "\L$Jan", qw( 01 2005)]],
              ["\U\l$Jan 01, 2005",   "mdy", [], 1, ["\U\l$Jan 01, 2005",   "\U\l$Jan", qw( 01 2005)]],
              # Alternate separators
              ["$Jan 01 ,2005",       "mdy", [], 0, ],
              ["$Jan 01 2005",        "mdy", [], 1, ["$Jan 01 2005",        $Jan, qw( 01 2005)]],
              ["$Jan-01-2005",        "mdy", [], 1, ["$Jan-01-2005",        $Jan, qw( 01 2005)]],
              # Mismatched or invalid separators
              ["$Jan/19-2005",        "mdy", [], 0, ],
              ["$Jan-19.2005",        "mdy", [], 0, ],
              ["$Jan%19%2005",        "mdy", [], 0, ],
              ["$Jan-01,-2005",       "mdy", [], 0, ],
              ["$Jan:01,:2005",       "mdy", [], 0, ],
              # Schmutz before/after the date
              ["blah$Jan 01, 2005",   "mdy", [], 1, ["$Jan 01, 2005",       $Jan, qw( 01 2005)]],
              ["$Jan 01, 2005blah",   "mdy", [], 1, ["$Jan 01, 2005",       $Jan, qw( 01 2005)]],
              # Bad day
              ["$Jan 00, 2005",       "mdy", [], 0, ],
              ["$Jan 0, 2005",        "mdy", [], 0, ],
              ["$Jan 32, 2005",       "mdy", [], 0, ],
              ["$Jan 40, 2005",       "mdy", [], 0, ],
              ["$Jan 99, 2005",       "mdy", [], 0, ],

# mdy4 tests with named month.
              # Basic test case
              ["$Jan 01, 2005",       "mdy4", [], 1, ["$Jan 01, 2005",      $Jan, qw( 01 2005)]],
              # 2-digit year
              ["$Jan 01, 05",         "mdy4", [], 0, ],
              # No separator
              ["${Jan}012005",        "mdy4", [], 1, ["${Jan}012005",       $Jan, qw( 01 2005)]],
              ["${Jan}0105",          "mdy4", [], 0, ],
              # odd number of digits in year
              [   "$Jan 01, 9",       "mdy4", [], 0, ],
              [ "$Jan 01, 120",       "mdy4", [], 0, ],
              ["$Jan 01, 90120",      "mdy4", [], 1, ["$Jan 01, 9012",      $Jan, qw( 01 9012)]],
              # Name spelled out
              ["$January 01, 2005",   "mdy4", [], 1, ["$January 01, 2005",  $January, qw( 01 2005)]],
              # Partial name should fail
              ["${Jan}u 01, 2005",    "mdy4", [], 0, ],
              # All twelve names (and abbreviations)  Also valid day formats.
              ["$February 1, 2005",   "mdy4", [], 1, ["$February 1, 2005",   $February, qw(   1 2005)]],
              ["$March 2, 2005",      "mdy4", [], 1, ["$March 2, 2005",      $March, qw(      2 2005)]],
              ["$April 09, 2005",     "mdy4", [], 1, ["$April 09, 2005",     $April, qw(     09 2005)]],
              ["$MayFull 9, 2005",    "mdy4", [], 1, ["$MayFull 9, 2005",    "$MayFull", qw(        9 2005)]],
              ["$June 10, 2005",      "mdy4", [], 1, ["$June 10, 2005",      $June, qw(      10 2005)]],
              ["$July 11, 2005",      "mdy4", [], 1, ["$July 11, 2005",      $July, qw(      11 2005)]],
              ["$August 19, 2005",    "mdy4", [], 1, ["$August 19, 2005",    $August, qw(    19 2005)]],
              ["$September 20, 2005", "mdy4", [], 1, ["$September 20, 2005", $September, qw( 20 2005)]],
              ["$October 21, 2005",   "mdy4", [], 1, ["$October 21, 2005",   $October, qw(   21 2005)]],
              ["$November 30, 2005",  "mdy4", [], 1, ["$November 30, 2005",  $November, qw(  30 2005)]],
              ["$December 31, 2005",  "mdy4", [], 1, ["$December 31, 2005",  $December, qw(  31 2005)]],
              ["$Feb 1, 2005",        "mdy4", [], 1, ["$Feb 1, 2005",        $Feb, qw(  1 2005)]],
              ["$Mar 2, 2005",        "mdy4", [], 1, ["$Mar 2, 2005",        $Mar, qw(  2 2005)]],
              ["$Apr 09, 2005",       "mdy4", [], 1, ["$Apr 09, 2005",       $Apr, qw( 09 2005)]],
              ["$May 9, 2005",        "mdy4", [], 1, ["$May 9, 2005",        $May, qw(  9 2005)]],
              ["$Jun 10, 2005",       "mdy4", [], 1, ["$Jun 10, 2005",       $Jun, qw( 10 2005)]],
              ["$Jul 11, 2005",       "mdy4", [], 1, ["$Jul 11, 2005",       $Jul, qw( 11 2005)]],
              ["$Aug 19, 2005",       "mdy4", [], 1, ["$Aug 19, 2005",       $Aug, qw( 19 2005)]],
              ["$Sep 20, 2005",       "mdy4", [], 1, ["$Sep 20, 2005",       $Sep, qw( 20 2005)]],
              ["$Oct 21, 2005",       "mdy4", [], 1, ["$Oct 21, 2005",       $Oct, qw( 21 2005)]],
              ["$Nov 30, 2005",       "mdy4", [], 1, ["$Nov 30, 2005",       $Nov, qw( 30 2005)]],
              ["$Dec 31, 2005",       "mdy4", [], 1, ["$Dec 31, 2005",       $Dec, qw( 31 2005)]],
              # Case insensitivity
              ["\L$Jan 01, 2005",     "mdy4", [], 1, ["\L$Jan 01, 2005",     "\L$Jan", qw( 01 2005)]],
              ["\U\l$Jan 01, 2005",   "mdy4", [], 1, ["\U\l$Jan 01, 2005",   "\U\l$Jan", qw( 01 2005)]],
              # Alternate separators
              ["$Jan 01 ,2005",       "mdy4", [], 0, ],
              ["$Jan 01 2005",        "mdy4", [], 1, ["$Jan 01 2005",        $Jan, qw( 01 2005)]],
              ["$Jan-01-2005",        "mdy4", [], 1, ["$Jan-01-2005",        $Jan, qw( 01 2005)]],
              # Mismatched or invalid separators
              ["$Jan/19-2005",        "mdy4", [], 0, ],
              ["$Jan-19.2005",        "mdy4", [], 0, ],
              ["$Jan%19%2005",        "mdy4", [], 0, ],
              ["$Jan-01,-2005",       "mdy4", [], 0, ],
              ["$Jan:01,:2005",       "mdy4", [], 0, ],
              # Schmutz before/after the date
              ["blah$Jan 01, 2005",   "mdy4", [], 1, ["$Jan 01, 2005",       $Jan, qw( 01 2005)]],
              ["$Jan 01, 2005blah",   "mdy4", [], 1, ["$Jan 01, 2005",       $Jan, qw( 01 2005)]],
              # Bad day
              ["$Jan 00, 2005",       "mdy4", [], 0, ],
              ["$Jan 0, 2005",        "mdy4", [], 0, ],
              ["$Jan 32, 2005",       "mdy4", [], 0, ],
              ["$Jan 40, 2005",       "mdy4", [], 0, ],
              ["$Jan 99, 2005",       "mdy4", [], 0, ],

# mdy2 tests with named month.
              # Basic test case
              ["$Jan 01, 2005",       "mdy2", [], 1, ["$Jan 01, 20",      $Jan, qw( 01 20)]],
              # 2-digit year
              ["$Jan 01, 05",         "mdy2", [], 1, ["$Jan 01, 05",      $Jan, qw( 01 05)]],
              # No separator
              ["${Jan}012005",        "mdy2", [], 1, ["${Jan}0120",        $Jan, qw( 01 20)]],
              ["${Jan}0105",          "mdy2", [], 1, ["${Jan}0105",          $Jan, qw( 01 05)]],
              # odd number of digits in year
              [   "$Jan 01, 9",       "mdy2", [], 0, ],
              [ "$Jan 01, 120",       "mdy2", [], 1, ["$Jan 01, 12",        $Jan, qw( 01 12)]],
              # Name spelled out
              ["$January 01, 2005",   "mdy2", [], 1, ["$January 01, 20",    $January, qw( 01 20)]],
              # Partial name should fail
              ["${Jan}u 01, 2005",    "mdy2", [], 0, ],
              # All twelve names (and abbreviations)  Also valid day formats.
              ["$February 1, 05",   "mdy2", [], 1, ["$February 1, 05",   $February, qw(   1 05)]],
              ["$March 2, 05",      "mdy2", [], 1, ["$March 2, 05",      $March, qw(      2 05)]],
              ["$April 09, 05",     "mdy2", [], 1, ["$April 09, 05",     $April, qw(     09 05)]],
              ["$MayFull 9, 05",    "mdy2", [], 1, ["$MayFull 9, 05",    "$MayFull", qw(        9 05)]],
              ["$June 10, 05",      "mdy2", [], 1, ["$June 10, 05",      $June, qw(      10 05)]],
              ["$July 11, 05",      "mdy2", [], 1, ["$July 11, 05",      $July, qw(      11 05)]],
              ["$August 19, 05",    "mdy2", [], 1, ["$August 19, 05",    $August, qw(    19 05)]],
              ["$September 20, 05", "mdy2", [], 1, ["$September 20, 05", $September, qw( 20 05)]],
              ["$October 21, 05",   "mdy2", [], 1, ["$October 21, 05",   $October, qw(   21 05)]],
              ["$November 30, 05",  "mdy2", [], 1, ["$November 30, 05",  $November, qw(  30 05)]],
              ["$December 31, 05",  "mdy2", [], 1, ["$December 31, 05",  $December, qw(  31 05)]],
              ["$Feb 1, 05",        "mdy2", [], 1, ["$Feb 1, 05",        $Feb, qw(  1 05)]],
              ["$Mar 2, 05",        "mdy2", [], 1, ["$Mar 2, 05",        $Mar, qw(  2 05)]],
              ["$Apr 09, 05",       "mdy2", [], 1, ["$Apr 09, 05",       $Apr, qw( 09 05)]],
              ["$May 9, 05",        "mdy2", [], 1, ["$May 9, 05",        $May, qw(  9 05)]],
              ["$Jun 10, 05",       "mdy2", [], 1, ["$Jun 10, 05",       $Jun, qw( 10 05)]],
              ["$Jul 11, 05",       "mdy2", [], 1, ["$Jul 11, 05",       $Jul, qw( 11 05)]],
              ["$Aug 19, 05",       "mdy2", [], 1, ["$Aug 19, 05",       $Aug, qw( 19 05)]],
              ["$Sep 20, 05",       "mdy2", [], 1, ["$Sep 20, 05",       $Sep, qw( 20 05)]],
              ["$Oct 21, 05",       "mdy2", [], 1, ["$Oct 21, 05",       $Oct, qw( 21 05)]],
              ["$Nov 30, 05",       "mdy2", [], 1, ["$Nov 30, 05",       $Nov, qw( 30 05)]],
              ["$Dec 31, 05",       "mdy2", [], 1, ["$Dec 31, 05",       $Dec, qw( 31 05)]],
              # Case insensitivity
              ["\L$Jan 01, 05",     "mdy2", [], 1, ["\L$Jan 01, 05",     "\L$Jan", qw( 01 05)]],
              ["\U\l$Jan 01, 05",   "mdy2", [], 1, ["\U\l$Jan 01, 05",   "\U\l$Jan", qw( 01 05)]],
              # Alternate separators
              ["$Jan 01 ,05",       "mdy2", [], 0, ],
              ["$Jan 01 05",        "mdy2", [], 1, ["$Jan 01 05",        $Jan, qw( 01 05)]],
              ["$Jan-01-05",        "mdy2", [], 1, ["$Jan-01-05",        $Jan, qw( 01 05)]],
              # Mismatched or invalid separators
              ["$Jan/19-05",        "mdy2", [], 0, ],
              ["$Jan-19.05",        "mdy2", [], 0, ],
              ["$Jan%19%05",        "mdy2", [], 0, ],
              ["$Jan-01,-05",       "mdy2", [], 0, ],
              ["$Jan:01,:05",       "mdy2", [], 0, ],
              # Schmutz before/after the date
              ["blah$Jan 01, 05",   "mdy2", [], 1, ["$Jan 01, 05",       $Jan, qw( 01 05)]],
              ["$Jan 01, 05blah",   "mdy2", [], 1, ["$Jan 01, 05",       $Jan, qw( 01 05)]],
              # Bad day
              ["$Jan 00, 05",       "mdy2", [], 0, ],
              ["$Jan 0, 05",        "mdy2", [], 0, ],
              ["$Jan 32, 05",       "mdy2", [], 0, ],
              ["$Jan 40, 05",       "mdy2", [], 0, ],
              ["$Jan 99, 05",       "mdy2", [], 0, ],

# m2d2y4 tests with named month.
              # Basic test case
              ["$Jan 01, 2005",       "m2d2y4", [], 0, ],
              # 2-digit year
              ["$Jan 01, 05",         "m2d2y4", [], 0, ],
              # No separator
              ["${Jan}012005",        "m2d2y4", [], 0, ],
              ["${Jan}0105",          "m2d2y4", [], 0, ],
              # odd number of digits in year
              [   "$Jan 01, 9",       "m2d2y4", [], 0, ],
              [ "$Jan 01, 120",       "m2d2y4", [], 0, ],
              ["$Jan 01, 90120",      "m2d2y4", [], 0, ],
              # Name spelled out
              ["$January 01, 2005",   "m2d2y4", [], 0, ],
              # All twelve names (and abbreviations)  Also valid day formats.
              ["$February 1, 2005",   "m2d2y4", [], 0, ],
              ["$March 2, 2005",      "m2d2y4", [], 0, ],
              ["$April 09, 2005",     "m2d2y4", [], 0, ],
              ["$MayFull 9, 2005",    "m2d2y4", [], 0, ],
              ["$June 10, 2005",      "m2d2y4", [], 0, ],
              ["$July 11, 2005",      "m2d2y4", [], 0, ],
              ["$August 19, 2005",    "m2d2y4", [], 0, ],
              ["$September 20, 2005", "m2d2y4", [], 0, ],
              ["$October 21, 2005",   "m2d2y4", [], 0, ],
              ["$November 30, 2005",  "m2d2y4", [], 0, ],
              ["$December 31, 2005",  "m2d2y4", [], 0, ],
              ["$Feb 1, 2005",        "m2d2y4", [], 0, ],
              ["$Mar 2, 2005",        "m2d2y4", [], 0, ],
              ["$Apr 09, 2005",       "m2d2y4", [], 0, ],
              ["$May 9, 2005",        "m2d2y4", [], 0, ],
              ["$Jun 10, 2005",       "m2d2y4", [], 0, ],
              ["$Jul 11, 2005",       "m2d2y4", [], 0, ],
              ["$Aug 19, 2005",       "m2d2y4", [], 0, ],
              ["$Sep 20, 2005",       "m2d2y4", [], 0, ],
              ["$Oct 21, 2005",       "m2d2y4", [], 0, ],
              ["$Nov 30, 2005",       "m2d2y4", [], 0, ],
              ["$Dec 31, 2005",       "m2d2y4", [], 0, ],
              # Case insensitivity
              ["\L$Jan 01, 2005",     "m2d2y4", [], 0, ],
              ["\U\l$Jan 01, 2005",   "m2d2y4", [], 0, ],
              # Alternate separators
              ["$Jan 01 ,2005",       "m2d2y4", [], 0, ],
              ["$Jan 01 2005",        "m2d2y4", [], 0, ],
              ["$Jan-01-2005",        "m2d2y4", [], 0, ],
              # Mismatched or invalid separators
              ["$Jan/19-2005",        "mdy", [], 0, ],
              ["$Jan-19.2005",        "mdy", [], 0, ],
              ["$Jan%19%2005",        "mdy", [], 0, ],
              ["$Jan-01,-2005",       "mdy", [], 0, ],
              ["$Jan:01,:2005",       "mdy", [], 0, ],
              # Schmutz before/after the date
              ["blah$Jan 01, 2005",   "m2d2y4", [], 0, ],
              ["$Jan 01, 2005blah",   "m2d2y4", [], 0, ],
              # Bad day
              ["$Jan 00, 2005",       "m2d2y4", [], 0, ],
              ["$Jan 0, 2005",        "m2d2y4", [], 0, ],
              ["$Jan 32, 2005",       "m2d2y4", [], 0, ],
              ["$Jan 40, 2005",       "m2d2y4", [], 0, ],
              ["$Jan 99, 2005",       "m2d2y4", [], 0, ],

# m2d2y2 tests with named month.
              # Basic test case
              ["$Jan 01, 2005",       "m2d2y2", [], 0, ],
              # 2-digit year
              ["$Jan 01, 05",         "m2d2y2", [], 0, ],
              # No separator
              ["${Jan}012005",        "m2d2y2", [], 1, [qw(012005 01 20 05)]],
              ["${Jan}0105",          "m2d2y2", [], 0, ],
              # odd number of digits in year
              [   "$Jan 01, 9",       "m2d2y2", [], 0, ],
              [ "$Jan 01, 120",       "m2d2y2", [], 0, ],
              # Name spelled out
              ["$January 01, 2005",   "m2d2y2", [], 0, ],
              # All twelve names (and abbreviations)  Also valid day formats.
              ["$February 1, 05",   "m2d2y2", [], 0, ],
              ["$March 2, 05",      "m2d2y2", [], 0, ],
              ["$April 09, 05",     "m2d2y2", [], 0, ],
              ["$May 9, 05",        "m2d2y2", [], 0, ],
              ["$June 10, 05",      "m2d2y2", [], 0, ],
              ["$July 11, 05",      "m2d2y2", [], 0, ],
              ["$August 19, 05",    "m2d2y2", [], 0, ],
              ["$September 20, 05", "m2d2y2", [], 0, ],
              ["$October 21, 05",   "m2d2y2", [], 0, ],
              ["$November 30, 05",  "m2d2y2", [], 0, ],
              ["$December 31, 05",  "m2d2y2", [], 0, ],
              ["$Feb 1, 05",        "m2d2y2", [], 0, ],
              ["$Mar 2, 05",        "m2d2y2", [], 0, ],
              ["$Apr 09, 05",       "m2d2y2", [], 0, ],
              ["$May 9, 05",        "m2d2y2", [], 0, ],
              ["$Jun 10, 05",       "m2d2y2", [], 0, ],
              ["$Jul 11, 05",       "m2d2y2", [], 0, ],
              ["$Aug 19, 05",       "m2d2y2", [], 0, ],
              ["$Sep 20, 05",       "m2d2y2", [], 0, ],
              ["$Oct 21, 05",       "m2d2y2", [], 0, ],
              ["$Nov 30, 05",       "m2d2y2", [], 0, ],
              ["$Dec 31, 05",       "m2d2y2", [], 0, ],
              # Case insensitivity
              ["\L$Jan 01, 05",     "m2d2y2", [], 0, ],
              ["\U\l$Jan 01, 05",   "m2d2y2", [], 0, ],
              # Alternate separators
              ["$Jan 01 ,05",       "m2d2y2", [], 0, ],
              ["$Jan 01 05",        "m2d2y2", [], 0, ],
              ["$Jan-01-05",        "m2d2y2", [], 0, ],
              # Mismatched or invalid separators
              ["$Jan/19-05",        "mdy", [], 0, ],
              ["$Jan-19.05",        "mdy", [], 0, ],
              ["$Jan%19%05",        "mdy", [], 0, ],
              ["$Jan-01,-05",       "mdy", [], 0, ],
              ["$Jan:01,:05",       "mdy", [], 0, ],
              # Schmutz before/after the date
              ["blah$Jan 01, 05",   "m2d2y2", [], 0, ],
              ["$Jan 01, 05blah",   "m2d2y2", [], 0, ],
              # Bad day
              ["$Jan 00, 05",       "m2d2y2", [], 0, ],
              ["$Jan 0, 05",        "m2d2y2", [], 0, ],
              ["$Jan 32, 05",       "m2d2y2", [], 0, ],
              ["$Jan 40, 05",       "m2d2y2", [], 0, ],
              ["$Jan 99, 05",       "m2d2y2", [], 0, ],

             );

    # MDY is an exact synonym for m2d2y4
    my @MDY = grep { $_->[1] eq 'm2d2y4' } @match;
    $_->[1] = 'MDY' for @MDY;
    push @match, @MDY;

    # How many matches will succeed?
    my $to_succeed = scalar grep $_->[3], @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, $name, $flags, $should_succeed, $matchvars) = @$match;
    my $testname = qq{"$text" =~ "$name"};
    my $did_succeed;
    my @captures;     # Regexp captures

    # FIRST: check whether it succeeded or failed as expected.
    # 'keep' option is OFF; should be no captures.
    if (@$flags)
    {
        my $flags = join $; => @$flags;
        @captures = $text =~ /$RE{time}{$name}{$flags}/;
    }
    else
    {
        @captures = $text =~ /$RE{time}{$name}/;
    }
    $did_succeed = @captures > 0;

    my $ought  = $should_succeed? 'match' : 'fail';
    my $actual = $did_succeed == $should_succeed?    "${ought}ed" : "did not $ought";

    # TEST 1: simple matching
    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;
            is_deeply(\@captures, [1], "$testname - didn't unduly capture");
        }
    }

    # SECOND: use 'keep' option to check captures.
    if (@$flags)
    {
        my $flags = join $; => @$flags;
        @captures = $text =~ /$RE{time}{$name}{$flags}{-keep}/;
    }
    else
    {
        @captures = $text =~ /$RE{time}{$name}{-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");
        }
    }
}