Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: use SebastianBergmann\Environment\Runtime; Chris@0: Chris@0: /** Chris@0: * Base class for PHP_CodeCoverage_Report_Node renderers. Chris@0: * Chris@0: * @since Class available since Release 1.1.0 Chris@0: */ Chris@0: abstract class PHP_CodeCoverage_Report_HTML_Renderer Chris@0: { Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: protected $templatePath; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: protected $generator; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: protected $date; Chris@0: Chris@0: /** Chris@0: * @var int Chris@0: */ Chris@0: protected $lowUpperBound; Chris@0: Chris@0: /** Chris@0: * @var int Chris@0: */ Chris@0: protected $highLowerBound; Chris@0: Chris@0: /** Chris@0: * @var string Chris@0: */ Chris@0: protected $version; Chris@0: Chris@0: /** Chris@0: * Constructor. Chris@0: * Chris@0: * @param string $templatePath Chris@0: * @param string $generator Chris@0: * @param string $date Chris@0: * @param int $lowUpperBound Chris@0: * @param int $highLowerBound Chris@0: */ Chris@0: public function __construct($templatePath, $generator, $date, $lowUpperBound, $highLowerBound) Chris@0: { Chris@0: $version = new SebastianBergmann\Version('2.2.4', dirname(dirname(dirname(dirname(__DIR__))))); Chris@0: Chris@0: $this->templatePath = $templatePath; Chris@0: $this->generator = $generator; Chris@0: $this->date = $date; Chris@0: $this->lowUpperBound = $lowUpperBound; Chris@0: $this->highLowerBound = $highLowerBound; Chris@0: $this->version = $version->getVersion(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param Text_Template $template Chris@0: * @param array $data Chris@0: * @return string Chris@0: */ Chris@0: protected function renderItemTemplate(Text_Template $template, array $data) Chris@0: { Chris@0: $numSeparator = ' / '; Chris@0: Chris@0: if (isset($data['numClasses']) && $data['numClasses'] > 0) { Chris@0: $classesLevel = $this->getColorLevel($data['testedClassesPercent']); Chris@0: Chris@0: $classesNumber = $data['numTestedClasses'] . $numSeparator . Chris@0: $data['numClasses']; Chris@0: Chris@0: $classesBar = $this->getCoverageBar( Chris@0: $data['testedClassesPercent'] Chris@0: ); Chris@0: } else { Chris@0: $classesLevel = 'success'; Chris@0: $classesNumber = '0' . $numSeparator . '0'; Chris@0: $classesBar = $this->getCoverageBar(100); Chris@0: } Chris@0: Chris@0: if ($data['numMethods'] > 0) { Chris@0: $methodsLevel = $this->getColorLevel($data['testedMethodsPercent']); Chris@0: Chris@0: $methodsNumber = $data['numTestedMethods'] . $numSeparator . Chris@0: $data['numMethods']; Chris@0: Chris@0: $methodsBar = $this->getCoverageBar( Chris@0: $data['testedMethodsPercent'] Chris@0: ); Chris@0: } else { Chris@0: $methodsLevel = 'success'; Chris@0: $methodsNumber = '0' . $numSeparator . '0'; Chris@0: $methodsBar = $this->getCoverageBar(100); Chris@0: $data['testedMethodsPercentAsString'] = '100.00%'; Chris@0: } Chris@0: Chris@0: if ($data['numExecutableLines'] > 0) { Chris@0: $linesLevel = $this->getColorLevel($data['linesExecutedPercent']); Chris@0: Chris@0: $linesNumber = $data['numExecutedLines'] . $numSeparator . Chris@0: $data['numExecutableLines']; Chris@0: Chris@0: $linesBar = $this->getCoverageBar( Chris@0: $data['linesExecutedPercent'] Chris@0: ); Chris@0: } else { Chris@0: $linesLevel = 'success'; Chris@0: $linesNumber = '0' . $numSeparator . '0'; Chris@0: $linesBar = $this->getCoverageBar(100); Chris@0: $data['linesExecutedPercentAsString'] = '100.00%'; Chris@0: } Chris@0: Chris@0: $template->setVar( Chris@0: array( Chris@0: 'icon' => isset($data['icon']) ? $data['icon'] : '', Chris@0: 'crap' => isset($data['crap']) ? $data['crap'] : '', Chris@0: 'name' => $data['name'], Chris@0: 'lines_bar' => $linesBar, Chris@0: 'lines_executed_percent' => $data['linesExecutedPercentAsString'], Chris@0: 'lines_level' => $linesLevel, Chris@0: 'lines_number' => $linesNumber, Chris@0: 'methods_bar' => $methodsBar, Chris@0: 'methods_tested_percent' => $data['testedMethodsPercentAsString'], Chris@0: 'methods_level' => $methodsLevel, Chris@0: 'methods_number' => $methodsNumber, Chris@0: 'classes_bar' => $classesBar, Chris@0: 'classes_tested_percent' => isset($data['testedClassesPercentAsString']) ? $data['testedClassesPercentAsString'] : '', Chris@0: 'classes_level' => $classesLevel, Chris@0: 'classes_number' => $classesNumber Chris@0: ) Chris@0: ); Chris@0: Chris@0: return $template->render(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * @param Text_Template $template Chris@0: * @param PHP_CodeCoverage_Report_Node $node Chris@0: */ Chris@0: protected function setCommonTemplateVariables(Text_Template $template, PHP_CodeCoverage_Report_Node $node) Chris@0: { Chris@0: $runtime = new Runtime; Chris@0: Chris@0: $template->setVar( Chris@0: array( Chris@0: 'id' => $node->getId(), Chris@0: 'full_path' => $node->getPath(), Chris@0: 'path_to_root' => $this->getPathToRoot($node), Chris@0: 'breadcrumbs' => $this->getBreadcrumbs($node), Chris@0: 'date' => $this->date, Chris@0: 'version' => $this->version, Chris@0: 'runtime_name' => $runtime->getName(), Chris@0: 'runtime_version' => $runtime->getVersion(), Chris@0: 'runtime_link' => $runtime->getVendorUrl(), Chris@0: 'generator' => $this->generator, Chris@0: 'low_upper_bound' => $this->lowUpperBound, Chris@0: 'high_lower_bound' => $this->highLowerBound Chris@0: ) Chris@0: ); Chris@0: } Chris@0: Chris@0: protected function getBreadcrumbs(PHP_CodeCoverage_Report_Node $node) Chris@0: { Chris@0: $breadcrumbs = ''; Chris@0: $path = $node->getPathAsArray(); Chris@0: $pathToRoot = array(); Chris@0: $max = count($path); Chris@0: Chris@0: if ($node instanceof PHP_CodeCoverage_Report_Node_File) { Chris@0: $max--; Chris@0: } Chris@0: Chris@0: for ($i = 0; $i < $max; $i++) { Chris@0: $pathToRoot[] = str_repeat('../', $i); Chris@0: } Chris@0: Chris@0: foreach ($path as $step) { Chris@0: if ($step !== $node) { Chris@0: $breadcrumbs .= $this->getInactiveBreadcrumb( Chris@0: $step, Chris@0: array_pop($pathToRoot) Chris@0: ); Chris@0: } else { Chris@0: $breadcrumbs .= $this->getActiveBreadcrumb($step); Chris@0: } Chris@0: } Chris@0: Chris@0: return $breadcrumbs; Chris@0: } Chris@0: Chris@0: protected function getActiveBreadcrumb(PHP_CodeCoverage_Report_Node $node) Chris@0: { Chris@0: $buffer = sprintf( Chris@0: '