CoverageResultCollection   A
last analyzed

Complexity

Total Complexity 15

Size/Duplication

Total Lines 129
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 4
Bugs 1 Features 0
Metric Value
wmc 15
c 4
b 1
f 0
lcom 1
cbo 5
dl 0
loc 129
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A add() 0 4 1
A addAll() 0 6 2
A merge() 0 7 2
A exclude() 0 12 2
A select() 0 8 1
A selectByCoverageLessThan() 0 7 1
A selectByCoverageGreaterEqual() 0 7 1
A sortByCodeCoverage() 0 9 1
A compareCoverage() 0 11 3
1
<?php
2
3
/**
4
 * This file is part of cloak.
5
 *
6
 * (c) Noritaka Horio <[email protected]>
7
 *
8
 * This source file is subject to the MIT license that is bundled
9
 * with this source code in the file LICENSE.
10
 */
11
12
namespace cloak\result\collection;
13
14
use cloak\value\Coverage;
15
use cloak\collection\PairStackable;
16
use cloak\result\Specification;
17
use cloak\result\CoverageResultNodeCollection;
18
use cloak\result\CoverageResultNode;
19
use cloak\result\specification\Critical;
20
use cloak\result\specification\Satisfactory;
21
use PhpCollection\Map;
22
23
24
/**
25
 * Class CoverageResultCollection
26
 * @package cloak\result\collection
27
 */
28
class CoverageResultCollection implements CoverageResultNodeCollection
29
{
30
31
    use PairStackable;
32
33
34
    /**
35
     * @param \cloak\result\CoverageResultNode[] $results
36
     */
37
    public function __construct(array $results = [])
38
    {
39
        $this->collection = new Map($results);
40
    }
41
42
    /**
43
     * @param \cloak\result\CoverageResultNode $result
44
     */
45
    public function add(CoverageResultNode $result)
46
    {
47
        $this->collection->set($result->getName(), $result);
48
    }
49
50
    /**
51
     * @param CoverageResultNode[] $results
52
     */
53
    public function addAll(array $results)
54
    {
55
        foreach ($results as $result) {
56
            $this->add($result);
57
        }
58
    }
59
60
    /**
61
     * @param CoverageResultNodeCollection $results
62
     * @return CoverageResultCollection|void
63
     */
64
    public function merge(CoverageResultNodeCollection $results)
65
    {
66
        foreach ($results as $result) {
67
            $this->add($result);
68
        }
69
        return $this;
70
    }
71
72
    /**
73
     * @param CoverageResultNodeCollection $excludeResults
74
     * @return CoverageResultCollection
75
     */
76
    public function exclude(CoverageResultNodeCollection $excludeResults)
77
    {
78
        $results = clone $this->collection;
79
80
        foreach ($excludeResults as $excludeResult) {
81
            $key = $excludeResult->getName();
82
            $results->remove($key);
83
        }
84
        $results = $this->createArray($results);
85
86
        return new self($results);
87
    }
88
89
    /**
90
     * @param Specification $specification
91
     * @return CoverageResultCollection
92
     */
93
    public function select(Specification $specification)
94
    {
95
        $arguments = [$specification, 'match'];
96
        $results = $this->collection->filter($arguments);
97
        $results = $this->createArray($results);
98
99
        return new self($results);
100
    }
101
102
    /**
103
     * @param Coverage $coverage
104
     * @return CoverageResultCollection
105
     */
106
    public function selectByCoverageLessThan(Coverage $coverage)
107
    {
108
        $specification = Critical::createFromCoverage($coverage);
109
        $result = $this->select($specification)->sortByCodeCoverage();
110
111
        return $result;
112
    }
113
114
    /**
115
     * @param Coverage $coverage
116
     * @return CoverageResultCollection
117
     */
118
    public function selectByCoverageGreaterEqual(Coverage $coverage)
119
    {
120
        $specification = Satisfactory::createFromCoverage($coverage);
121
        $result = $this->select($specification)->sortByCodeCoverage();
122
123
        return $result;
124
    }
125
126
    /**
127
     * @return CoverageResultCollection
128
     */
129
    private function sortByCodeCoverage()
130
    {
131
        $results = clone $this->collection;
132
        $results = $this->createArray($results);
133
134
        uasort($results, [$this, 'compareCoverage']);
135
136
        return new self($results);
137
    }
138
139
    /**
140
     * @param CoverageResultNode $resultA
141
     * @param CoverageResultNode $resultB
142
     * @return int
143
     */
144
    private function compareCoverage(CoverageResultNode $resultA, CoverageResultNode $resultB)
145
    {
146
        $coverageA = $resultA->getCodeCoverage();
147
        $coverageB = $resultB->getCodeCoverage();
148
149
        if ($coverageA === $coverageB) {
150
            return 0;
151
        }
152
153
        return ($coverageA < $coverageB) ? -1 : 1;
154
    }
155
156
}
157