The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!./perl

BEGIN {
    chdir 't' if -d 't';
    @INC = '../lib';
    require './test.pl';
}

use strict;
use warnings;

our @tests = (
    # /p      Pattern   PRE     MATCH   POST
    [ '/p',   "456",    "123-", "456",  "-789"],
    [ '(?p)', "456",    "123-", "456",  "-789"],
    [ '',     "(456)",  "123-", "456",  "-789"],
    [ '',     "456",    undef,  undef,  undef ],
);

plan tests => 4 * @tests + 2;
my $W = "";

$SIG{__WARN__} = sub { $W.=join("",@_); };
sub _u($$) { "$_[0] is ".(defined $_[1] ? "'$_[1]'" : "undef") }

$_ = '123-456-789';
foreach my $test (@tests) {
    my ($p, $pat,$l,$m,$r) = @$test;
    my $test_name = $p eq '/p'   ? "/$pat/p"
                  : $p eq '(?p)' ? "/(?p)$pat/"
                  :                "/$pat/";

    #
    # Cannot use if/else due to the scope invalidating ${^MATCH} and friends.
    #
    my $ok = ok $p eq '/p'   ? /$pat/p
              : $p eq '(?p)' ? /(?p)$pat/
              :                /$pat/
              => $test_name;
    SKIP: {
        skip "/$pat/$p failed to match", 3
            unless $ok;
        is(${^PREMATCH},  $l,_u "$test_name: ^PREMATCH",$l);
        is(${^MATCH},     $m,_u "$test_name: ^MATCH",$m );
        is(${^POSTMATCH}, $r,_u "$test_name: ^POSTMATCH",$r );
    }
}
is($W,"","No warnings should be produced");
ok(!defined ${^MATCH}, "No /p in scope so ^MATCH is undef");