Skip to content

Commit

Permalink
Refactor
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastianbergmann committed Jan 17, 2023
1 parent 5c128d3 commit c409dfd
Show file tree
Hide file tree
Showing 3 changed files with 224 additions and 187 deletions.
23 changes: 22 additions & 1 deletion .psalm/baseline.xml
Expand Up @@ -416,8 +416,29 @@
<code>Driver</code>
<code>\SebastianBergmann\CodeCoverage\CodeCoverage</code>
</InvalidNullableReturnType>
<MissingThrowsDocblock occurrences="1">
<MissingThrowsDocblock occurrences="22">
<code>coverageCacheDirectory</code>
<code>coverageClover</code>
<code>coverageCobertura</code>
<code>coverageCrap4j</code>
<code>coverageHtml</code>
<code>coverageHtmlCustomCssFile</code>
<code>coveragePhp</code>
<code>coverageText</code>
<code>coverageText</code>
<code>coverageXml</code>
<code>self::codeCoverageGenerationFailed($printer, $e)</code>
<code>self::codeCoverageGenerationFailed($printer, $e)</code>
<code>self::codeCoverageGenerationFailed($printer, $e)</code>
<code>self::codeCoverageGenerationFailed($printer, $e)</code>
<code>self::codeCoverageGenerationFailed($printer, $e)</code>
<code>self::codeCoverageGenerationFailed($printer, $e)</code>
<code>self::codeCoverageGenerationSucceeded($printer)</code>
<code>self::codeCoverageGenerationSucceeded($printer)</code>
<code>self::codeCoverageGenerationSucceeded($printer)</code>
<code>self::codeCoverageGenerationSucceeded($printer)</code>
<code>self::codeCoverageGenerationSucceeded($printer)</code>
<code>self::codeCoverageGenerationSucceeded($printer)</code>
</MissingThrowsDocblock>
<NullableReturnStatement occurrences="2">
<code>self::$driver</code>
Expand Down
201 changes: 201 additions & 0 deletions src/Runner/CodeCoverage.php
Expand Up @@ -9,19 +9,34 @@
*/
namespace PHPUnit\Runner;

use function file_put_contents;
use function sprintf;
use PHPUnit\Event\Facade as EventFacade;
use PHPUnit\Event\TestData\MoreThanOneDataSetFromDataProviderException;
use PHPUnit\Event\TestData\NoDataSetFromDataProviderException;
use PHPUnit\Framework\TestCase;
use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry;
use PHPUnit\TextUI\Configuration\Configuration;
use PHPUnit\Util\Printer;
use SebastianBergmann\CodeCoverage\Driver\Driver;
use SebastianBergmann\CodeCoverage\Driver\Selector;
use SebastianBergmann\CodeCoverage\Exception as CodeCoverageException;
use SebastianBergmann\CodeCoverage\Filter;
use SebastianBergmann\CodeCoverage\Report\Clover as CloverReport;
use SebastianBergmann\CodeCoverage\Report\Cobertura as CoberturaReport;
use SebastianBergmann\CodeCoverage\Report\Crap4j as Crap4jReport;
use SebastianBergmann\CodeCoverage\Report\Html\Colors;
use SebastianBergmann\CodeCoverage\Report\Html\CustomCssFile;
use SebastianBergmann\CodeCoverage\Report\Html\Facade as HtmlReport;
use SebastianBergmann\CodeCoverage\Report\PHP as PhpReport;
use SebastianBergmann\CodeCoverage\Report\Text as TextReport;
use SebastianBergmann\CodeCoverage\Report\Thresholds;
use SebastianBergmann\CodeCoverage\Report\Xml\Facade as XmlReport;
use SebastianBergmann\CodeCoverage\Test\TestSize\TestSize;
use SebastianBergmann\CodeCoverage\Test\TestStatus\TestStatus;
use SebastianBergmann\Comparator\Comparator;
use SebastianBergmann\Timer\NoActiveTimerException;
use SebastianBergmann\Timer\Timer;

/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
Expand All @@ -32,6 +47,7 @@ final class CodeCoverage
private static ?Driver $driver = null;
private static bool $collecting = false;
private static ?TestCase $test = null;
private static ?Timer $timer = null;

public static function init(Configuration $configuration): void
{
Expand Down Expand Up @@ -166,6 +182,143 @@ public static function deactivate(): void
self::$test = null;
}

public static function generateReports(Printer $printer, Configuration $configuration): void
{
if (!self::isActive()) {
return;
}

if ($configuration->hasCoverageClover()) {
self::codeCoverageGenerationStart($printer, 'Clover XML');

try {
$writer = new CloverReport;
$writer->process(self::instance(), $configuration->coverageClover());

self::codeCoverageGenerationSucceeded($printer);

unset($writer);
} catch (CodeCoverageException $e) {
self::codeCoverageGenerationFailed($printer, $e);
}
}

if ($configuration->hasCoverageCobertura()) {
self::codeCoverageGenerationStart($printer, 'Cobertura XML');

try {
$writer = new CoberturaReport;
$writer->process(self::instance(), $configuration->coverageCobertura());

self::codeCoverageGenerationSucceeded($printer);

unset($writer);
} catch (CodeCoverageException $e) {
self::codeCoverageGenerationFailed($printer, $e);
}
}

if ($configuration->hasCoverageCrap4j()) {
self::codeCoverageGenerationStart($printer, 'Crap4J XML');

try {
$writer = new Crap4jReport($configuration->coverageCrap4jThreshold());
$writer->process(self::instance(), $configuration->coverageCrap4j());

self::codeCoverageGenerationSucceeded($printer);

unset($writer);
} catch (CodeCoverageException $e) {
self::codeCoverageGenerationFailed($printer, $e);
}
}

if ($configuration->hasCoverageHtml()) {
self::codeCoverageGenerationStart($printer, 'HTML');

try {
$customCssFile = CustomCssFile::default();

if ($configuration->hasCoverageHtmlCustomCssFile()) {
$customCssFile = CustomCssFile::from($configuration->coverageHtmlCustomCssFile());
}

$writer = new HtmlReport(
sprintf(
' and <a href="https://phpunit.de/">PHPUnit %s</a>',
Version::id()
),
Colors::from(
$configuration->coverageHtmlColorSuccessLow(),
$configuration->coverageHtmlColorSuccessMedium(),
$configuration->coverageHtmlColorSuccessHigh(),
$configuration->coverageHtmlColorWarning(),
$configuration->coverageHtmlColorDanger(),
),
Thresholds::from(
$configuration->coverageHtmlLowUpperBound(),
$configuration->coverageHtmlHighLowerBound()
),
$customCssFile
);

$writer->process(self::instance(), $configuration->coverageHtml());

self::codeCoverageGenerationSucceeded($printer);

unset($writer);
} catch (CodeCoverageException $e) {
self::codeCoverageGenerationFailed($printer, $e);
}
}

if ($configuration->hasCoveragePhp()) {
self::codeCoverageGenerationStart($printer, 'PHP');

try {
$writer = new PhpReport;
$writer->process(self::instance(), $configuration->coveragePhp());

self::codeCoverageGenerationSucceeded($printer);

unset($writer);
} catch (CodeCoverageException $e) {
self::codeCoverageGenerationFailed($printer, $e);
}
}

if ($configuration->hasCoverageText()) {
$processor = new TextReport(
Thresholds::default(),
$configuration->coverageTextShowUncoveredFiles(),
$configuration->coverageTextShowOnlySummary()
);

$textReport = $processor->process(self::instance(), $configuration->colors());

if ($configuration->coverageText() === 'php://stdout') {
$printer->print($textReport);
} else {
file_put_contents($configuration->coverageText(), $textReport);
}
}

if ($configuration->hasCoverageXml()) {
self::codeCoverageGenerationStart($printer, 'PHPUnit XML');

try {
$writer = new XmlReport(Version::id());
$writer->process(self::instance(), $configuration->coverageXml());

self::codeCoverageGenerationSucceeded($printer);

unset($writer);
} catch (CodeCoverageException $e) {
self::codeCoverageGenerationFailed($printer, $e);
}
}
}

private static function activate(Filter $filter, bool $pathCoverage): void
{
try {
Expand All @@ -185,4 +338,52 @@ private static function activate(Filter $filter, bool $pathCoverage): void
);
}
}

private static function codeCoverageGenerationStart(Printer $printer, string $format): void
{
$printer->print(
sprintf(
"\nGenerating code coverage report in %s format ... ",
$format
)
);

self::timer()->start();
}

/**
* @throws NoActiveTimerException
*/
private static function codeCoverageGenerationSucceeded(Printer $printer): void
{
$printer->print(
sprintf(
"done [%s]\n",
self::timer()->stop()->asString()
)
);
}

/**
* @throws NoActiveTimerException
*/
private static function codeCoverageGenerationFailed(Printer $printer, CodeCoverageException $e): void
{
$printer->print(
sprintf(
"failed [%s]\n%s\n",
self::timer()->stop()->asString(),
$e->getMessage()
)
);
}

private static function timer(): Timer
{
if (self::$timer === null) {
self::$timer = new Timer;
}

return self::$timer;
}
}

0 comments on commit c409dfd

Please sign in to comment.