152 lines
5.0 KiB
PHP
152 lines
5.0 KiB
PHP
<?php
|
|
namespace Codeception\Coverage\Subscriber;
|
|
|
|
use Codeception\Configuration;
|
|
use Codeception\Coverage\Filter;
|
|
use Codeception\Event\PrintResultEvent;
|
|
use Codeception\Events;
|
|
use Codeception\Subscriber\Shared\StaticEvents;
|
|
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
|
|
|
|
class Printer implements EventSubscriberInterface
|
|
{
|
|
use StaticEvents;
|
|
|
|
public static $events = [
|
|
Events::RESULT_PRINT_AFTER => 'printResult'
|
|
];
|
|
|
|
protected $settings = [
|
|
'enabled' => true,
|
|
'low_limit' => '35',
|
|
'high_limit' => '70',
|
|
'show_uncovered' => false
|
|
];
|
|
|
|
public static $coverage;
|
|
protected $options;
|
|
protected $logDir;
|
|
protected $destination = [];
|
|
|
|
public function __construct($options)
|
|
{
|
|
$this->options = $options;
|
|
$this->logDir = Configuration::outputDir();
|
|
$this->settings = array_merge($this->settings, Configuration::config()['coverage']);
|
|
self::$coverage = new \SebastianBergmann\CodeCoverage\CodeCoverage();
|
|
|
|
// Apply filter
|
|
$filter = new Filter(self::$coverage);
|
|
$filter
|
|
->whiteList(Configuration::config())
|
|
->blackList(Configuration::config());
|
|
}
|
|
|
|
protected function absolutePath($path)
|
|
{
|
|
if ((strpos($path, '/') === 0) || (strpos($path, ':') === 1)) { // absolute path
|
|
return $path;
|
|
}
|
|
return $this->logDir . $path;
|
|
}
|
|
|
|
public function printResult(PrintResultEvent $e)
|
|
{
|
|
$printer = $e->getPrinter();
|
|
if (!$this->settings['enabled']) {
|
|
$printer->write("\nCodeCoverage is disabled in `codeception.yml` config\n");
|
|
return;
|
|
}
|
|
|
|
if (!$this->options['quiet']) {
|
|
$this->printConsole($printer);
|
|
}
|
|
$printer->write("Remote CodeCoverage reports are not printed to console\n");
|
|
$this->printPHP();
|
|
$printer->write("\n");
|
|
if ($this->options['coverage-html']) {
|
|
$this->printHtml();
|
|
$printer->write("HTML report generated in {$this->options['coverage-html']}\n");
|
|
}
|
|
if ($this->options['coverage-xml']) {
|
|
$this->printXml();
|
|
$printer->write("XML report generated in {$this->options['coverage-xml']}\n");
|
|
}
|
|
if ($this->options['coverage-text']) {
|
|
$this->printText();
|
|
$printer->write("Text report generated in {$this->options['coverage-text']}\n");
|
|
}
|
|
if ($this->options['coverage-crap4j']) {
|
|
$this->printCrap4j();
|
|
$printer->write("Crap4j report generated in {$this->options['coverage-crap4j']}\n");
|
|
}
|
|
if ($this->options['coverage-phpunit']) {
|
|
$this->printPHPUnit();
|
|
$printer->write("PHPUnit report generated in {$this->options['coverage-phpunit']}\n");
|
|
}
|
|
}
|
|
|
|
protected function printConsole(\PHPUnit\Util\Printer $printer)
|
|
{
|
|
$writer = new \SebastianBergmann\CodeCoverage\Report\Text(
|
|
$this->settings['low_limit'],
|
|
$this->settings['high_limit'],
|
|
$this->settings['show_uncovered'],
|
|
false
|
|
);
|
|
$printer->write($writer->process(self::$coverage, $this->options['colors']));
|
|
}
|
|
|
|
protected function printHtml()
|
|
{
|
|
$writer = new \SebastianBergmann\CodeCoverage\Report\Html\Facade(
|
|
$this->settings['low_limit'],
|
|
$this->settings['high_limit'],
|
|
sprintf(
|
|
', <a href="http://codeception.com">Codeception</a> and <a href="http://phpunit.de/">PHPUnit %s</a>',
|
|
\PHPUnit\Runner\Version::id()
|
|
)
|
|
);
|
|
|
|
$writer->process(self::$coverage, $this->absolutePath($this->options['coverage-html']));
|
|
}
|
|
|
|
protected function printXml()
|
|
{
|
|
$writer = new \SebastianBergmann\CodeCoverage\Report\Clover();
|
|
$writer->process(self::$coverage, $this->absolutePath($this->options['coverage-xml']));
|
|
}
|
|
|
|
protected function printPHP()
|
|
{
|
|
$writer = new \SebastianBergmann\CodeCoverage\Report\PHP;
|
|
$writer->process(self::$coverage, $this->absolutePath($this->options['coverage']));
|
|
}
|
|
|
|
protected function printText()
|
|
{
|
|
$writer = new \SebastianBergmann\CodeCoverage\Report\Text(
|
|
$this->settings['low_limit'],
|
|
$this->settings['high_limit'],
|
|
$this->settings['show_uncovered'],
|
|
false
|
|
);
|
|
file_put_contents(
|
|
$this->absolutePath($this->options['coverage-text']),
|
|
$writer->process(self::$coverage, false)
|
|
);
|
|
}
|
|
|
|
protected function printCrap4j()
|
|
{
|
|
$writer = new \SebastianBergmann\CodeCoverage\Report\Crap4j;
|
|
$writer->process(self::$coverage, $this->absolutePath($this->options['coverage-crap4j']));
|
|
}
|
|
|
|
protected function printPHPUnit()
|
|
{
|
|
$writer = new \SebastianBergmann\CodeCoverage\Report\Xml\Facade(\PHPUnit\Runner\Version::id());
|
|
$writer->process(self::$coverage, $this->absolutePath($this->options['coverage-phpunit']));
|
|
}
|
|
}
|