File Coverage

blib/lib/Devel/Mutator/Generator.pm
Criterion Covered Total %
statement 28 30 93.3
branch 3 8 37.5
condition n/a
subroutine 6 6 100.0
pod 3 3 100.0
total 40 47 85.1


line stmt bran cond sub pod time code
1             package Devel::Mutator::Generator;
2              
3 2     2   14292 use strict;
  2         1  
  2         63  
4 2     2   8 use warnings;
  2         2  
  2         50  
5              
6 2     2   875 use PPI;
  2         180607  
  2         391  
7              
8             my %operators_map = (
9             '+' => '-',
10             '==' => '!=',
11             '++' => '--',
12             '=~' => '!~',
13             '*' => '/',
14             'gt' => 'lt',
15             'ge' => 'le',
16             '>' => '<',
17             '>=' => '<=',
18             '||' => '&&',
19             'and' => 'or',
20             'eq' => 'ne',
21             '//' => '||',
22             '//=' => '||=',
23             );
24             my %reversed_operators_map = reverse %operators_map;
25              
26             sub new {
27 5     5 1 3601 my $class = shift;
28              
29 5         9 my $self = {};
30 5         12 bless $self, $class;
31              
32 5         16 return $self;
33             }
34              
35             sub generate {
36 5     5 1 15 my $self = shift;
37 5         6 my ($code) = @_;
38              
39 5         33 my $ppi = PPI::Document->new(\$code);
40              
41 5         4682 my @mutants;
42 5 50       21 if (my $operators = $ppi->find('PPI::Token::Operator')) {
43 5         1439 foreach my $operator (@$operators) {
44 5         12 my $new_operator = find_map($operator->content);
45              
46 5 50       15 next unless $new_operator;
47              
48 5         8 my $old_operator = $operator->content;
49 5         25 $operator->set_content($new_operator);
50              
51 5         25 push @mutants,
52             {
53             id => $ppi->hex_id,
54             content => $ppi->serialize
55             };
56              
57 5         685 $operator->set_content($old_operator);
58             }
59             }
60              
61 5         32 return @mutants;
62             }
63              
64             sub find_map {
65 5     5 1 20 my ($operator) = @_;
66              
67 5 50       17 return $operators_map{$operator} if exists $operators_map{$operator};
68 0 0         return $reversed_operators_map{$operator}
69             if exists $reversed_operators_map{$operator};
70 0           return;
71             }
72              
73             1;
74             __END__