MutationGenerator   A
last analyzed

Complexity

Total Complexity 11

Size/Duplication

Total Lines 90
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 11
lcom 1
cbo 4
dl 0
loc 90
rs 10
c 3
b 0
f 0

7 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A getMutationStack() 0 11 2
A addCommandForLine() 0 11 2
A maxLineReached() 0 4 1
A increaseMaxLineIfMaxLineIsReached() 0 6 2
A getLine() 0 8 2
A getProgress() 0 4 1
1
<?php
2
3
namespace PHPRealCoverage\Mutator;
4
5
use PHPRealCoverage\Mutator\Exception\NoMoreMutationsException;
6
7
class MutationGenerator
8
{
9
    /**
10
     * @var MutatableClass
11
     */
12
    private $class;
13
14
    /**
15
     * @var int
16
     */
17
    private $curentLine = 0;
18
19
    public function __construct(MutatableClass $class)
20
    {
21
        $this->class = $class;
22
    }
23
24
    /**
25
     * @throws Exception\NoMoreMutationsException
26
     * @return MutationCommand[]
27
     */
28
    public function getMutationStack()
29
    {
30
        $affectedLines = array();
31
        $mutatableLines = $this->class->getMutatableLines();
32
33
        for ($i = 0; $i <= $this->curentLine; $i++) {
34
            $this->addCommandForLine($i, $mutatableLines, $affectedLines);
35
        }
36
        $this->curentLine++;
37
        return array_reverse($affectedLines);
38
    }
39
40
    /**
41
     * @param integer $lineNumber
42
     * @param MutatableLine[] $mutatableLines
43
     * @param $affectedLines
44
     */
45
    public function addCommandForLine($lineNumber, $mutatableLines, &$affectedLines)
46
    {
47
        $line = $this->getLine($mutatableLines, $lineNumber);
48
49
        if (!$line->isEnabled()) {
50
            $this->increaseMaxLineIfMaxLineIsReached($lineNumber);
51
            return;
52
        }
53
54
        $affectedLines[] = new DefaultMutationCommand($line);
55
    }
56
57
    /**
58
     * @param MutatableLine[] $mutatableLines
59
     * @param integer $processedLine
60
     * @return bool
61
     */
62
    private function maxLineReached($mutatableLines, $processedLine)
63
    {
64
        return !isset($mutatableLines[$processedLine]);
65
    }
66
67
    /**
68
     * @param integer $processedLine
69
     */
70
    private function increaseMaxLineIfMaxLineIsReached($processedLine)
71
    {
72
        if ($processedLine == $this->curentLine) {
73
            $this->curentLine++;
74
        }
75
    }
76
77
    /**
78
     * @param MutatableLine[] $mutatableLines
79
     * @param integer $requestedLine
80
     * @return MutatableLine
81
     * @throws Exception\NoMoreMutationsException
82
     */
83
    private function getLine($mutatableLines, $requestedLine)
84
    {
85
        if ($this->maxLineReached($mutatableLines, $requestedLine)) {
86
            throw new NoMoreMutationsException();
87
        }
88
        $line = $mutatableLines[$requestedLine];
89
        return $line;
90
    }
91
92
    public function getProgress()
93
    {
94
        return $this->curentLine / count($this->class->getMutatableLines());
95
    }
96
}
97