summaryrefslogtreecommitdiffstats
path: root/3rdparty/simpletest/extensions/coverage/coverage_calculator.php
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/simpletest/extensions/coverage/coverage_calculator.php')
-rw-r--r--3rdparty/simpletest/extensions/coverage/coverage_calculator.php98
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