mirror of
https://github.com/pestphp/pest.git
synced 2026-03-07 00:07:22 +01:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 918a8fc169 | |||
| 5d32dd0641 | |||
| 982353fb38 | |||
| 2eefa8b88d | |||
| 787d5492ac | |||
| 06a0bd9b0b | |||
| 91afc81222 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -12,3 +12,5 @@ coverage.xml
|
||||
*.swp
|
||||
*.swo
|
||||
.vscode/
|
||||
.STREAM.md
|
||||
|
||||
|
||||
@ -24,11 +24,10 @@ We cannot thank our sponsors enough for their incredible support in funding Pest
|
||||
|
||||
### Platinum Sponsors
|
||||
|
||||
- **[CodeRabbit](https://coderabbit.ai)**
|
||||
- **[LaraJobs](https://larajobs.com)**
|
||||
- **[Brokerchooser](https://brokerchooser.com)**
|
||||
- **[Forge](https://forge.laravel.com)**
|
||||
- **[Spatie](https://spatie.be)**
|
||||
- **[Worksome](https://www.worksome.com/)**
|
||||
|
||||
### Premium Sponsors
|
||||
|
||||
@ -38,6 +37,8 @@ We cannot thank our sponsors enough for their incredible support in funding Pest
|
||||
- [Laracasts](https://laracasts.com/?ref=pestphp)
|
||||
- [Localazy](https://localazy.com/?ref=pestphp)
|
||||
- [Route4Me](https://www.route4me.com/?ref=pestphp)
|
||||
- [Spatie](https://spatie.be)
|
||||
- [Worksome](https://www.worksome.com/)
|
||||
- [Zapiet](https://www.zapiet.com/?ref=pestphp)
|
||||
|
||||
Pest is an open-sourced software licensed under the **[MIT license](https://opensource.org/licenses/MIT)**.
|
||||
|
||||
@ -20,15 +20,15 @@
|
||||
"php": "^8.2.0",
|
||||
"brianium/paratest": "^7.6.0",
|
||||
"nunomaduro/collision": "^8.5.0",
|
||||
"nunomaduro/termwind": "^2.2.0",
|
||||
"nunomaduro/termwind": "^2.3.0",
|
||||
"pestphp/pest-plugin": "^3.0.0",
|
||||
"pestphp/pest-plugin-arch": "^3.0.0",
|
||||
"pestphp/pest-plugin-mutate": "^3.0.5",
|
||||
"phpunit/phpunit": "^11.4.3"
|
||||
"phpunit/phpunit": "^11.4.4"
|
||||
},
|
||||
"conflict": {
|
||||
"filp/whoops": "<2.16.0",
|
||||
"phpunit/phpunit": ">11.4.3",
|
||||
"phpunit/phpunit": ">11.4.4",
|
||||
"sebastian/exporter": "<6.0.0",
|
||||
"webmozart/assert": "<1.11.0"
|
||||
},
|
||||
@ -54,8 +54,8 @@
|
||||
},
|
||||
"require-dev": {
|
||||
"pestphp/pest-dev-tools": "^3.3.0",
|
||||
"pestphp/pest-plugin-type-coverage": "^3.1.0",
|
||||
"symfony/process": "^7.1.6"
|
||||
"pestphp/pest-plugin-type-coverage": "^3.2.0",
|
||||
"symfony/process": "^7.1.8"
|
||||
},
|
||||
"minimum-stability": "dev",
|
||||
"prefer-stable": true,
|
||||
|
||||
@ -25,7 +25,7 @@ final class BootOverrides implements Bootstrapper
|
||||
'8abdad6413329c6fe0d7d44a8b9926e390af32c0b3123f3720bb9c5bbc6fbb7e' => 'TextUI/Output/Default/ProgressPrinter/Subscriber/TestSkippedSubscriber.php',
|
||||
'b4250fc3ffad5954624cb5e682fd940b874e8d3422fa1ee298bd7225e1aa5fc2' => 'TextUI/TestSuiteFilterProcessor.php',
|
||||
'357d5cd7007f8559b26e1b8cdf43bb6fb15b51b79db981779da6f31b7ec39dad' => 'Event/Value/ThrowableBuilder.php',
|
||||
'676273f1fe483877cf2d95c5aedbf9ae5d6a8e2f4c12d6ce716df6591e6db023' => 'Logging/JUnit/JunitXmlLogger.php',
|
||||
'ede161507d4c9c27805f55a05a32c3bb528e53b6e1fc092bfafdb8207e0019e9' => 'Logging/JUnit/JunitXmlLogger.php',
|
||||
];
|
||||
|
||||
/**
|
||||
|
||||
@ -6,7 +6,7 @@ namespace Pest;
|
||||
|
||||
function version(): string
|
||||
{
|
||||
return '3.5.1';
|
||||
return '3.6.0';
|
||||
}
|
||||
|
||||
function testDirectory(string $file = ''): string
|
||||
|
||||
@ -27,6 +27,11 @@ final class Coverage implements AddsOutput, HandlesArguments
|
||||
*/
|
||||
private const MIN_OPTION = 'min';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
private const EXACTLY_OPTION = 'exactly';
|
||||
|
||||
/**
|
||||
* Whether it should show the coverage or not.
|
||||
*/
|
||||
@ -37,6 +42,11 @@ final class Coverage implements AddsOutput, HandlesArguments
|
||||
*/
|
||||
public float $coverageMin = 0.0;
|
||||
|
||||
/**
|
||||
* The exactly coverage.
|
||||
*/
|
||||
public ?float $coverageExactly = null;
|
||||
|
||||
/**
|
||||
* Creates a new Plugin instance.
|
||||
*/
|
||||
@ -51,7 +61,7 @@ final class Coverage implements AddsOutput, HandlesArguments
|
||||
public function handleArguments(array $originals): array
|
||||
{
|
||||
$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)) {
|
||||
return true;
|
||||
}
|
||||
@ -73,6 +83,7 @@ final class Coverage implements AddsOutput, HandlesArguments
|
||||
$inputs = [];
|
||||
$inputs[] = new InputOption(self::COVERAGE_OPTION, null, InputOption::VALUE_NONE);
|
||||
$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));
|
||||
if ((bool) $input->getOption(self::COVERAGE_OPTION)) {
|
||||
@ -106,6 +117,13 @@ final class Coverage implements AddsOutput, HandlesArguments
|
||||
$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;
|
||||
}
|
||||
|
||||
@ -127,10 +145,22 @@ final class Coverage implements AddsOutput, HandlesArguments
|
||||
}
|
||||
|
||||
$coverage = \Pest\Support\Coverage::report($this->output);
|
||||
|
||||
$exitCode = (int) ($coverage < $this->coverageMin);
|
||||
|
||||
if ($exitCode === 1) {
|
||||
if ($exitCode === 0 && $this->coverageExactly !== null) {
|
||||
$comparableCoverage = $this->computeComparableCoverage($coverage);
|
||||
$comparableCoverageExactly = $this->computeComparableCoverage($this->coverageExactly);
|
||||
|
||||
$exitCode = $comparableCoverage === $comparableCoverageExactly ? 0 : 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(
|
||||
"\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),
|
||||
@ -143,4 +173,12 @@ final class Coverage implements AddsOutput, HandlesArguments
|
||||
|
||||
return $exitCode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes the comparable coverage to a percentage with one decimal.
|
||||
*/
|
||||
private function computeComparableCoverage(float $coverage): float
|
||||
{
|
||||
return floor($coverage * 10) / 10;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,5 +1,5 @@
|
||||
|
||||
Pest Testing Framework 3.5.1.
|
||||
Pest Testing Framework 3.5.2.
|
||||
|
||||
USAGE: pest <file> [options]
|
||||
|
||||
|
||||
@ -1,3 +1,3 @@
|
||||
|
||||
Pest Testing Framework 3.5.1.
|
||||
Pest Testing Framework 3.5.2.
|
||||
|
||||
|
||||
@ -1698,4 +1698,4 @@
|
||||
WARN Tests\Visual\Version
|
||||
- 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)
|
||||
|
||||
@ -6,7 +6,7 @@ use PHPUnit\Framework\TestCase;
|
||||
|
||||
class ExampleTest extends TestCase
|
||||
{
|
||||
public function testExample()
|
||||
public function test_example()
|
||||
{
|
||||
$this->markTestSkipped();
|
||||
}
|
||||
|
||||
@ -6,7 +6,7 @@ class ExampleTest extends Base\ExampleTest
|
||||
{
|
||||
protected $foo;
|
||||
|
||||
public function testExample()
|
||||
public function test_example()
|
||||
{
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
|
||||
@ -13,7 +13,7 @@ class ExecutedTest extends TestCase
|
||||
public static $executed = false;
|
||||
|
||||
#[Test]
|
||||
public function testThatGetsExecuted(): void
|
||||
public function test_that_gets_executed(): void
|
||||
{
|
||||
self::$executed = true;
|
||||
|
||||
|
||||
@ -17,7 +17,7 @@ class ParentTest extends TestCase
|
||||
}
|
||||
|
||||
#[Test]
|
||||
public function testOverrideMethod(): void
|
||||
public function test_override_method(): void
|
||||
{
|
||||
assertTrue($this->getEntity() || true);
|
||||
}
|
||||
|
||||
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) {
|
||||
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');
|
||||
})->skipOnWindows();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user