File Coverage

blib/lib/Perl/Lint/Policy/ControlStructures/ProhibitNegativeExpressionsInUnlessAndUntilConditions.pm
Criterion Covered Total %
statement 36 38 94.7
branch 13 18 72.2
condition 3 3 100.0
subroutine 6 6 100.0
pod 0 1 0.0
total 58 66 87.8


line stmt bran cond sub pod time code
1             package Perl::Lint::Policy::ControlStructures::ProhibitNegativeExpressionsInUnlessAndUntilConditions;
2 133     133   93406 use strict;
  133         250  
  133         5238  
3 133     133   616 use warnings;
  133         210  
  133         3549  
4 133     133   908 use Perl::Lint::Constants::Type;
  133         182  
  133         85694  
5 133     133   817 use parent "Perl::Lint::Policy";
  133         232  
  133         792  
6              
7             use constant {
8 133         56694 DESC => 'Found "%s" in condition for an "%s"',
9             EXPL => [99],
10 133     133   8674 };
  133         232  
11              
12             my %invalid_op_types = (
13             &NOT => '!',
14             &ALPHABET_NOT => 'not',
15             &STRING_NOT_EQUAL => 'ne',
16             &NOT_EQUAL => '!=',
17             &LESS => '<',
18             &LESS_EQUAL => '<=',
19             &GREATER => '>',
20             &GREATER_EQUAL => '>=',
21             &COMPARE => '<=>',
22             &STRING_LESS => 'lt',
23             &STRING_GREATER => 'gt',
24             &STRING_LESS_EQUAL => 'le',
25             &STRING_GREATER_EQUAL => 'ge',
26             &STRING_COMPARE => 'cmp',
27             ®_NOT => '!~',
28             &STRING_NOT_EQUAL => 'ne',
29             &NOT_EQUAL => '!=',
30             );
31              
32             sub evaluate {
33 109     109 0 183 my ($class, $file, $tokens, $src, $args) = @_;
34              
35 109         108 my @violations;
36 109         288 for (my $i = 0, my $token_type; my $token = $tokens->[$i]; $i++) {
37 4163         3242 $token_type = $token->{type};
38 4163 100 100     14058 if ($token_type == UNLESS_STATEMENT || $token_type == UNTIL_STATEMENT) {
39 110         149 my $control_structure = $token->{data};
40              
41 110 50       261 $token = $tokens->[++$i] or last;
42 110 100       286 if ($token->{type} != LEFT_PAREN) {
43 54         128 for (; $token = $tokens->[$i]; $i++) {
44 218         204 $token_type = $token->{type};
45 218 100       480 if ($token_type == SEMI_COLON) {
    100          
46 54         74 last;
47             }
48             elsif ($invalid_op_types{$token_type}) {
49 54         382 push @violations, {
50             filename => $file,
51             line => $token->{line},
52             description => sprintf(DESC, $invalid_op_types{$token_type}, $control_structure),
53             explanation => EXPL,
54             policy => __PACKAGE__,
55             };
56             }
57             }
58              
59 54         111 next;
60             }
61              
62 56         62 my $lpnum = 1;
63 56         155 for ($i++; $token = $tokens->[$i]; $i++) {
64 108         123 $token_type = $token->{type};
65              
66 108 50       417 if ($token_type == LEFT_PAREN) {
    50          
    100          
67 0         0 $lpnum++;
68             }
69             elsif ($token_type == RIGHT_PAREN) {
70 0 0       0 last if --$lpnum <= 0;
71             }
72             elsif ($invalid_op_types{$token_type}) {
73 56         359 push @violations, {
74             filename => $file,
75             line => $token->{line},
76             description => sprintf(DESC, $invalid_op_types{$token_type}, $control_structure),
77             explanation => EXPL,
78             policy => __PACKAGE__,
79             };
80 56         137 last;
81             }
82             }
83             }
84             }
85              
86 109         398 return \@violations;
87             }
88              
89             1;
90