annotate vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/File.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children
rev   line source
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 }