Passed
Push — TEST/ScrutinizerPHPAnalysisEng... ( bc3f13...c9e065 )
by Boudry
03:23
created

Result::getBuildTimeStamp()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 2
ccs 2
cts 2
cp 1
rs 10
c 0
b 0
f 0
cc 1
eloc 1
nc 1
nop 0
crap 1
1
<?php
2
/*
3
    Condorcet PHP Class, with Schulze Methods and others !
4
5
    By Julien Boudry - MIT LICENSE (Please read LICENSE.txt)
6
    https://github.com/julien-boudry/Condorcet
7
*/
8
declare(strict_types=1);
9
10
namespace Condorcet;
11
12
use Condorcet\CondorcetException;
13
use Condorcet\CondorcetVersion;
14
use Condorcet\Election;
15
use Condorcet\Util;
16
use Condorcet\Vote;
17
18
19
class Result implements \ArrayAccess, \Countable, \Iterator 
20
{
21
    use CondorcetVersion;
22
23
    // Implement Iterator
24
25 1
    function rewind() :void {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
26 1
        reset($this->_UserResult);
27 1
    }
28
29 1
    function current () {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
30 1
        return current($this->_UserResult);
31
    }
32
33 1
    function key () : int {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
34 1
        return key($this->_UserResult);
1 ignored issue
show
Bug Best Practice introduced by
The expression return key($this->_UserResult) could return the type null|string which is incompatible with the type-hinted return integer. Consider adding an additional type-check to rule them out.
Loading history...
35
    }
36
37 1
    function next () : void {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
38 1
        next($this->_UserResult);
39 1
    }
40
41 1
    function valid () : bool {
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
42 1
        return (key($this->_UserResult) === null) ? false : true;
43
    }
44
45
    // Implement ArrayAccess
46
47 1
    public function offsetSet ($offset, $value) : void {
48 1
        throw new CondorcetException (0,"Can't change a result");
49
    }
50
51
    public function offsetExists ($offset) : bool {
52
        return isset($this->_UserResult[$offset]);
53
    }
54
55 1
    public function offsetUnset ($offset) : void {
56 1
        throw new CondorcetException (0,"Can't change a result");
57
    }
58
59 49
    public function offsetGet ($offset) {
60 49
        return $this->_UserResult[$offset] ?? null;
61
    }
62
63
    // Implement Countable
64
65 3
    public function count () : int {
66 3
        return count($this->_UserResult);
67
    }
68
69
70
/////////// CONSTRUCTOR ///////////
71
72
    protected $_Result;
73
    protected $_UserResult;
74
    protected $_stringResult;
75
    protected $_CondorcetWinner;
76
    protected $_CondorcetLoser;
77
78
    protected $_Stats;
79
80
    protected $_warning = [];
81
82
    protected $_BuildTimeStamp;
83
    protected $_fromMethod;
84
    protected $_byClass;
85
    protected $_ElectionCondorcetVersion;
86
87
88 71
    public function __construct (string $fromMethod, string $byClass, Election $election, array $result, $stats)
89
    {
90 71
        $this->_Result = $result;
91 71
        $this->_UserResult = $this->makeUserResult($election);
92 71
        $this->_stringResult = $this->getResultAsArray(true);
93 71
        $this->_Stats = $stats;
94 71
        $this->_fromMethod = $fromMethod;
95 71
        $this->_byClass = $byClass;
96 71
        $this->_ElectionCondorcetVersion = $election->getObjectVersion();
97 71
        $this->_CondorcetWinner = $election->getWinner();
98 71
        $this->_CondorcetLoser = $election->getLoser();
99 71
        $this->_BuildTimeStamp = microtime(true);
100 71
    }
101
102
103
/////////// Get Result ///////////
104
105 71
    public function getResultAsArray (bool $convertToString = false) : array
106
    {
107 71
        $r = $this->_UserResult;
108
109 71
        foreach ($r as &$rank) :
110 71
            if (count($rank) === 1) :
111 68
                $rank = ($convertToString) ? (string) $rank[0] : $rank[0];
112 24
            elseif ($convertToString) :
113 24
                foreach ($rank as &$subRank) :
114 71
                    $subRank = (string) $subRank;
115
                endforeach;
116
            endif;
117
        endforeach;
118
119 71
        return $r;
120
    }
121
122 3
    public function getResultAsString ()
123
    {
124 3
        return Vote::getRankingAsString($this->getResultAsArray(true));
125
    }
126
127 1
    public function getOriginalArrayWithString () : array
128
    {
129 1
        return $this->_stringResult;
130
    }
131
132
    public function getResultAsInternalKey () : array
133
    {
134
        return $this->_Result;
135
    }
136
137 11
    public function getStats () {
138 11
        return $this->_Stats;
139
    }
140
141 48
    public function getWinner () {
142 48
        return Util::format($this[1],false);
143
    }
144
145 3
    public function getLoser () {
146 3
        return Util::format($this[count($this)],false);
147
    }
148
149
    public function getCondorcetWinner () {
150
        return $this->_CondorcetWinner;
151
    }
152
153
    public function getCondorcetLoser () {
154
        return $this->_CondorcetLoser;
155
    }
156
157 71
    protected function makeUserResult (Election $election) : array
158
    {
159 71
        $userResult = [];
160
161 71
        foreach ( $this->_Result as $key => $value ) :
162 71
            if (is_array($value)) :
163 68
                foreach ($value as $candidate_key) :
164 68
                    $userResult[$key][] = $election->getCandidateId($candidate_key);
165
                endforeach;
166 5
            elseif (is_null($value)) :
167
                $userResult[$key] = null;
168
            else :
169 71
                $userResult[$key][] = $election->getCandidateId($value);
170
            endif;
171
        endforeach;
172
173 71
        foreach ( $userResult as $key => $value ) :
174 71
            if (is_null($value)) :
175 71
                $userResult[$key] = null;
176
            endif;
177
        endforeach;
178
179 71
        return $userResult;
180
    }
181
182
183
/////////// Get & Set MetaData ///////////
184
185 1
    public function addWarning (int $type, string $msg = null) : bool
186
    {
187 1
        $this->_warning[] = ['type' => $type, 'msg' => $msg];
188
189 1
        return true;
190
    }
191
192 2
    public function getWarning ($type = null) : array
193
    {
194 2
        if ($type === null) :
195
            return $this->_warning;
196
        else :
197 2
            $r = [];
198
199 2
            foreach ($this->_warning as $oneWarning) :
200 1
                if ($oneWarning['type'] === (int) $type) :
201 1
                    $r[] = $oneWarning;
202
                endif;
203
            endforeach;
204
205 2
            return $r;
206
        endif;
207
    }
208
209 1
    public function getClassGenerator () : string {
210 1
        return $this->_byClass;
211
    }
212
213 1
    public function getMethod () : string {
214 1
        return $this->_fromMethod;
215
    }
216
217 1
    public function getBuildTimeStamp () : float {
218 1
        return (float) $this->_BuildTimeStamp;
219
    }
220
221 1
    public function getCondorcetElectionGeneratorVersion () : string {
222 1
        return $this->_ElectionCondorcetVersion;
223
    }
224
225
}
226