/** * @param Pyrus\Developer\CodeCoverage\SourceFile $source * @param string $istest path to test file this is covering, or false for aggregate */ function render(SourceFile $source, $istest = false) { $output = new \XMLWriter(); if (!$output->openUri('php://output')) { throw new Exception('Cannot render ' . $source->shortName() . ', opening XML failed'); } $output->setIndent(false); $output->startElement('html'); $output->text("\n "); $output->startElement('head'); $output->text("\n "); if ($istest) { $output->writeElement('title', 'Code Coverage for ' . $source->shortName() . ' in ' . str_replace($source->testpath() . DIRECTORY_SEPARATOR, '', $istest)); } else { $output->writeElement('title', 'Code Coverage for ' . $source->shortName()); } $output->text("\n "); $output->startElement('link'); $output->writeAttribute('href', 'cover.css'); $output->writeAttribute('rel', 'stylesheet'); $output->writeAttribute('type', 'text/css'); $output->endElement(); $output->text("\n "); $output->endElement(); $output->text("\n "); $output->startElement('body'); $output->text("\n "); $this->logoutLink($output); if ($istest) { $output->writeElement('h2', 'Code Coverage for ' . $source->shortName() . ' in ' . str_replace($source->testpath() . DIRECTORY_SEPARATOR, '', $istest)); } else { $output->writeElement('h2', 'Code Coverage for ' . $source->shortName()); } $output->text("\n "); $output->writeElement('h3', 'Coverage: ' . $source->coveragePercentage() . '% (Covered lines / Executable lines)'); $info = $source->coverageInfo(); $sourceCode = $source->source(); $total = count($sourceCode); $output->writeRaw('<p><strong>' . $total . '</strong> total lines, of which <strong>' . $info[1] . '</strong> are executable, <strong>' . $info[2] . '</strong> are dead and <strong>' . ($total - $info[2] - $info[1]) . '</strong> are non-executable lines</p>'); $output->writeRaw('<p>Of those <strong>' . $info[1] . '</strong> executable lines there are <strong>' . $info[0] . '</strong> lines covered with tests and <strong>' . ($info[1] - $info[0]) . '</strong> lack coverage</p>'); $output->text("\n "); $output->startElement('p'); $output->startElement('a'); $output->writeAttribute('href', $this->controller->getTOCLink()); $output->text('Aggregate Code Coverage for all tests'); $output->endElement(); $output->endElement(); $output->startElement('pre'); foreach ($sourceCode as $num => $line) { $coverage = $source->coverage($num); $output->startElement('span'); $output->writeAttribute('class', 'ln'); $output->text(str_pad($num, 8, ' ', STR_PAD_LEFT)); $output->endElement(); if ($coverage === false) { $output->text(str_pad(': ', 13, ' ', STR_PAD_LEFT) . $line); continue; } $output->startElement('span'); $cov = is_array($coverage) ? $coverage['coverage'] : $coverage; if ($cov === -2) { $output->writeAttribute('class', 'dead'); $output->text(' '); } elseif ($cov < 1) { $output->writeAttribute('class', 'nc'); $output->text(' '); } else { $output->writeAttribute('class', 'cv'); if (!$istest) { $output->startElement('a'); $output->writeAttribute('href', $this->getLineLink($source->name(), $num)); } $text = is_string($coverage) ? $coverage : $coverage['link']; $output->text(str_pad($text, 10, ' ', STR_PAD_LEFT) . ' '); if (!$istest) { $output->endElement(); } } $output->text(': ' . $line); $output->endElement(); } $output->endElement(); $output->text("\n "); $output->endElement(); $output->text("\n "); $output->endElement(); $output->endDocument(); }
/** * @param Pyrus\Developer\CodeCoverage\SourceFile $source * @param string $istest path to test file this is covering, or false for aggregate */ function render(SourceFile $source, $istest = false) { $output = new \XMLWriter(); if (!$output->openUri('php://output')) { throw new Exception('Cannot render ' . $source->shortName() . ', opening XML failed'); } $output->setIndent(false); $output->startElement('html'); $output->text("\n "); $output->startElement('head'); $output->text("\n "); if ($istest) { $output->writeElement('title', 'Code Coverage for ' . $source->shortName() . ' in ' . str_replace($source->testpath() . DIRECTORY_SEPARATOR, '', $istest)); } else { $output->writeElement('title', 'Code Coverage for ' . $source->shortName()); } $output->text("\n "); $output->startElement('link'); $output->writeAttribute('href', 'cover.css'); $output->writeAttribute('rel', 'stylesheet'); $output->writeAttribute('type', 'text/css'); $output->endElement(); $output->text("\n "); $output->endElement(); $output->text("\n "); $output->startElement('body'); $output->text("\n "); $this->logoutLink($output); if ($istest) { $output->writeElement('h2', 'Code Coverage for ' . $source->shortName() . ' in ' . str_replace($source->testpath() . DIRECTORY_SEPARATOR, '', $istest)); } else { $output->writeElement('h2', 'Code Coverage for ' . $source->shortName()); } $output->text("\n "); $output->writeElement('h3', 'Coverage: ' . $source->coveragePercentage() . '%'); $info = $source->coverageInfo(); $output->writeElement('h3', 'Total lines: ' . $info[1] . ', Covered lines: ' . $info[0]); $output->text("\n "); $output->startElement('p'); $output->startElement('a'); $output->writeAttribute('href', $this->controller->getTOCLink()); $output->text('Aggregate Code Coverage for all tests'); $output->endElement(); $output->endElement(); $output->startElement('pre'); foreach ($source->source() as $num => $line) { $coverage = $source->coverage($num); $output->startElement('span'); $output->writeAttribute('class', 'ln'); $output->text(str_pad($num, 8, ' ', STR_PAD_LEFT)); $output->endElement(); if ($coverage === false) { $output->text(str_pad(': ', 13, ' ', STR_PAD_LEFT) . $line); continue; } $output->startElement('span'); if ($coverage < 1) { $output->writeAttribute('class', 'nc'); $output->text(' '); } else { $output->writeAttribute('class', 'cv'); if (!$istest) { $output->startElement('a'); $output->writeAttribute('href', $this->getLineLink($source->name(), $num)); } $output->text(str_pad($coverage, 10, ' ', STR_PAD_LEFT) . ' '); if (!$istest) { $output->endElement(); } } $output->text(': ' . $line); $output->endElement(); } $output->endElement(); $output->text("\n "); $output->endElement(); $output->text("\n "); $output->endElement(); $output->endDocument(); }