mirror of
https://github.com/pestphp/pest.git
synced 2026-03-06 07:47:22 +01:00
feat: option to coverage
This commit is contained in:
@ -27,6 +27,11 @@ final class Coverage implements AddsOutput, HandlesArguments
|
|||||||
*/
|
*/
|
||||||
private const MIN_OPTION = 'min';
|
private const MIN_OPTION = 'min';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private const EXACTLY_OPTION = 'exactly';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether it should show the coverage or not.
|
* Whether it should show the coverage or not.
|
||||||
*/
|
*/
|
||||||
@ -37,6 +42,11 @@ final class Coverage implements AddsOutput, HandlesArguments
|
|||||||
*/
|
*/
|
||||||
public float $coverageMin = 0.0;
|
public float $coverageMin = 0.0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The exactly coverage.
|
||||||
|
*/
|
||||||
|
public ?float $coverageExactly = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new Plugin instance.
|
* Creates a new Plugin instance.
|
||||||
*/
|
*/
|
||||||
@ -51,7 +61,7 @@ final class Coverage implements AddsOutput, HandlesArguments
|
|||||||
public function handleArguments(array $originals): array
|
public function handleArguments(array $originals): array
|
||||||
{
|
{
|
||||||
$arguments = [...[''], ...array_values(array_filter($originals, function (string $original): bool {
|
$arguments = [...[''], ...array_values(array_filter($originals, function (string $original): bool {
|
||||||
foreach ([self::COVERAGE_OPTION, self::MIN_OPTION] as $option) {
|
foreach ([self::COVERAGE_OPTION, self::MIN_OPTION, self::EXACTLY_OPTION] as $option) {
|
||||||
if ($original === sprintf('--%s', $option)) {
|
if ($original === sprintf('--%s', $option)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -73,6 +83,7 @@ final class Coverage implements AddsOutput, HandlesArguments
|
|||||||
$inputs = [];
|
$inputs = [];
|
||||||
$inputs[] = new InputOption(self::COVERAGE_OPTION, null, InputOption::VALUE_NONE);
|
$inputs[] = new InputOption(self::COVERAGE_OPTION, null, InputOption::VALUE_NONE);
|
||||||
$inputs[] = new InputOption(self::MIN_OPTION, null, InputOption::VALUE_REQUIRED);
|
$inputs[] = new InputOption(self::MIN_OPTION, null, InputOption::VALUE_REQUIRED);
|
||||||
|
$inputs[] = new InputOption(self::EXACTLY_OPTION, null, InputOption::VALUE_REQUIRED);
|
||||||
|
|
||||||
$input = new ArgvInput($arguments, new InputDefinition($inputs));
|
$input = new ArgvInput($arguments, new InputDefinition($inputs));
|
||||||
if ((bool) $input->getOption(self::COVERAGE_OPTION)) {
|
if ((bool) $input->getOption(self::COVERAGE_OPTION)) {
|
||||||
@ -106,6 +117,13 @@ final class Coverage implements AddsOutput, HandlesArguments
|
|||||||
$this->coverageMin = (float) $minOption;
|
$this->coverageMin = (float) $minOption;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($input->getOption(self::EXACTLY_OPTION) !== null) {
|
||||||
|
/** @var int|float $exactlyOption */
|
||||||
|
$exactlyOption = $input->getOption(self::EXACTLY_OPTION);
|
||||||
|
|
||||||
|
$this->coverageExactly = (float) $exactlyOption;
|
||||||
|
}
|
||||||
|
|
||||||
return $originals;
|
return $originals;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -127,10 +145,22 @@ final class Coverage implements AddsOutput, HandlesArguments
|
|||||||
}
|
}
|
||||||
|
|
||||||
$coverage = \Pest\Support\Coverage::report($this->output);
|
$coverage = \Pest\Support\Coverage::report($this->output);
|
||||||
|
|
||||||
$exitCode = (int) ($coverage < $this->coverageMin);
|
$exitCode = (int) ($coverage < $this->coverageMin);
|
||||||
|
|
||||||
|
if ($exitCode === 0 && $this->coverageExactly !== null) {
|
||||||
|
$comparableCoverage = $this->computeComparableCoverage($coverage);
|
||||||
|
$comparableCoverageExactly = $this->computeComparableCoverage($this->coverageExactly);
|
||||||
|
|
||||||
|
$exitCode = $comparableCoverage === $comparableCoverageExactly ? 0 : 1;
|
||||||
|
|
||||||
if ($exitCode === 1) {
|
if ($exitCode === 1) {
|
||||||
|
$this->output->writeln(sprintf(
|
||||||
|
"\n <fg=white;bg=red;options=bold> FAIL </> Code coverage not exactly <fg=white;options=bold> %s %%</>, currently <fg=red;options=bold> %s %%</>.",
|
||||||
|
number_format($this->coverageExactly, 1),
|
||||||
|
number_format(floor($coverage * 10) / 10, 1),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
} elseif ($exitCode === 1) {
|
||||||
$this->output->writeln(sprintf(
|
$this->output->writeln(sprintf(
|
||||||
"\n <fg=white;bg=red;options=bold> FAIL </> Code coverage below expected <fg=white;options=bold> %s %%</>, currently <fg=red;options=bold> %s %%</>.",
|
"\n <fg=white;bg=red;options=bold> FAIL </> Code coverage below expected <fg=white;options=bold> %s %%</>, currently <fg=red;options=bold> %s %%</>.",
|
||||||
number_format($this->coverageMin, 1),
|
number_format($this->coverageMin, 1),
|
||||||
@ -143,4 +173,12 @@ final class Coverage implements AddsOutput, HandlesArguments
|
|||||||
|
|
||||||
return $exitCode;
|
return $exitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Computes the comparable coverage to a percentage with one decimal.
|
||||||
|
*/
|
||||||
|
private function computeComparableCoverage(float $coverage): float
|
||||||
|
{
|
||||||
|
return floor($coverage * 10) / 10;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1698,4 +1698,4 @@
|
|||||||
WARN Tests\Visual\Version
|
WARN Tests\Visual\Version
|
||||||
- visual snapshot of help command output
|
- visual snapshot of help command output
|
||||||
|
|
||||||
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 38 todos, 33 skipped, 1144 passed (2736 assertions)
|
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 38 todos, 24 skipped, 1142 passed (2720 assertions)
|
||||||
|
|||||||
23
tests/Plugins/Coverage.php
Normal file
23
tests/Plugins/Coverage.php
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Pest\Plugins\Coverage;
|
||||||
|
use Symfony\Component\Console\Output\NullOutput;
|
||||||
|
|
||||||
|
test('compute comparable coverage', function (float $givenValue, float $expectedValue) {
|
||||||
|
$output = new NullOutput();
|
||||||
|
|
||||||
|
$plugin = new Coverage($output);
|
||||||
|
|
||||||
|
$comparableCoverage = (fn () => $this->computeComparableCoverage($givenValue))->call($plugin);
|
||||||
|
|
||||||
|
expect($comparableCoverage)->toBe($expectedValue);
|
||||||
|
})->with([
|
||||||
|
[0, 0],
|
||||||
|
[0.5, 0.5],
|
||||||
|
[1.0, 1.0],
|
||||||
|
[32.51, 32.5],
|
||||||
|
[32.12312321312312, 32.1],
|
||||||
|
[32.53333333333333, 32.5],
|
||||||
|
[32.57777771232132, 32.5],
|
||||||
|
[100.0, 100.0],
|
||||||
|
]);
|
||||||
@ -16,7 +16,7 @@ $run = function () {
|
|||||||
|
|
||||||
test('parallel', function () use ($run) {
|
test('parallel', function () use ($run) {
|
||||||
expect($run('--exclude-group=integration'))
|
expect($run('--exclude-group=integration'))
|
||||||
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 38 todos, 24 skipped, 1134 passed (2712 assertions)')
|
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 38 todos, 24 skipped, 1142 passed (2720 assertions)')
|
||||||
->toContain('Parallel: 3 processes');
|
->toContain('Parallel: 3 processes');
|
||||||
})->skipOnWindows();
|
})->skipOnWindows();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user