use strict;
use warnings;
use Test::More;
use PPR;
my $neg = 0;
while (my $str = <DATA>) {
if ($str =~ /\A# TH[EI]SE? SHOULD MATCH/) { $neg = 0; next; }
elsif ($str =~ /\A# TH[EI]SE? SHOULD FAIL/) { $neg = 1; next; }
elsif ($str !~ /^####\h*\Z/m) { $str .= <DATA>; redo; }
$str =~ s/\s*^####\h*\Z//m;
if ($neg) {
ok $str !~ m/\A (?&PerlOWS) (?&PerlVariable) (?&PerlOWS) \Z $PPR::GRAMMAR/xo => "FAIL: $str";
}
else {
ok $str =~ m/\A (?&PerlOWS) (?&PerlVariable) (?&PerlOWS) \Z $PPR::GRAMMAR/xo => "MATCH: $str";
}
}
done_testing();
__DATA__
# THESE SHOULD MATCH...
$#
####
$#-
####
@{$obj->nextval($cat ? $dog : $fish)}
####
@{$obj->nextval($cat?$dog:$fish)->{new}}
####
@{$obj->nextval(cat()?$dog:$fish)->{new}}
####
@{$obj->nextval}
####
@{$obj->nextval($cat,$dog)->{new}}
####
$::obj
####
%::obj::
####
$a
####
$ a
####
$
a
####
${a}
####
$_
####
$ _
####
${_}
####
$a[1]
####
@a[1]
####
%a[1]
####
@a[1,2,3]
####
%a[1,2,3]
####
@a[somefunc x 3]
####
%a[somefunc x 3]
####
$_[1]
####
$a{cat}
####
@a{cat}
####
%a{cat}
####
@a{qw<cat,dog>}
####
%a{'cat',"dog"}
####
@a{somefunc $x, $y}
####
%a{somefunc($x, $y) x 3}
####
$_{cat}
####
$a->[1]
####
$a->{"cat"}[1]
####
@$listref
####
@{$listref}
####
@{ 'x' x $x }
####
$ a {'cat'}
####
$
a
{
x
}
####
$a::b::c{d}->{$e->()}
####
$a'b'c'd{e}->{$e->()}
####
$a'b::c'd{e}->{$e->()}
####
$#_
####
$#array
####
$#{array}
####
$var[$#var]
####
$1
####
$11
####
$&
####
$`
####
$'
####
$+
####
$*
####
$.
####
$/
####
$|
####
$,
####
$"
####
$;
####
$%
####
$=
####
$-
####
$~
####
$^
####
$:
####
$^L
####
$^A
####
$?
####
$!
####
$^E
####
$@
####
$<
####
$>
####
$(
####
$)
####
$[
####
$]
####
$^C
####
$^D
####
$^F
####
$^H
####
$^I
####
$^M
####
$^O
####
$^P
####
$^R
####
$^S
####
$^T
####
$^V
####
$^W
####
${^WARNING_BITS}
####
${^WIDE_SYSTEM_CALLS}
####
$^X
####
$[
####
$$
####
%-
####
$$foo
####
$^W
####
${^MATCH}
####
$${^MATCH}
####
@{^_Bar}
####
${^_Bar}[0]
####
%{^_Baz}
####
${^_Baz}{burfle}
####
# THESE SHOULD FAIL...
$^WIDE_SYSTEM_CALLS
####
$a->
####
@{$
####
$ a :: b :: c
####
$ a ' b ' c
####
\${^MATCH}
####
$obj->nextval
####
*var
####
*$var
####
*{var}
####
*{$var}
####
*var{cat}
####
\&var
####
\&mod::var
####
\&mod'var
####
$obj->_nextval
####
$obj->next_val_
####
$a->
####
$a (1..3) { print $a }
####
$obj->nextval
####