#!perl
pcritique_with_violations
fcritique_with_violations
subtests_in_tree
)
;
Perl::Critic::TestUtils::block_perlcriticrc();
my
$subtests
= subtests_in_tree(
't'
);
if
(
@ARGV
) {
my
@policies
=
keys
%{
$subtests
};
for
(
@ARGV
) {
next
if
m/::/xms;
if
(!s{\A t[\\/](\w+)[\\/](\w+)\.run \z}{$1\::$2}xms) {
die
'Unknown argument '
.
$_
;
}
}
for
my
$p
(
@policies
) {
if
(0 ==
grep
{
$_
eq
$p
}
@ARGV
) {
delete
$subtests
->{
$p
};
}
}
}
my
$nsubtests
= 0;
for
my
$s
(
values
%$subtests
) {
$nsubtests
+=
@$s
;
}
my
$npolicies
=
scalar
keys
%$subtests
;
plan
tests
=>
$nsubtests
+
$npolicies
;
for
my
$policy
(
sort
keys
%$subtests
) {
can_ok(
"Perl::Critic::Policy::$policy"
,
'violates'
);
for
my
$subtest
( @{
$subtests
->{
$policy
}} ) {
local
$TODO
=
$subtest
->{TODO};
my
$desc
=
join
' - '
,
$policy
,
"line $subtest->{lineno}"
,
$subtest
->{name};
my
@violations
=
$subtest
->{filename}
?
eval
{
fcritique_with_violations(
$policy
,
\
$subtest
->{code},
$subtest
->{filename},
$subtest
->{parms},
)
}
:
eval
{
pcritique_with_violations(
$policy
,
\
$subtest
->{code},
$subtest
->{parms},
)
};
my
$err
=
$EVAL_ERROR
;
my
$test_passed
;
if
(
$subtest
->{error}) {
if
(
'Regexp'
eq
ref
$subtest
->{error} ) {
$test_passed
= like(
$err
,
$subtest
->{error},
$desc
);
}
else
{
$test_passed
= ok(
$err
,
$desc
);
}
}
elsif
(
$err
) {
if
(
$err
=~ m/\A Unable [ ] to [ ] create [ ] policy [ ] [']/xms) {
fail(
$desc
);
diag(
$err
);
$test_passed
= 0;
}
else
{
die
$err
;
}
}
else
{
my
$expected_failures
=
$subtest
->{failures};
if
(
$subtest
->{optional_modules}) {
MODULE:
for
my
$module
(
split
m/,\s*/xms,
$subtest
->{optional_modules}) {
eval
"require $module"
;
if
(
$EVAL_ERROR
) {
$expected_failures
= 0;
last
MODULE;
}
}
}
$test_passed
= is(
scalar
@violations
,
$expected_failures
,
$desc
);
}
if
(not
$test_passed
) {
diag(
"Violation found: $_"
)
foreach
@violations
;
}
}
}