Chris@0
|
1 <?php
|
Chris@0
|
2 /*
|
Chris@0
|
3 * This file is part of the PHP_CodeCoverage package.
|
Chris@0
|
4 *
|
Chris@0
|
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
|
Chris@0
|
6 *
|
Chris@0
|
7 * For the full copyright and license information, please view the LICENSE
|
Chris@0
|
8 * file that was distributed with this source code.
|
Chris@0
|
9 */
|
Chris@0
|
10
|
Chris@0
|
11 /**
|
Chris@0
|
12 * Represents a file in the code coverage information tree.
|
Chris@0
|
13 *
|
Chris@0
|
14 * @since Class available since Release 1.1.0
|
Chris@0
|
15 */
|
Chris@0
|
16 class PHP_CodeCoverage_Report_Node_File extends PHP_CodeCoverage_Report_Node
|
Chris@0
|
17 {
|
Chris@0
|
18 /**
|
Chris@0
|
19 * @var array
|
Chris@0
|
20 */
|
Chris@0
|
21 protected $coverageData;
|
Chris@0
|
22
|
Chris@0
|
23 /**
|
Chris@0
|
24 * @var array
|
Chris@0
|
25 */
|
Chris@0
|
26 protected $testData;
|
Chris@0
|
27
|
Chris@0
|
28 /**
|
Chris@0
|
29 * @var int
|
Chris@0
|
30 */
|
Chris@0
|
31 protected $numExecutableLines = 0;
|
Chris@0
|
32
|
Chris@0
|
33 /**
|
Chris@0
|
34 * @var int
|
Chris@0
|
35 */
|
Chris@0
|
36 protected $numExecutedLines = 0;
|
Chris@0
|
37
|
Chris@0
|
38 /**
|
Chris@0
|
39 * @var array
|
Chris@0
|
40 */
|
Chris@0
|
41 protected $classes = array();
|
Chris@0
|
42
|
Chris@0
|
43 /**
|
Chris@0
|
44 * @var array
|
Chris@0
|
45 */
|
Chris@0
|
46 protected $traits = array();
|
Chris@0
|
47
|
Chris@0
|
48 /**
|
Chris@0
|
49 * @var array
|
Chris@0
|
50 */
|
Chris@0
|
51 protected $functions = array();
|
Chris@0
|
52
|
Chris@0
|
53 /**
|
Chris@0
|
54 * @var array
|
Chris@0
|
55 */
|
Chris@0
|
56 protected $linesOfCode = array();
|
Chris@0
|
57
|
Chris@0
|
58 /**
|
Chris@0
|
59 * @var int
|
Chris@0
|
60 */
|
Chris@0
|
61 protected $numTestedTraits = 0;
|
Chris@0
|
62
|
Chris@0
|
63 /**
|
Chris@0
|
64 * @var int
|
Chris@0
|
65 */
|
Chris@0
|
66 protected $numTestedClasses = 0;
|
Chris@0
|
67
|
Chris@0
|
68 /**
|
Chris@0
|
69 * @var int
|
Chris@0
|
70 */
|
Chris@0
|
71 protected $numMethods = null;
|
Chris@0
|
72
|
Chris@0
|
73 /**
|
Chris@0
|
74 * @var int
|
Chris@0
|
75 */
|
Chris@0
|
76 protected $numTestedMethods = null;
|
Chris@0
|
77
|
Chris@0
|
78 /**
|
Chris@0
|
79 * @var int
|
Chris@0
|
80 */
|
Chris@0
|
81 protected $numTestedFunctions = null;
|
Chris@0
|
82
|
Chris@0
|
83 /**
|
Chris@0
|
84 * @var array
|
Chris@0
|
85 */
|
Chris@0
|
86 protected $startLines = array();
|
Chris@0
|
87
|
Chris@0
|
88 /**
|
Chris@0
|
89 * @var array
|
Chris@0
|
90 */
|
Chris@0
|
91 protected $endLines = array();
|
Chris@0
|
92
|
Chris@0
|
93 /**
|
Chris@0
|
94 * @var bool
|
Chris@0
|
95 */
|
Chris@0
|
96 protected $cacheTokens;
|
Chris@0
|
97
|
Chris@0
|
98 /**
|
Chris@0
|
99 * Constructor.
|
Chris@0
|
100 *
|
Chris@0
|
101 * @param string $name
|
Chris@0
|
102 * @param PHP_CodeCoverage_Report_Node $parent
|
Chris@0
|
103 * @param array $coverageData
|
Chris@0
|
104 * @param array $testData
|
Chris@0
|
105 * @param bool $cacheTokens
|
Chris@0
|
106 * @throws PHP_CodeCoverage_Exception
|
Chris@0
|
107 */
|
Chris@0
|
108 public function __construct($name, PHP_CodeCoverage_Report_Node $parent, array $coverageData, array $testData, $cacheTokens)
|
Chris@0
|
109 {
|
Chris@0
|
110 if (!is_bool($cacheTokens)) {
|
Chris@0
|
111 throw PHP_CodeCoverage_Util_InvalidArgumentHelper::factory(
|
Chris@0
|
112 1,
|
Chris@0
|
113 'boolean'
|
Chris@0
|
114 );
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 parent::__construct($name, $parent);
|
Chris@0
|
118
|
Chris@0
|
119 $this->coverageData = $coverageData;
|
Chris@0
|
120 $this->testData = $testData;
|
Chris@0
|
121 $this->cacheTokens = $cacheTokens;
|
Chris@0
|
122
|
Chris@0
|
123 $this->calculateStatistics();
|
Chris@0
|
124 }
|
Chris@0
|
125
|
Chris@0
|
126 /**
|
Chris@0
|
127 * Returns the number of files in/under this node.
|
Chris@0
|
128 *
|
Chris@0
|
129 * @return int
|
Chris@0
|
130 */
|
Chris@0
|
131 public function count()
|
Chris@0
|
132 {
|
Chris@0
|
133 return 1;
|
Chris@0
|
134 }
|
Chris@0
|
135
|
Chris@0
|
136 /**
|
Chris@0
|
137 * Returns the code coverage data of this node.
|
Chris@0
|
138 *
|
Chris@0
|
139 * @return array
|
Chris@0
|
140 */
|
Chris@0
|
141 public function getCoverageData()
|
Chris@0
|
142 {
|
Chris@0
|
143 return $this->coverageData;
|
Chris@0
|
144 }
|
Chris@0
|
145
|
Chris@0
|
146 /**
|
Chris@0
|
147 * Returns the test data of this node.
|
Chris@0
|
148 *
|
Chris@0
|
149 * @return array
|
Chris@0
|
150 */
|
Chris@0
|
151 public function getTestData()
|
Chris@0
|
152 {
|
Chris@0
|
153 return $this->testData;
|
Chris@0
|
154 }
|
Chris@0
|
155
|
Chris@0
|
156 /**
|
Chris@0
|
157 * Returns the classes of this node.
|
Chris@0
|
158 *
|
Chris@0
|
159 * @return array
|
Chris@0
|
160 */
|
Chris@0
|
161 public function getClasses()
|
Chris@0
|
162 {
|
Chris@0
|
163 return $this->classes;
|
Chris@0
|
164 }
|
Chris@0
|
165
|
Chris@0
|
166 /**
|
Chris@0
|
167 * Returns the traits of this node.
|
Chris@0
|
168 *
|
Chris@0
|
169 * @return array
|
Chris@0
|
170 */
|
Chris@0
|
171 public function getTraits()
|
Chris@0
|
172 {
|
Chris@0
|
173 return $this->traits;
|
Chris@0
|
174 }
|
Chris@0
|
175
|
Chris@0
|
176 /**
|
Chris@0
|
177 * Returns the functions of this node.
|
Chris@0
|
178 *
|
Chris@0
|
179 * @return array
|
Chris@0
|
180 */
|
Chris@0
|
181 public function getFunctions()
|
Chris@0
|
182 {
|
Chris@0
|
183 return $this->functions;
|
Chris@0
|
184 }
|
Chris@0
|
185
|
Chris@0
|
186 /**
|
Chris@0
|
187 * Returns the LOC/CLOC/NCLOC of this node.
|
Chris@0
|
188 *
|
Chris@0
|
189 * @return array
|
Chris@0
|
190 */
|
Chris@0
|
191 public function getLinesOfCode()
|
Chris@0
|
192 {
|
Chris@0
|
193 return $this->linesOfCode;
|
Chris@0
|
194 }
|
Chris@0
|
195
|
Chris@0
|
196 /**
|
Chris@0
|
197 * Returns the number of executable lines.
|
Chris@0
|
198 *
|
Chris@0
|
199 * @return int
|
Chris@0
|
200 */
|
Chris@0
|
201 public function getNumExecutableLines()
|
Chris@0
|
202 {
|
Chris@0
|
203 return $this->numExecutableLines;
|
Chris@0
|
204 }
|
Chris@0
|
205
|
Chris@0
|
206 /**
|
Chris@0
|
207 * Returns the number of executed lines.
|
Chris@0
|
208 *
|
Chris@0
|
209 * @return int
|
Chris@0
|
210 */
|
Chris@0
|
211 public function getNumExecutedLines()
|
Chris@0
|
212 {
|
Chris@0
|
213 return $this->numExecutedLines;
|
Chris@0
|
214 }
|
Chris@0
|
215
|
Chris@0
|
216 /**
|
Chris@0
|
217 * Returns the number of classes.
|
Chris@0
|
218 *
|
Chris@0
|
219 * @return int
|
Chris@0
|
220 */
|
Chris@0
|
221 public function getNumClasses()
|
Chris@0
|
222 {
|
Chris@0
|
223 return count($this->classes);
|
Chris@0
|
224 }
|
Chris@0
|
225
|
Chris@0
|
226 /**
|
Chris@0
|
227 * Returns the number of tested classes.
|
Chris@0
|
228 *
|
Chris@0
|
229 * @return int
|
Chris@0
|
230 */
|
Chris@0
|
231 public function getNumTestedClasses()
|
Chris@0
|
232 {
|
Chris@0
|
233 return $this->numTestedClasses;
|
Chris@0
|
234 }
|
Chris@0
|
235
|
Chris@0
|
236 /**
|
Chris@0
|
237 * Returns the number of traits.
|
Chris@0
|
238 *
|
Chris@0
|
239 * @return int
|
Chris@0
|
240 */
|
Chris@0
|
241 public function getNumTraits()
|
Chris@0
|
242 {
|
Chris@0
|
243 return count($this->traits);
|
Chris@0
|
244 }
|
Chris@0
|
245
|
Chris@0
|
246 /**
|
Chris@0
|
247 * Returns the number of tested traits.
|
Chris@0
|
248 *
|
Chris@0
|
249 * @return int
|
Chris@0
|
250 */
|
Chris@0
|
251 public function getNumTestedTraits()
|
Chris@0
|
252 {
|
Chris@0
|
253 return $this->numTestedTraits;
|
Chris@0
|
254 }
|
Chris@0
|
255
|
Chris@0
|
256 /**
|
Chris@0
|
257 * Returns the number of methods.
|
Chris@0
|
258 *
|
Chris@0
|
259 * @return int
|
Chris@0
|
260 */
|
Chris@0
|
261 public function getNumMethods()
|
Chris@0
|
262 {
|
Chris@0
|
263 if ($this->numMethods === null) {
|
Chris@0
|
264 $this->numMethods = 0;
|
Chris@0
|
265
|
Chris@0
|
266 foreach ($this->classes as $class) {
|
Chris@0
|
267 foreach ($class['methods'] as $method) {
|
Chris@0
|
268 if ($method['executableLines'] > 0) {
|
Chris@0
|
269 $this->numMethods++;
|
Chris@0
|
270 }
|
Chris@0
|
271 }
|
Chris@0
|
272 }
|
Chris@0
|
273
|
Chris@0
|
274 foreach ($this->traits as $trait) {
|
Chris@0
|
275 foreach ($trait['methods'] as $method) {
|
Chris@0
|
276 if ($method['executableLines'] > 0) {
|
Chris@0
|
277 $this->numMethods++;
|
Chris@0
|
278 }
|
Chris@0
|
279 }
|
Chris@0
|
280 }
|
Chris@0
|
281 }
|
Chris@0
|
282
|
Chris@0
|
283 return $this->numMethods;
|
Chris@0
|
284 }
|
Chris@0
|
285
|
Chris@0
|
286 /**
|
Chris@0
|
287 * Returns the number of tested methods.
|
Chris@0
|
288 *
|
Chris@0
|
289 * @return int
|
Chris@0
|
290 */
|
Chris@0
|
291 public function getNumTestedMethods()
|
Chris@0
|
292 {
|
Chris@0
|
293 if ($this->numTestedMethods === null) {
|
Chris@0
|
294 $this->numTestedMethods = 0;
|
Chris@0
|
295
|
Chris@0
|
296 foreach ($this->classes as $class) {
|
Chris@0
|
297 foreach ($class['methods'] as $method) {
|
Chris@0
|
298 if ($method['executableLines'] > 0 &&
|
Chris@0
|
299 $method['coverage'] == 100) {
|
Chris@0
|
300 $this->numTestedMethods++;
|
Chris@0
|
301 }
|
Chris@0
|
302 }
|
Chris@0
|
303 }
|
Chris@0
|
304
|
Chris@0
|
305 foreach ($this->traits as $trait) {
|
Chris@0
|
306 foreach ($trait['methods'] as $method) {
|
Chris@0
|
307 if ($method['executableLines'] > 0 &&
|
Chris@0
|
308 $method['coverage'] == 100) {
|
Chris@0
|
309 $this->numTestedMethods++;
|
Chris@0
|
310 }
|
Chris@0
|
311 }
|
Chris@0
|
312 }
|
Chris@0
|
313 }
|
Chris@0
|
314
|
Chris@0
|
315 return $this->numTestedMethods;
|
Chris@0
|
316 }
|
Chris@0
|
317
|
Chris@0
|
318 /**
|
Chris@0
|
319 * Returns the number of functions.
|
Chris@0
|
320 *
|
Chris@0
|
321 * @return int
|
Chris@0
|
322 */
|
Chris@0
|
323 public function getNumFunctions()
|
Chris@0
|
324 {
|
Chris@0
|
325 return count($this->functions);
|
Chris@0
|
326 }
|
Chris@0
|
327
|
Chris@0
|
328 /**
|
Chris@0
|
329 * Returns the number of tested functions.
|
Chris@0
|
330 *
|
Chris@0
|
331 * @return int
|
Chris@0
|
332 */
|
Chris@0
|
333 public function getNumTestedFunctions()
|
Chris@0
|
334 {
|
Chris@0
|
335 if ($this->numTestedFunctions === null) {
|
Chris@0
|
336 $this->numTestedFunctions = 0;
|
Chris@0
|
337
|
Chris@0
|
338 foreach ($this->functions as $function) {
|
Chris@0
|
339 if ($function['executableLines'] > 0 &&
|
Chris@0
|
340 $function['coverage'] == 100) {
|
Chris@0
|
341 $this->numTestedFunctions++;
|
Chris@0
|
342 }
|
Chris@0
|
343 }
|
Chris@0
|
344 }
|
Chris@0
|
345
|
Chris@0
|
346 return $this->numTestedFunctions;
|
Chris@0
|
347 }
|
Chris@0
|
348
|
Chris@0
|
349 /**
|
Chris@0
|
350 * Calculates coverage statistics for the file.
|
Chris@0
|
351 */
|
Chris@0
|
352 protected function calculateStatistics()
|
Chris@0
|
353 {
|
Chris@0
|
354 $classStack = $functionStack = array();
|
Chris@0
|
355
|
Chris@0
|
356 if ($this->cacheTokens) {
|
Chris@0
|
357 $tokens = PHP_Token_Stream_CachingFactory::get($this->getPath());
|
Chris@0
|
358 } else {
|
Chris@0
|
359 $tokens = new PHP_Token_Stream($this->getPath());
|
Chris@0
|
360 }
|
Chris@0
|
361
|
Chris@0
|
362 $this->processClasses($tokens);
|
Chris@0
|
363 $this->processTraits($tokens);
|
Chris@0
|
364 $this->processFunctions($tokens);
|
Chris@0
|
365 $this->linesOfCode = $tokens->getLinesOfCode();
|
Chris@0
|
366 unset($tokens);
|
Chris@0
|
367
|
Chris@0
|
368 for ($lineNumber = 1; $lineNumber <= $this->linesOfCode['loc']; $lineNumber++) {
|
Chris@0
|
369 if (isset($this->startLines[$lineNumber])) {
|
Chris@0
|
370 // Start line of a class.
|
Chris@0
|
371 if (isset($this->startLines[$lineNumber]['className'])) {
|
Chris@0
|
372 if (isset($currentClass)) {
|
Chris@0
|
373 $classStack[] = &$currentClass;
|
Chris@0
|
374 }
|
Chris@0
|
375
|
Chris@0
|
376 $currentClass = &$this->startLines[$lineNumber];
|
Chris@0
|
377 } // Start line of a trait.
|
Chris@0
|
378 elseif (isset($this->startLines[$lineNumber]['traitName'])) {
|
Chris@0
|
379 $currentTrait = &$this->startLines[$lineNumber];
|
Chris@0
|
380 } // Start line of a method.
|
Chris@0
|
381 elseif (isset($this->startLines[$lineNumber]['methodName'])) {
|
Chris@0
|
382 $currentMethod = &$this->startLines[$lineNumber];
|
Chris@0
|
383 } // Start line of a function.
|
Chris@0
|
384 elseif (isset($this->startLines[$lineNumber]['functionName'])) {
|
Chris@0
|
385 if (isset($currentFunction)) {
|
Chris@0
|
386 $functionStack[] = &$currentFunction;
|
Chris@0
|
387 }
|
Chris@0
|
388
|
Chris@0
|
389 $currentFunction = &$this->startLines[$lineNumber];
|
Chris@0
|
390 }
|
Chris@0
|
391 }
|
Chris@0
|
392
|
Chris@0
|
393 if (isset($this->coverageData[$lineNumber])) {
|
Chris@0
|
394 if (isset($currentClass)) {
|
Chris@0
|
395 $currentClass['executableLines']++;
|
Chris@0
|
396 }
|
Chris@0
|
397
|
Chris@0
|
398 if (isset($currentTrait)) {
|
Chris@0
|
399 $currentTrait['executableLines']++;
|
Chris@0
|
400 }
|
Chris@0
|
401
|
Chris@0
|
402 if (isset($currentMethod)) {
|
Chris@0
|
403 $currentMethod['executableLines']++;
|
Chris@0
|
404 }
|
Chris@0
|
405
|
Chris@0
|
406 if (isset($currentFunction)) {
|
Chris@0
|
407 $currentFunction['executableLines']++;
|
Chris@0
|
408 }
|
Chris@0
|
409
|
Chris@0
|
410 $this->numExecutableLines++;
|
Chris@0
|
411
|
Chris@0
|
412 if (count($this->coverageData[$lineNumber]) > 0) {
|
Chris@0
|
413 if (isset($currentClass)) {
|
Chris@0
|
414 $currentClass['executedLines']++;
|
Chris@0
|
415 }
|
Chris@0
|
416
|
Chris@0
|
417 if (isset($currentTrait)) {
|
Chris@0
|
418 $currentTrait['executedLines']++;
|
Chris@0
|
419 }
|
Chris@0
|
420
|
Chris@0
|
421 if (isset($currentMethod)) {
|
Chris@0
|
422 $currentMethod['executedLines']++;
|
Chris@0
|
423 }
|
Chris@0
|
424
|
Chris@0
|
425 if (isset($currentFunction)) {
|
Chris@0
|
426 $currentFunction['executedLines']++;
|
Chris@0
|
427 }
|
Chris@0
|
428
|
Chris@0
|
429 $this->numExecutedLines++;
|
Chris@0
|
430 }
|
Chris@0
|
431 }
|
Chris@0
|
432
|
Chris@0
|
433 if (isset($this->endLines[$lineNumber])) {
|
Chris@0
|
434 // End line of a class.
|
Chris@0
|
435 if (isset($this->endLines[$lineNumber]['className'])) {
|
Chris@0
|
436 unset($currentClass);
|
Chris@0
|
437
|
Chris@0
|
438 if ($classStack) {
|
Chris@0
|
439 end($classStack);
|
Chris@0
|
440 $key = key($classStack);
|
Chris@0
|
441 $currentClass = &$classStack[$key];
|
Chris@0
|
442 unset($classStack[$key]);
|
Chris@0
|
443 }
|
Chris@0
|
444 } // End line of a trait.
|
Chris@0
|
445 elseif (isset($this->endLines[$lineNumber]['traitName'])) {
|
Chris@0
|
446 unset($currentTrait);
|
Chris@0
|
447 } // End line of a method.
|
Chris@0
|
448 elseif (isset($this->endLines[$lineNumber]['methodName'])) {
|
Chris@0
|
449 unset($currentMethod);
|
Chris@0
|
450 } // End line of a function.
|
Chris@0
|
451 elseif (isset($this->endLines[$lineNumber]['functionName'])) {
|
Chris@0
|
452 unset($currentFunction);
|
Chris@0
|
453
|
Chris@0
|
454 if ($functionStack) {
|
Chris@0
|
455 end($functionStack);
|
Chris@0
|
456 $key = key($functionStack);
|
Chris@0
|
457 $currentFunction = &$functionStack[$key];
|
Chris@0
|
458 unset($functionStack[$key]);
|
Chris@0
|
459 }
|
Chris@0
|
460 }
|
Chris@0
|
461 }
|
Chris@0
|
462 }
|
Chris@0
|
463
|
Chris@0
|
464 foreach ($this->traits as &$trait) {
|
Chris@0
|
465 foreach ($trait['methods'] as &$method) {
|
Chris@0
|
466 if ($method['executableLines'] > 0) {
|
Chris@0
|
467 $method['coverage'] = ($method['executedLines'] /
|
Chris@0
|
468 $method['executableLines']) * 100;
|
Chris@0
|
469 } else {
|
Chris@0
|
470 $method['coverage'] = 100;
|
Chris@0
|
471 }
|
Chris@0
|
472
|
Chris@0
|
473 $method['crap'] = $this->crap(
|
Chris@0
|
474 $method['ccn'],
|
Chris@0
|
475 $method['coverage']
|
Chris@0
|
476 );
|
Chris@0
|
477
|
Chris@0
|
478 $trait['ccn'] += $method['ccn'];
|
Chris@0
|
479 }
|
Chris@0
|
480
|
Chris@0
|
481 if ($trait['executableLines'] > 0) {
|
Chris@0
|
482 $trait['coverage'] = ($trait['executedLines'] /
|
Chris@0
|
483 $trait['executableLines']) * 100;
|
Chris@0
|
484 } else {
|
Chris@0
|
485 $trait['coverage'] = 100;
|
Chris@0
|
486 }
|
Chris@0
|
487
|
Chris@0
|
488 if ($trait['coverage'] == 100) {
|
Chris@0
|
489 $this->numTestedClasses++;
|
Chris@0
|
490 }
|
Chris@0
|
491
|
Chris@0
|
492 $trait['crap'] = $this->crap(
|
Chris@0
|
493 $trait['ccn'],
|
Chris@0
|
494 $trait['coverage']
|
Chris@0
|
495 );
|
Chris@0
|
496 }
|
Chris@0
|
497
|
Chris@0
|
498 foreach ($this->classes as &$class) {
|
Chris@0
|
499 foreach ($class['methods'] as &$method) {
|
Chris@0
|
500 if ($method['executableLines'] > 0) {
|
Chris@0
|
501 $method['coverage'] = ($method['executedLines'] /
|
Chris@0
|
502 $method['executableLines']) * 100;
|
Chris@0
|
503 } else {
|
Chris@0
|
504 $method['coverage'] = 100;
|
Chris@0
|
505 }
|
Chris@0
|
506
|
Chris@0
|
507 $method['crap'] = $this->crap(
|
Chris@0
|
508 $method['ccn'],
|
Chris@0
|
509 $method['coverage']
|
Chris@0
|
510 );
|
Chris@0
|
511
|
Chris@0
|
512 $class['ccn'] += $method['ccn'];
|
Chris@0
|
513 }
|
Chris@0
|
514
|
Chris@0
|
515 if ($class['executableLines'] > 0) {
|
Chris@0
|
516 $class['coverage'] = ($class['executedLines'] /
|
Chris@0
|
517 $class['executableLines']) * 100;
|
Chris@0
|
518 } else {
|
Chris@0
|
519 $class['coverage'] = 100;
|
Chris@0
|
520 }
|
Chris@0
|
521
|
Chris@0
|
522 if ($class['coverage'] == 100) {
|
Chris@0
|
523 $this->numTestedClasses++;
|
Chris@0
|
524 }
|
Chris@0
|
525
|
Chris@0
|
526 $class['crap'] = $this->crap(
|
Chris@0
|
527 $class['ccn'],
|
Chris@0
|
528 $class['coverage']
|
Chris@0
|
529 );
|
Chris@0
|
530 }
|
Chris@0
|
531 }
|
Chris@0
|
532
|
Chris@0
|
533 /**
|
Chris@0
|
534 * @param PHP_Token_Stream $tokens
|
Chris@0
|
535 */
|
Chris@0
|
536 protected function processClasses(PHP_Token_Stream $tokens)
|
Chris@0
|
537 {
|
Chris@0
|
538 $classes = $tokens->getClasses();
|
Chris@0
|
539 unset($tokens);
|
Chris@0
|
540
|
Chris@0
|
541 $link = $this->getId() . '.html#';
|
Chris@0
|
542
|
Chris@0
|
543 foreach ($classes as $className => $class) {
|
Chris@0
|
544 $this->classes[$className] = array(
|
Chris@0
|
545 'className' => $className,
|
Chris@0
|
546 'methods' => array(),
|
Chris@0
|
547 'startLine' => $class['startLine'],
|
Chris@0
|
548 'executableLines' => 0,
|
Chris@0
|
549 'executedLines' => 0,
|
Chris@0
|
550 'ccn' => 0,
|
Chris@0
|
551 'coverage' => 0,
|
Chris@0
|
552 'crap' => 0,
|
Chris@0
|
553 'package' => $class['package'],
|
Chris@0
|
554 'link' => $link . $class['startLine']
|
Chris@0
|
555 );
|
Chris@0
|
556
|
Chris@0
|
557 $this->startLines[$class['startLine']] = &$this->classes[$className];
|
Chris@0
|
558 $this->endLines[$class['endLine']] = &$this->classes[$className];
|
Chris@0
|
559
|
Chris@0
|
560 foreach ($class['methods'] as $methodName => $method) {
|
Chris@0
|
561 $this->classes[$className]['methods'][$methodName] = array(
|
Chris@0
|
562 'methodName' => $methodName,
|
Chris@0
|
563 'signature' => $method['signature'],
|
Chris@0
|
564 'startLine' => $method['startLine'],
|
Chris@0
|
565 'endLine' => $method['endLine'],
|
Chris@0
|
566 'executableLines' => 0,
|
Chris@0
|
567 'executedLines' => 0,
|
Chris@0
|
568 'ccn' => $method['ccn'],
|
Chris@0
|
569 'coverage' => 0,
|
Chris@0
|
570 'crap' => 0,
|
Chris@0
|
571 'link' => $link . $method['startLine']
|
Chris@0
|
572 );
|
Chris@0
|
573
|
Chris@0
|
574 $this->startLines[$method['startLine']] = &$this->classes[$className]['methods'][$methodName];
|
Chris@0
|
575 $this->endLines[$method['endLine']] = &$this->classes[$className]['methods'][$methodName];
|
Chris@0
|
576 }
|
Chris@0
|
577 }
|
Chris@0
|
578 }
|
Chris@0
|
579
|
Chris@0
|
580 /**
|
Chris@0
|
581 * @param PHP_Token_Stream $tokens
|
Chris@0
|
582 */
|
Chris@0
|
583 protected function processTraits(PHP_Token_Stream $tokens)
|
Chris@0
|
584 {
|
Chris@0
|
585 $traits = $tokens->getTraits();
|
Chris@0
|
586 unset($tokens);
|
Chris@0
|
587
|
Chris@0
|
588 $link = $this->getId() . '.html#';
|
Chris@0
|
589
|
Chris@0
|
590 foreach ($traits as $traitName => $trait) {
|
Chris@0
|
591 $this->traits[$traitName] = array(
|
Chris@0
|
592 'traitName' => $traitName,
|
Chris@0
|
593 'methods' => array(),
|
Chris@0
|
594 'startLine' => $trait['startLine'],
|
Chris@0
|
595 'executableLines' => 0,
|
Chris@0
|
596 'executedLines' => 0,
|
Chris@0
|
597 'ccn' => 0,
|
Chris@0
|
598 'coverage' => 0,
|
Chris@0
|
599 'crap' => 0,
|
Chris@0
|
600 'package' => $trait['package'],
|
Chris@0
|
601 'link' => $link . $trait['startLine']
|
Chris@0
|
602 );
|
Chris@0
|
603
|
Chris@0
|
604 $this->startLines[$trait['startLine']] = &$this->traits[$traitName];
|
Chris@0
|
605 $this->endLines[$trait['endLine']] = &$this->traits[$traitName];
|
Chris@0
|
606
|
Chris@0
|
607 foreach ($trait['methods'] as $methodName => $method) {
|
Chris@0
|
608 $this->traits[$traitName]['methods'][$methodName] = array(
|
Chris@0
|
609 'methodName' => $methodName,
|
Chris@0
|
610 'signature' => $method['signature'],
|
Chris@0
|
611 'startLine' => $method['startLine'],
|
Chris@0
|
612 'endLine' => $method['endLine'],
|
Chris@0
|
613 'executableLines' => 0,
|
Chris@0
|
614 'executedLines' => 0,
|
Chris@0
|
615 'ccn' => $method['ccn'],
|
Chris@0
|
616 'coverage' => 0,
|
Chris@0
|
617 'crap' => 0,
|
Chris@0
|
618 'link' => $link . $method['startLine']
|
Chris@0
|
619 );
|
Chris@0
|
620
|
Chris@0
|
621 $this->startLines[$method['startLine']] = &$this->traits[$traitName]['methods'][$methodName];
|
Chris@0
|
622 $this->endLines[$method['endLine']] = &$this->traits[$traitName]['methods'][$methodName];
|
Chris@0
|
623 }
|
Chris@0
|
624 }
|
Chris@0
|
625 }
|
Chris@0
|
626
|
Chris@0
|
627 /**
|
Chris@0
|
628 * @param PHP_Token_Stream $tokens
|
Chris@0
|
629 */
|
Chris@0
|
630 protected function processFunctions(PHP_Token_Stream $tokens)
|
Chris@0
|
631 {
|
Chris@0
|
632 $functions = $tokens->getFunctions();
|
Chris@0
|
633 unset($tokens);
|
Chris@0
|
634
|
Chris@0
|
635 $link = $this->getId() . '.html#';
|
Chris@0
|
636
|
Chris@0
|
637 foreach ($functions as $functionName => $function) {
|
Chris@0
|
638 $this->functions[$functionName] = array(
|
Chris@0
|
639 'functionName' => $functionName,
|
Chris@0
|
640 'signature' => $function['signature'],
|
Chris@0
|
641 'startLine' => $function['startLine'],
|
Chris@0
|
642 'executableLines' => 0,
|
Chris@0
|
643 'executedLines' => 0,
|
Chris@0
|
644 'ccn' => $function['ccn'],
|
Chris@0
|
645 'coverage' => 0,
|
Chris@0
|
646 'crap' => 0,
|
Chris@0
|
647 'link' => $link . $function['startLine']
|
Chris@0
|
648 );
|
Chris@0
|
649
|
Chris@0
|
650 $this->startLines[$function['startLine']] = &$this->functions[$functionName];
|
Chris@0
|
651 $this->endLines[$function['endLine']] = &$this->functions[$functionName];
|
Chris@0
|
652 }
|
Chris@0
|
653 }
|
Chris@0
|
654
|
Chris@0
|
655 /**
|
Chris@0
|
656 * Calculates the Change Risk Anti-Patterns (CRAP) index for a unit of code
|
Chris@0
|
657 * based on its cyclomatic complexity and percentage of code coverage.
|
Chris@0
|
658 *
|
Chris@0
|
659 * @param int $ccn
|
Chris@0
|
660 * @param float $coverage
|
Chris@0
|
661 * @return string
|
Chris@0
|
662 * @since Method available since Release 1.2.0
|
Chris@0
|
663 */
|
Chris@0
|
664 protected function crap($ccn, $coverage)
|
Chris@0
|
665 {
|
Chris@0
|
666 if ($coverage == 0) {
|
Chris@0
|
667 return (string) (pow($ccn, 2) + $ccn);
|
Chris@0
|
668 }
|
Chris@0
|
669
|
Chris@0
|
670 if ($coverage >= 95) {
|
Chris@0
|
671 return (string) $ccn;
|
Chris@0
|
672 }
|
Chris@0
|
673
|
Chris@0
|
674 return sprintf(
|
Chris@0
|
675 '%01.2F',
|
Chris@0
|
676 pow($ccn, 2) * pow(1 - $coverage/100, 3) + $ccn
|
Chris@0
|
677 );
|
Chris@0
|
678 }
|
Chris@0
|
679 }
|