The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use 5.010;
use warnings;

use Test::More 'no_plan';

use Regexp::Grammars;

my $delimited         = qr{ <delim=([(/][*]|if|[][(){}<>«»'"`]+)> <content=(.*?)> </delim> }xms;
my $delimited_cap     = qr{ <delim=([(/][*]|if|[][(){}<>«»'"`]+)> <content=(.*?)> <rdel=/delim> }xms;
my $delimited_listcap = qr{ <delim=([(/][*]|if|[][(){}<>«»'"`]+)> <content=(.*?)> <[rdel=/delim]> }xms;

no Regexp::Grammars;

while (my $spec = <DATA>) {
    next if $spec !~ /\S/;
    chomp $spec;
    my $spec_copy = $spec;
    my ($input, $expected_outcome) = split /\s*:\s*/, $spec;
    my ($ldelim, $content, $rdelim) = split /(xxx)/, $input;

    if ($expected_outcome eq 'succeed') {
        ok +($input =~ $delimited) => "Match of $input ${expected_outcome}ed";
        is $/{delim},   $ldelim  => "Captured delimiter";
        is $/{content}, $content => "Captured content";

        ok +($input =~ $delimited_cap) => "Match and capture of $input ${expected_outcome}ed";
        is $/{delim},   $ldelim  => "Captured delimiter";
        is $/{content}, $content => "Captured content";
        is $/{rdel},    $rdelim  => "Captured closer";

        ok +($input =~ $delimited_listcap) => "Match and list capture of $input ${expected_outcome}ed";
        is $/{delim},   $ldelim        => "Captured delimiter";
        is $/{content}, $content       => "Captured content";
        is_deeply $/{rdel}, [$rdelim]  => "Captured closer";
    }
    else {
        ok +($input !~ $delimited)         => "Match of $input ${expected_outcome}ed";
        ok +($input !~ $delimited_cap)     => "Match and capture of $input ${expected_outcome}ed";
        ok +($input !~ $delimited_listcap) => "Match and list of $input ${expected_outcome}ed";
    }
}


__DATA__
"xxx"         :succeed
`xxx'         :succeed
``xxx''       :succeed

'xxx"         :fail

{xxx}         :succeed
[xxx]         :succeed
<xxx>         :succeed
(xxx)         :succeed
«xxx»         :succeed

[[xxx]]       :succeed
{{{xxx}}}     :succeed
((((xxx))))   :succeed
<<xxx>>       :succeed
««xxx»»       :succeed

}xxx{         :succeed
]xxx[         :succeed
)xxx(         :succeed
>xxx<         :succeed
»xxx«         :succeed

}}}xxx{{{     :succeed
]]xxx[[       :succeed
))))xxx((((   :succeed
>>xxx<<       :succeed
»»xxx««       :succeed

({xxx})       :succeed
(*xxx*)       :succeed
/*xxx*/       :succeed
ifxxxfi       :succeed

``            :fail
'abc"         :fail

{xxx{         :fail
[xxx[         :fail
<xxx<         :fail
(xxx(         :fail
«xxx«         :fail

[[xxx[[       :fail
{{{xxx{{{     :fail
((((xxx((((   :fail
<<xxx<<       :fail
««xxx««       :fail