graphs for code coverage

This commit is contained in:
tmont 2009-07-01 04:38:36 +00:00
parent 00ff9f5b61
commit a283acd7be
8 changed files with 187 additions and 1 deletions

View File

@ -0,0 +1,105 @@
<?php
class CoveragePalette extends ezcGraphPalette {
protected $elementBorderWidth = 0;
protected $fontName = 'Verdana';
protected $fontColor = '#000000';
protected $chartBackground = '#FFFFFF';
protected $dataSetSymbol = array(ezcGraph::BULLET);
protected $padding = 1;
protected $margin = 1;
protected $dataSetColor = array(
'#009900', //covered
'#990000', //uncovered
'#999999' //dead
);
}
class CoverageDriver extends ezcGraphGdDriver {
public function getDataUri() {
ob_start();
$this->render(null);
$data = ob_get_clean();
return 'data:image/png;base64,' . base64_encode($data);
}
}
class CoverageRenderer extends ezcGraphRenderer3d {
public function renderToDataUri() {
$this->finish();
$data = $this->driver->getDataUri();
$this->resetRenderer();
return $data;
}
}
class CoveragePieChart extends ezcGraphPieChart {
public function __construct() {
parent::__construct();
$this->palette = new CoveragePalette();
$this->options->font = dirname(__FILE__) . '/data/consolas.ttf';
$this->options->font->maxFontSize = 10;
$this->options->label = '%2$s (%3$.1f%%)';
$this->legend->position = ezcGraph::BOTTOM;
$this->renderer = new CoverageRenderer();
$this->renderer->options->pieChartRotation = .6;
$this->renderer->options->pieChartShadowTransparency = .7;
$this->renderer->options->pieChartShadowSize = 10;
$this->renderer->options->pieChartShadowColor = '#666666';
$this->renderer->options->moveOut = .2;
$this->renderer->options->pieChartOffset = 45;
$this->renderer->options->pieChartGleam = .1;
$this->renderer->options->pieChartGleamColor = '#000000';
$this->renderer->options->pieChartGleamBorder = 1;
$this->renderer->options->legendSymbolGleam = .4;
$this->renderer->options->legendSymbolGleamSize = .9;
$this->renderer->options->legendSymbolGleamColor = '#FFFFFF';
$this->renderer->options->symbolSize = 3.0;
$this->renderer->options->showSymbol = true;
$this->renderer->options->pieChartSymbolColor = '#66666666';
//$this->options->labelCallback = 'label_callback';
$this->driver = new CoverageDriver();
$this->driver->options->supersampling = 1;
$this->driver->options->imageFormat = IMG_PNG;
$this->title = 'Code Coverage';
$this->title->font->maxFontSize = 15;
$this->title->font->textShadow = true;
$this->title->font->textShadowOffset = 1;
$this->title->font->textShadowColor = '#CCCCCC';
}
public function renderToDataUri($width, $height, $uloc, $dloc, $cloc) {
$this->data['Code Coverage'] = new ezcGraphArrayDataSet(
array(
'Covered' => $cloc,
'Uncovered' => $uloc,
'Dead' => $dloc
)
);
$this->data['Code Coverage']->highlight['Covered'] = true;
$this->renderElements($width, $height);
return $this->renderer->renderToDataUri();
}
}
?>

View File

@ -143,6 +143,7 @@
//copy css over //copy css over
$template = dirname(__FILE__) . DIRECTORY_SEPARATOR . self::TEMPLATE_DIR . DIRECTORY_SEPARATOR; $template = dirname(__FILE__) . DIRECTORY_SEPARATOR . self::TEMPLATE_DIR . DIRECTORY_SEPARATOR;
copy($template . 'style.css', $coverageDir . DIRECTORY_SEPARATOR . 'style.css'); copy($template . 'style.css', $coverageDir . DIRECTORY_SEPARATOR . 'style.css');
copy($template . 'tunit.js', $coverageDir . DIRECTORY_SEPARATOR . 'tunit.js');
} }
private static function writeHtmlFile($sourceFile, $baseDir, $coverageDir, array $classData, array $coverageData) { private static function writeHtmlFile($sourceFile, $baseDir, $coverageDir, array $classData, array $coverageData) {
@ -177,6 +178,7 @@
$methodCoverage .= "<tr class=\"method-coverage\"><th>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"#line-$methodStartLine\">$methodDeclaration</a></th>"; $methodCoverage .= "<tr class=\"method-coverage\"><th>&nbsp;&nbsp;&nbsp;&nbsp;<a href=\"#line-$methodStartLine\">$methodDeclaration</a></th>";
$methodCoverage .= "<td class=\"coverage-ratio\" style=\"background-color: $percentageData[1]\">$methodData[cloc] / " . ($methodData['loc'] - $methodData['dloc']) . "</td>"; $methodCoverage .= "<td class=\"coverage-ratio\" style=\"background-color: $percentageData[1]\">$methodData[cloc] / " . ($methodData['loc'] - $methodData['dloc']) . "</td>";
$methodCoverage .= "<td class=\"coverage-percentage\" style=\"background-color: $percentageData[1]\">$percentageData[0]%</td></tr>\n"; $methodCoverage .= "<td class=\"coverage-percentage\" style=\"background-color: $percentageData[1]\">$percentageData[0]%</td></tr>\n";
$methodCoverage .= '<tr class="coverage-graph"><td colspan="3"><img alt="Code Coverage results" src="' . self::getDataUri($methodData['loc'], $methodData['dloc'], $methodData['cloc']) . '"/></td></tr>';
$classLoc += $methodData['loc']; $classLoc += $methodData['loc'];
$classDloc += $methodData['dloc']; $classDloc += $methodData['dloc'];
@ -188,6 +190,7 @@
$classCoverage .= "<tr class=\"class-coverage\"><th>&nbsp;&nbsp;<a href=\"#line-$classStartLine\">$class</a></th>"; $classCoverage .= "<tr class=\"class-coverage\"><th>&nbsp;&nbsp;<a href=\"#line-$classStartLine\">$class</a></th>";
$classCoverage .= "<td class=\"coverage-ratio\" style=\"background-color: $percentageData[1]\">$classCloc / " . ($classLoc - $classDloc) . "</td>"; $classCoverage .= "<td class=\"coverage-ratio\" style=\"background-color: $percentageData[1]\">$classCloc / " . ($classLoc - $classDloc) . "</td>";
$classCoverage .= "<td class=\"coverage-percentage\" style=\"background-color: $percentageData[1]\">$percentageData[0]%</td></tr>\n"; $classCoverage .= "<td class=\"coverage-percentage\" style=\"background-color: $percentageData[1]\">$percentageData[0]%</td></tr>\n";
$classCoverage .= '<tr class="coverage-graph"><td colspan="3"><img alt="Code Coverage results" src="' . self::getDataUri($classLoc, $classDloc, $classCloc) . '"/></td></tr>';
$classCoverage .= $methodCoverage; $classCoverage .= $methodCoverage;
} }
@ -199,6 +202,7 @@
$fileCoverage = "<tr class=\"file-coverage\"><th>$sourceFile</th>"; $fileCoverage = "<tr class=\"file-coverage\"><th>$sourceFile</th>";
$fileCoverage .= "<td class=\"coverage-percentage\" style=\"background-color: $percentageData[1]\">$tcloc / " . ($tloc - $tdloc) . "</td>"; $fileCoverage .= "<td class=\"coverage-percentage\" style=\"background-color: $percentageData[1]\">$tcloc / " . ($tloc - $tdloc) . "</td>";
$fileCoverage .= "<td class=\"coverage-ratio\" style=\"background-color: $percentageData[1]\">$percentageData[0]%</td></tr>\n"; $fileCoverage .= "<td class=\"coverage-ratio\" style=\"background-color: $percentageData[1]\">$percentageData[0]%</td></tr>\n";
$fileCoverage .= '<tr class="coverage-graph"><td colspan="3"><img alt="Code Coverage results" src="' . self::getDataUri($tloc, $tdloc, $tcloc) . '"/></td></tr>';
$fileCoverage .= $classCoverage; $fileCoverage .= $classCoverage;
unset($classCoverage, $methodCoverage, $classData, $refClass); unset($classCoverage, $methodCoverage, $classData, $refClass);
@ -440,6 +444,11 @@
return $color; return $color;
} }
private static function getDataUri($loc, $dloc, $cloc) {
$graph = new CoveragePieChart();
return $graph->renderToDataUri(300, 225, $loc - $cloc - $dloc, $dloc, $cloc);
}
} }
?> ?>

Binary file not shown.

View File

@ -6,6 +6,7 @@
<title>${title}</title> <title>${title}</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/> <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" href="./style.css"/> <link rel="stylesheet" type="text/css" href="./style.css"/>
<script type="text/javascript" src="./tunit.js"></script>
</head> </head>
<body> <body>

View File

@ -6,6 +6,7 @@
<title>${title}</title> <title>${title}</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/> <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<link rel="stylesheet" type="text/css" href="./style.css"/> <link rel="stylesheet" type="text/css" href="./style.css"/>
<script type="text/javascript" src="./tunit.js"></script>
</head> </head>
<body> <body>

View File

@ -88,6 +88,9 @@ thead th {
color: #000000; color: #000000;
} }
.coverage-graph td {
text-align: center;
}
.coverage-percentage { .coverage-percentage {
text-align: center; text-align: center;
} }

View File

@ -0,0 +1,63 @@
(function(){
var addEvent = function(evt, func, node) {
node = node || window;
if (node.addEventListener) {
node.addEventListener(evt, func, true);
} else if (node.attachEvent) {
node.attachEvent("on" + evt, func);
}
}
var getElementsByClass = function(cls, root, tag) {
root = root || document;
tag = tag || "*";
var els = root.getElementsByTagName(tag), len = els.length, i, retval = [];
var regex = new RegExp("(^|\\s)" + cls + "($|\\s)", "i");
for (i = 0; i < len; i++) {
if (els[i].className.match(regex) != null)
retval.push(els[i]);
}
return retval;
}
var init = function() {
var graphs = getElementsByClass("coverage-graph", document.getElementById("summary"), "tr");
for (var i = 0, len = graphs.length, toggler; i < len; i++) {
toggler = graphs[i].previousSibling.previousSibling;
toggler.style.cursor = "pointer";
toggler.onmouseover = function() {
var child = this.firstChild;
do {
if (child.nodeName === "TD" || child.nodeName === "TH") {
child.style.backgroundColor = "#990099";
child.style.color = "#FFFFFF";
}
} while (child = child.nextSibling);
}
toggler.onmouseout = function() {
var child = this.firstChild;
do {
if (child.nodeName === "TD" || child.nodeName === "TH") {
child.style.backgroundColor = "";
child.style.color = "";
}
} while (child = child.nextSibling);
}
toggler.onclick = function() {
var display = this.nextSibling.nextSibling.style.display;
this.nextSibling.nextSibling.style.display = (display === "none") ? "table-row" : "none";
}
graphs[i].style.display = "none";
}
}
addEvent("load", init);
}());

View File

@ -3,7 +3,7 @@
/** /**
* Autoload manifest * Autoload manifest
* *
* Autogenerated by manifester.php on 2009-06-30 01:05:55 * Autogenerated by manifester.php on 2009-06-30 20:59:11
* *
* @package TUnit * @package TUnit
* @version 0.5.0 * @version 0.5.0
@ -20,7 +20,11 @@
'ConsoleListener' => 'TUnit/framework/listeners/ConsoleListener.php', 'ConsoleListener' => 'TUnit/framework/listeners/ConsoleListener.php',
'ConsoleTestRunner' => 'TUnit/framework/ConsoleTestRunner.php', 'ConsoleTestRunner' => 'TUnit/framework/ConsoleTestRunner.php',
'Constraint' => 'TUnit/framework/constraints/Constraint.php', 'Constraint' => 'TUnit/framework/constraints/Constraint.php',
'CoverageDriver' => 'TUnit/framework/reporting/CoveragePieChart.php',
'CoverageFilter' => 'TUnit/framework/reporting/CoverageFilter.php', 'CoverageFilter' => 'TUnit/framework/reporting/CoverageFilter.php',
'CoveragePalette' => 'TUnit/framework/reporting/CoveragePieChart.php',
'CoveragePieChart' => 'TUnit/framework/reporting/CoveragePieChart.php',
'CoverageRenderer' => 'TUnit/framework/reporting/CoveragePieChart.php',
'CoverageReporter' => 'TUnit/framework/reporting/CoverageReporter.php', 'CoverageReporter' => 'TUnit/framework/reporting/CoverageReporter.php',
'DefaultConstraint' => 'TUnit/framework/constraints/DefaultConstraint.php', 'DefaultConstraint' => 'TUnit/framework/constraints/DefaultConstraint.php',
'EmptyConstraint' => 'TUnit/framework/constraints/SimpleConstraints.php', 'EmptyConstraint' => 'TUnit/framework/constraints/SimpleConstraints.php',