class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard in Zircon Profile 8
Same name and namespace in other branches
- 8.0 vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php \PHP_CodeCoverage_Report_HTML_Renderer_Dashboard
Renders the dashboard for a PHP_CodeCoverage_Report_Node_Directory node.
@since Class available since Release 1.1.0
Hierarchy
Expanded class hierarchy of PHP_CodeCoverage_Report_HTML_Renderer_Dashboard
File
- vendor/
phpunit/ php-code-coverage/ src/ CodeCoverage/ Report/ HTML/ Renderer/ Dashboard.php, line 16
View source
class PHP_CodeCoverage_Report_HTML_Renderer_Dashboard extends PHP_CodeCoverage_Report_HTML_Renderer {
/**
* @param PHP_CodeCoverage_Report_Node_Directory $node
* @param string $file
*/
public function render(PHP_CodeCoverage_Report_Node_Directory $node, $file) {
$classes = $node
->getClassesAndTraits();
$template = new Text_Template($this->templatePath . 'dashboard.html', '{{', '}}');
$this
->setCommonTemplateVariables($template, $node);
$baseLink = $node
->getId() . '/';
$complexity = $this
->complexity($classes, $baseLink);
$coverageDistribution = $this
->coverageDistribution($classes);
$insufficientCoverage = $this
->insufficientCoverage($classes, $baseLink);
$projectRisks = $this
->projectRisks($classes, $baseLink);
$template
->setVar(array(
'insufficient_coverage_classes' => $insufficientCoverage['class'],
'insufficient_coverage_methods' => $insufficientCoverage['method'],
'project_risks_classes' => $projectRisks['class'],
'project_risks_methods' => $projectRisks['method'],
'complexity_class' => $complexity['class'],
'complexity_method' => $complexity['method'],
'class_coverage_distribution' => $coverageDistribution['class'],
'method_coverage_distribution' => $coverageDistribution['method'],
));
$template
->renderTo($file);
}
/**
* Returns the data for the Class/Method Complexity charts.
*
* @param array $classes
* @param string $baseLink
* @return array
*/
protected function complexity(array $classes, $baseLink) {
$result = array(
'class' => array(),
'method' => array(),
);
foreach ($classes as $className => $class) {
foreach ($class['methods'] as $methodName => $method) {
if ($className != '*') {
$methodName = $className . '::' . $methodName;
}
$result['method'][] = array(
$method['coverage'],
$method['ccn'],
sprintf('<a href="%s">%s</a>', str_replace($baseLink, '', $method['link']), $methodName),
);
}
$result['class'][] = array(
$class['coverage'],
$class['ccn'],
sprintf('<a href="%s">%s</a>', str_replace($baseLink, '', $class['link']), $className),
);
}
return array(
'class' => json_encode($result['class']),
'method' => json_encode($result['method']),
);
}
/**
* Returns the data for the Class / Method Coverage Distribution chart.
*
* @param array $classes
* @return array
*/
protected function coverageDistribution(array $classes) {
$result = array(
'class' => array(
'0%' => 0,
'0-10%' => 0,
'10-20%' => 0,
'20-30%' => 0,
'30-40%' => 0,
'40-50%' => 0,
'50-60%' => 0,
'60-70%' => 0,
'70-80%' => 0,
'80-90%' => 0,
'90-100%' => 0,
'100%' => 0,
),
'method' => array(
'0%' => 0,
'0-10%' => 0,
'10-20%' => 0,
'20-30%' => 0,
'30-40%' => 0,
'40-50%' => 0,
'50-60%' => 0,
'60-70%' => 0,
'70-80%' => 0,
'80-90%' => 0,
'90-100%' => 0,
'100%' => 0,
),
);
foreach ($classes as $class) {
foreach ($class['methods'] as $methodName => $method) {
if ($method['coverage'] == 0) {
$result['method']['0%']++;
}
elseif ($method['coverage'] == 100) {
$result['method']['100%']++;
}
else {
$key = floor($method['coverage'] / 10) * 10;
$key = $key . '-' . ($key + 10) . '%';
$result['method'][$key]++;
}
}
if ($class['coverage'] == 0) {
$result['class']['0%']++;
}
elseif ($class['coverage'] == 100) {
$result['class']['100%']++;
}
else {
$key = floor($class['coverage'] / 10) * 10;
$key = $key . '-' . ($key + 10) . '%';
$result['class'][$key]++;
}
}
return array(
'class' => json_encode(array_values($result['class'])),
'method' => json_encode(array_values($result['method'])),
);
}
/**
* Returns the classes / methods with insufficient coverage.
*
* @param array $classes
* @param string $baseLink
* @return array
*/
protected function insufficientCoverage(array $classes, $baseLink) {
$leastTestedClasses = array();
$leastTestedMethods = array();
$result = array(
'class' => '',
'method' => '',
);
foreach ($classes as $className => $class) {
foreach ($class['methods'] as $methodName => $method) {
if ($method['coverage'] < $this->highLowerBound) {
if ($className != '*') {
$key = $className . '::' . $methodName;
}
else {
$key = $methodName;
}
$leastTestedMethods[$key] = $method['coverage'];
}
}
if ($class['coverage'] < $this->highLowerBound) {
$leastTestedClasses[$className] = $class['coverage'];
}
}
asort($leastTestedClasses);
asort($leastTestedMethods);
foreach ($leastTestedClasses as $className => $coverage) {
$result['class'] .= sprintf(' <tr><td><a href="%s">%s</a></td><td class="text-right">%d%%</td></tr>' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, $coverage);
}
foreach ($leastTestedMethods as $methodName => $coverage) {
list($class, $method) = explode('::', $methodName);
$result['method'] .= sprintf(' <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d%%</td></tr>' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, $coverage);
}
return $result;
}
/**
* Returns the project risks according to the CRAP index.
*
* @param array $classes
* @param string $baseLink
* @return array
*/
protected function projectRisks(array $classes, $baseLink) {
$classRisks = array();
$methodRisks = array();
$result = array(
'class' => '',
'method' => '',
);
foreach ($classes as $className => $class) {
foreach ($class['methods'] as $methodName => $method) {
if ($method['coverage'] < $this->highLowerBound && $method['ccn'] > 1) {
if ($className != '*') {
$key = $className . '::' . $methodName;
}
else {
$key = $methodName;
}
$methodRisks[$key] = $method['crap'];
}
}
if ($class['coverage'] < $this->highLowerBound && $class['ccn'] > count($class['methods'])) {
$classRisks[$className] = $class['crap'];
}
}
arsort($classRisks);
arsort($methodRisks);
foreach ($classRisks as $className => $crap) {
$result['class'] .= sprintf(' <tr><td><a href="%s">%s</a></td><td class="text-right">%d</td></tr>' . "\n", str_replace($baseLink, '', $classes[$className]['link']), $className, $crap);
}
foreach ($methodRisks as $methodName => $crap) {
list($class, $method) = explode('::', $methodName);
$result['method'] .= sprintf(' <tr><td><a href="%s"><abbr title="%s">%s</abbr></a></td><td class="text-right">%d</td></tr>' . "\n", str_replace($baseLink, '', $classes[$class]['methods'][$method]['link']), $methodName, $method, $crap);
}
return $result;
}
protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node) {
return sprintf(' <li><a href="index.html">%s</a></li>' . "\n" . ' <li class="active">(Dashboard)</li>' . "\n", $node
->getName());
}
}