annotate vendor/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.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 use SebastianBergmann\Environment\Runtime;
Chris@0 12
Chris@0 13 /**
Chris@0 14 * Base class for PHP_CodeCoverage_Report_Node renderers.
Chris@0 15 *
Chris@0 16 * @since Class available since Release 1.1.0
Chris@0 17 */
Chris@0 18 abstract class PHP_CodeCoverage_Report_HTML_Renderer
Chris@0 19 {
Chris@0 20 /**
Chris@0 21 * @var string
Chris@0 22 */
Chris@0 23 protected $templatePath;
Chris@0 24
Chris@0 25 /**
Chris@0 26 * @var string
Chris@0 27 */
Chris@0 28 protected $generator;
Chris@0 29
Chris@0 30 /**
Chris@0 31 * @var string
Chris@0 32 */
Chris@0 33 protected $date;
Chris@0 34
Chris@0 35 /**
Chris@0 36 * @var int
Chris@0 37 */
Chris@0 38 protected $lowUpperBound;
Chris@0 39
Chris@0 40 /**
Chris@0 41 * @var int
Chris@0 42 */
Chris@0 43 protected $highLowerBound;
Chris@0 44
Chris@0 45 /**
Chris@0 46 * @var string
Chris@0 47 */
Chris@0 48 protected $version;
Chris@0 49
Chris@0 50 /**
Chris@0 51 * Constructor.
Chris@0 52 *
Chris@0 53 * @param string $templatePath
Chris@0 54 * @param string $generator
Chris@0 55 * @param string $date
Chris@0 56 * @param int $lowUpperBound
Chris@0 57 * @param int $highLowerBound
Chris@0 58 */
Chris@0 59 public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound)
Chris@0 60 {
Chris@0 61 $version = new SebastianBergmann\Version('2.2.4', dirname(dirname(dirname(dirname(__DIR__)))));
Chris@0 62
Chris@0 63 $this->templatePath = $templatePath;
Chris@0 64 $this->generator = $generator;
Chris@0 65 $this->date = $date;
Chris@0 66 $this->lowUpperBound = $lowUpperBound;
Chris@0 67 $this->highLowerBound = $highLowerBound;
Chris@0 68 $this->version = $version->getVersion();
Chris@0 69 }
Chris@0 70
Chris@0 71 /**
Chris@0 72 * @param Text_Template $template
Chris@0 73 * @param array $data
Chris@0 74 * @return string
Chris@0 75 */
Chris@0 76 protected function renderItemTemplate(Text_Template $template, array $data)
Chris@0 77 {
Chris@0 78 $numSeparator = '&nbsp;/&nbsp;';
Chris@0 79
Chris@0 80 if (isset($data['numClasses']) && $data['numClasses'] > 0) {
Chris@0 81 $classesLevel = $this->getColorLevel($data['testedClassesPercent']);
Chris@0 82
Chris@0 83 $classesNumber = $data['numTestedClasses'] . $numSeparator .
Chris@0 84 $data['numClasses'];
Chris@0 85
Chris@0 86 $classesBar = $this->getCoverageBar(
Chris@0 87 $data['testedClassesPercent']
Chris@0 88 );
Chris@0 89 } else {
Chris@0 90 $classesLevel = 'success';
Chris@0 91 $classesNumber = '0' . $numSeparator . '0';
Chris@0 92 $classesBar = $this->getCoverageBar(100);
Chris@0 93 }
Chris@0 94
Chris@0 95 if ($data['numMethods'] > 0) {
Chris@0 96 $methodsLevel = $this->getColorLevel($data['testedMethodsPercent']);
Chris@0 97
Chris@0 98 $methodsNumber = $data['numTestedMethods'] . $numSeparator .
Chris@0 99 $data['numMethods'];
Chris@0 100
Chris@0 101 $methodsBar = $this->getCoverageBar(
Chris@0 102 $data['testedMethodsPercent']
Chris@0 103 );
Chris@0 104 } else {
Chris@0 105 $methodsLevel = 'success';
Chris@0 106 $methodsNumber = '0' . $numSeparator . '0';
Chris@0 107 $methodsBar = $this->getCoverageBar(100);
Chris@0 108 $data['testedMethodsPercentAsString'] = '100.00%';
Chris@0 109 }
Chris@0 110
Chris@0 111 if ($data['numExecutableLines'] > 0) {
Chris@0 112 $linesLevel = $this->getColorLevel($data['linesExecutedPercent']);
Chris@0 113
Chris@0 114 $linesNumber = $data['numExecutedLines'] . $numSeparator .
Chris@0 115 $data['numExecutableLines'];
Chris@0 116
Chris@0 117 $linesBar = $this->getCoverageBar(
Chris@0 118 $data['linesExecutedPercent']
Chris@0 119 );
Chris@0 120 } else {
Chris@0 121 $linesLevel = 'success';
Chris@0 122 $linesNumber = '0' . $numSeparator . '0';
Chris@0 123 $linesBar = $this->getCoverageBar(100);
Chris@0 124 $data['linesExecutedPercentAsString'] = '100.00%';
Chris@0 125 }
Chris@0 126
Chris@0 127 $template->setVar(
Chris@0 128 array(
Chris@0 129 'icon' => isset($data['icon']) ? $data['icon'] : '',
Chris@0 130 'crap' => isset($data['crap']) ? $data['crap'] : '',
Chris@0 131 'name' => $data['name'],
Chris@0 132 'lines_bar' => $linesBar,
Chris@0 133 'lines_executed_percent' => $data['linesExecutedPercentAsString'],
Chris@0 134 'lines_level' => $linesLevel,
Chris@0 135 'lines_number' => $linesNumber,
Chris@0 136 'methods_bar' => $methodsBar,
Chris@0 137 'methods_tested_percent' => $data['testedMethodsPercentAsString'],
Chris@0 138 'methods_level' => $methodsLevel,
Chris@0 139 'methods_number' => $methodsNumber,
Chris@0 140 'classes_bar' => $classesBar,
Chris@0 141 'classes_tested_percent' => isset($data['testedClassesPercentAsString']) ? $data['testedClassesPercentAsString'] : '',
Chris@0 142 'classes_level' => $classesLevel,
Chris@0 143 'classes_number' => $classesNumber
Chris@0 144 )
Chris@0 145 );
Chris@0 146
Chris@0 147 return $template->render();
Chris@0 148 }
Chris@0 149
Chris@0 150 /**
Chris@0 151 * @param Text_Template $template
Chris@0 152 * @param PHP_CodeCoverage_Report_Node $node
Chris@0 153 */
Chris@0 154 protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeCoverage_Report_Node $node)
Chris@0 155 {
Chris@0 156 $runtime = new Runtime;
Chris@0 157
Chris@0 158 $template->setVar(
Chris@0 159 array(
Chris@0 160 'id' => $node->getId(),
Chris@0 161 'full_path' => $node->getPath(),
Chris@0 162 'path_to_root' => $this->getPathToRoot($node),
Chris@0 163 'breadcrumbs' => $this->getBreadcrumbs($node),
Chris@0 164 'date' => $this->date,
Chris@0 165 'version' => $this->version,
Chris@0 166 'runtime_name' => $runtime->getName(),
Chris@0 167 'runtime_version' => $runtime->getVersion(),
Chris@0 168 'runtime_link' => $runtime->getVendorUrl(),
Chris@0 169 'generator' => $this->generator,
Chris@0 170 'low_upper_bound' => $this->lowUpperBound,
Chris@0 171 'high_lower_bound' => $this->highLowerBound
Chris@0 172 )
Chris@0 173 );
Chris@0 174 }
Chris@0 175
Chris@0 176 protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node)
Chris@0 177 {
Chris@0 178 $breadcrumbs = '';
Chris@0 179 $path = $node->getPathAsArray();
Chris@0 180 $pathToRoot = array();
Chris@0 181 $max = count($path);
Chris@0 182
Chris@0 183 if ($node instanceof PHP_CodeCoverage_Report_Node_File) {
Chris@0 184 $max--;
Chris@0 185 }
Chris@0 186
Chris@0 187 for ($i = 0; $i < $max; $i++) {
Chris@0 188 $pathToRoot[] = str_repeat('../', $i);
Chris@0 189 }
Chris@0 190
Chris@0 191 foreach ($path as $step) {
Chris@0 192 if ($step !== $node) {
Chris@0 193 $breadcrumbs .= $this->getInactiveBreadcrumb(
Chris@0 194 $step,
Chris@0 195 array_pop($pathToRoot)
Chris@0 196 );
Chris@0 197 } else {
Chris@0 198 $breadcrumbs .= $this->getActiveBreadcrumb($step);
Chris@0 199 }
Chris@0 200 }
Chris@0 201
Chris@0 202 return $breadcrumbs;
Chris@0 203 }
Chris@0 204
Chris@0 205 protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node)
Chris@0 206 {
Chris@0 207 $buffer = sprintf(
Chris@0 208 ' <li class="active">%s</li>' . "\n",
Chris@0 209 $node->getName()
Chris@0 210 );
Chris@0 211
Chris@0 212 if ($node instanceof PHP_CodeCoverage_Report_Node_Directory) {
Chris@0 213 $buffer .= ' <li>(<a href="dashboard.html">Dashboard</a>)</li>' . "\n";
Chris@0 214 }
Chris@0 215
Chris@0 216 return $buffer;
Chris@0 217 }
Chris@0 218
Chris@0 219 protected function getInactiveBreadcrumb(PHP_CodeCoverage_Report_Node $node, $pathToRoot)
Chris@0 220 {
Chris@0 221 return sprintf(
Chris@0 222 ' <li><a href="%sindex.html">%s</a></li>' . "\n",
Chris@0 223 $pathToRoot,
Chris@0 224 $node->getName()
Chris@0 225 );
Chris@0 226 }
Chris@0 227
Chris@0 228 protected function getPathToRoot(PHP_CodeCoverage_Report_Node $node)
Chris@0 229 {
Chris@0 230 $id = $node->getId();
Chris@0 231 $depth = substr_count($id, '/');
Chris@0 232
Chris@0 233 if ($id != 'index' &&
Chris@0 234 $node instanceof PHP_CodeCoverage_Report_Node_Directory) {
Chris@0 235 $depth++;
Chris@0 236 }
Chris@0 237
Chris@0 238 return str_repeat('../', $depth);
Chris@0 239 }
Chris@0 240
Chris@0 241 protected function getCoverageBar($percent)
Chris@0 242 {
Chris@0 243 $level = $this->getColorLevel($percent);
Chris@0 244
Chris@0 245 $template = new Text_Template(
Chris@0 246 $this->templatePath . 'coverage_bar.html',
Chris@0 247 '{{',
Chris@0 248 '}}'
Chris@0 249 );
Chris@0 250
Chris@0 251 $template->setVar(array('level' => $level, 'percent' => sprintf('%.2F', $percent)));
Chris@0 252
Chris@0 253 return $template->render();
Chris@0 254 }
Chris@0 255
Chris@0 256 /**
Chris@0 257 * @param int $percent
Chris@0 258 * @return string
Chris@0 259 */
Chris@0 260 protected function getColorLevel($percent)
Chris@0 261 {
Chris@0 262 if ($percent <= $this->lowUpperBound) {
Chris@0 263 return 'danger';
Chris@0 264 } elseif ($percent > $this->lowUpperBound &&
Chris@0 265 $percent < $this->highLowerBound) {
Chris@0 266 return 'warning';
Chris@0 267 } else {
Chris@0 268 return 'success';
Chris@0 269 }
Chris@0 270 }
Chris@0 271 }