diff options
Diffstat (limited to '3rdparty/simpletest/extensions/coverage/coverage_calculator.php')
-rw-r--r-- | 3rdparty/simpletest/extensions/coverage/coverage_calculator.php | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/3rdparty/simpletest/extensions/coverage/coverage_calculator.php b/3rdparty/simpletest/extensions/coverage/coverage_calculator.php new file mode 100644 index 00000000000..f1aa57bbab5 --- /dev/null +++ b/3rdparty/simpletest/extensions/coverage/coverage_calculator.php @@ -0,0 +1,98 @@ +<?php +/** +* @package SimpleTest +* @subpackage Extensions +*/ +/** +* @package SimpleTest +* @subpackage Extensions +*/ +class CoverageCalculator { + + function coverageByFileVariables($file, $coverage) { + $hnd = fopen($file, 'r'); + if ($hnd == null) { + throw new Exception("File $file is missing"); + } + $lines = array(); + for ($i = 1; !feof($hnd); $i++) { + $line = fgets($hnd); + $lineCoverage = $this->lineCoverageCodeToStyleClass($coverage, $i); + $lines[$i] = array('lineCoverage' => $lineCoverage, 'code' => $line); + } + + fclose($hnd); + + $var = compact('file', 'lines', 'coverage'); + return $var; + } + + function lineCoverageCodeToStyleClass($coverage, $line) { + if (!array_key_exists($line, $coverage)) { + return "comment"; + } + $code = $coverage[$line]; + if (empty($code)) { + return "comment"; + } + switch ($code) { + case -1: + return "missed"; + case -2: + return "dead"; + } + + return "covered"; + } + + function totalLoc($total, $coverage) { + return $total + sizeof($coverage); + } + + function lineCoverage($total, $line) { + # NOTE: counting dead code as covered, as it's almost always an executable line + # strange artifact of xdebug or underlying system + return $total + ($line > 0 || $line == -2 ? 1 : 0); + } + + function totalCoverage($total, $coverage) { + return $total + array_reduce($coverage, array(&$this, "lineCoverage")); + } + + static function reportFilename($filename) { + return preg_replace('|[/\\\\]|', '_', $filename) . '.html'; + } + + function percentCoverageByFile($coverage, $file, &$results) { + $byFileReport = self::reportFilename($file); + + $loc = sizeof($coverage); + if ($loc == 0) + return 0; + $lineCoverage = array_reduce($coverage, array(&$this, "lineCoverage")); + $percentage = 100 * ($lineCoverage / $loc); + $results[0][$file] = array('byFileReport' => $byFileReport, 'percentage' => $percentage); + } + + function variables($coverage, $untouched) { + $coverageByFile = array(); + array_walk($coverage, array(&$this, "percentCoverageByFile"), array(&$coverageByFile)); + + $totalLoc = array_reduce($coverage, array(&$this, "totalLoc")); + + if ($totalLoc > 0) { + $totalLinesOfCoverage = array_reduce($coverage, array(&$this, "totalCoverage")); + $totalPercentCoverage = 100 * ($totalLinesOfCoverage / $totalLoc); + } + + $untouchedPercentageDenominator = sizeof($coverage) + sizeof($untouched); + if ($untouchedPercentageDenominator > 0) { + $filesTouchedPercentage = 100 * sizeof($coverage) / $untouchedPercentageDenominator; + } + + $var = compact('coverageByFile', 'totalPercentCoverage', 'totalLoc', 'totalLinesOfCoverage', 'filesTouchedPercentage'); + $var['untouched'] = $untouched; + return $var; + } +} +?>
\ No newline at end of file |