Compare commits

..

9 Commits

Author SHA1 Message Date
45f16484d5 Merge pull request #1235 from pestphp/3.x_herd_fix
Fixes parallel mutation testing when using Laravel Herd
2024-09-11 15:13:49 +01:00
b16e8650da Fixes parallel mutation testing when using Laravel Herd. 2024-09-11 15:11:47 +01:00
c2f30e0148 Fixes parallel mutation testing when using Laravel Herd. 2024-09-11 15:04:44 +01:00
47ce45de56 release: v3.0.4 2024-09-11 00:48:29 +01:00
32881774d2 fix: global afterEach being called twice 2024-09-11 00:40:41 +01:00
ea72461f1b release: v3.0.3 2024-09-10 22:29:09 +01:00
49f15521e0 fix: printer method name 2024-09-10 22:29:01 +01:00
95c5394b66 Bumps dependencies 2024-09-10 16:59:38 +01:00
8de30cc8b7 release: v3.0.1 2024-09-09 15:29:44 +01:00
15 changed files with 134 additions and 36 deletions

View File

@ -23,7 +23,7 @@
"nunomaduro/termwind": "^2.1.0",
"pestphp/pest-plugin": "^3.0.0",
"pestphp/pest-plugin-arch": "^3.0.0",
"pestphp/pest-plugin-mutate": "^3.0.1",
"pestphp/pest-plugin-mutate": "^3.0.3",
"phpunit/phpunit": "^11.3.4"
},
"conflict": {

View File

@ -116,7 +116,7 @@ trait Testable
self::$__latestIssues = $method->issues;
self::$__latestPrs = $method->prs;
$this->__describing = $method->describing;
$this->__test = $method->getClosure($this);
$this->__test = $method->getClosure();
}
}
@ -240,6 +240,8 @@ trait Testable
$method = TestSuite::getInstance()->tests->get(self::$__filename)->getMethod($this->name());
$method->setUp($this);
$description = $method->description;
if ($this->dataName()) {
$description = str_contains((string) $description, ':dataset')
@ -298,6 +300,9 @@ trait Testable
parent::tearDown();
TestSuite::getInstance()->test = null;
$method = TestSuite::getInstance()->tests->get(self::$__filename)->getMethod($this->name());
$method->tearDown($this);
}
}
@ -392,11 +397,12 @@ trait Testable
fn (ReflectionParameter $reflectionParameter): string => $reflectionParameter->getName(),
array_filter($testReflection->getParameters(), fn (ReflectionParameter $reflectionParameter): bool => ! $reflectionParameter->isOptional()),
);
if (array_diff($testParameterNames, $datasetParameterNames) === []) {
return;
}
if (isset($testParameterNames[0])
&& $suppliedParametersCount >= $requiredParametersCount) {
if (isset($testParameterNames[0]) && $suppliedParametersCount >= $requiredParametersCount) {
return;
}

View File

@ -79,11 +79,11 @@ final readonly class Configuration
}
/**
* Gets the theme configuration.
* Gets the printer configuration.
*/
public function theme(): Configuration\Theme
public function printer(): Configuration\Printer
{
return new Configuration\Theme;
return new Configuration\Printer;
}
/**

View File

@ -9,7 +9,7 @@ use NunoMaduro\Collision\Adapters\Phpunit\Printers\DefaultPrinter;
/**
* @internal
*/
final readonly class Theme
final readonly class Printer
{
/**
* Sets the theme to compact.

View File

@ -118,9 +118,9 @@ final class TestCaseMethodFactory
}
/**
* Creates the test's closure.
* Sets the test's hooks, and runs any proxy to the test case.
*/
public function getClosure(TestCase $concrete): Closure
public function setUp(TestCase $concrete): void
{
$concrete::flush(); // @phpstan-ignore-line
@ -128,14 +128,29 @@ final class TestCaseMethodFactory
throw ShouldNotHappen::fromMessage('Description can not be empty.');
}
$closure = $this->closure;
$testCase = TestSuite::getInstance()->tests->get($this->filename);
assert($testCase instanceof TestCaseFactory);
$testCase->factoryProxies->proxy($concrete);
$this->factoryProxies->proxy($concrete);
}
/**
* Flushes the test case.
*/
public function tearDown(TestCase $concrete): void
{
$concrete::flush(); // @phpstan-ignore-line
}
/**
* Creates the test's closure.
*/
public function getClosure(): Closure
{
$closure = $this->closure;
$testCase = TestSuite::getInstance()->tests->get($this->filename);
assert($testCase instanceof TestCaseFactory);
$method = $this;
return function (...$arguments) use ($testCase, $method, $closure): mixed { // @phpstan-ignore-line
@ -209,10 +224,8 @@ final class TestCaseMethodFactory
$attributesCode
public function $methodName(...\$arguments)
{
\$test = \Pest\TestSuite::getInstance()->tests->get(self::\$__filename)->getMethod(\$this->name())->getClosure(\$this);
return \$this->__runTest(
\$test,
\$this->__test,
...\$arguments,
);
}

View File

@ -54,7 +54,7 @@ final class UsesCall
}
/**
* @deprecated Use `pest()->theme()->compact()` instead.
* @deprecated Use `pest()->printer()->compact()` instead.
*/
public function compact(): self
{

View File

@ -6,7 +6,7 @@ namespace Pest;
function version(): string
{
return '3.0.0';
return '3.0.4';
}
function testDirectory(string $file = ''): string

View File

@ -122,6 +122,8 @@ final class WrapperRunner implements RunnerInterface
$parameters = array_merge($parameters, $options->passthruPhp);
}
$parameters = $this->handleLaravelHerd($parameters);
$parameters[] = $wrapper;
$this->parameters = $parameters;
@ -153,6 +155,21 @@ final class WrapperRunner implements RunnerInterface
return $this->complete($result);
}
/**
* Handles Laravel Herd's debug and coverage modes.
*
* @param array<string> $parameters
* @return array<string>
*/
private function handleLaravelHerd(array $parameters): array
{
if (isset($_ENV['HERD_DEBUG_INI'])) {
return array_merge($parameters, ['-c', $_ENV['HERD_DEBUG_INI']]);
}
return $parameters;
}
private function startWorkers(): void
{
for ($token = 1; $token <= $this->options->processes; $token++) {

View File

@ -1,5 +1,5 @@
Pest Testing Framework 3.0.0.
Pest Testing Framework 3.0.4.
USAGE: pest <file> [options]

View File

@ -1,3 +1,3 @@
Pest Testing Framework 3.0.0.
Pest Testing Framework 3.0.4.

View File

@ -1305,6 +1305,7 @@
✓ it executes tests in the Helpers directory
PASS Tests\Hooks\AfterEachTest
✓ nested → nested afterEach execution order
✓ global afterEach execution order
PASS Tests\Hooks\BeforeEachTest
@ -1381,7 +1382,7 @@
✓ it proxies to uses call
PASS Tests\Unit\Configuration\Theme
✓ it creates a theme instance
✓ it creates a printer instance
PASS Tests\Unit\Console\Help
✓ it outputs the help information when --help is used
@ -1573,4 +1574,4 @@
WARN Tests\Visual\Version
- visual snapshot of help command output
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 28 skipped, 1088 passed (2615 assertions)
Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 28 skipped, 1089 passed (2637 assertions)

View File

@ -1,23 +1,79 @@
<?php
beforeEach(function () {
$this->ith = 0;
});
pest()->afterEach(function () {
expect($this)
->toHaveProperty('ith')
->and($this->ith)
->toBe(1);
->toBe(3);
$this->ith = 2;
$this->ith++;
});
pest()->afterEach(function () {
expect($this)
->toHaveProperty('ith')
->and($this->ith)
->toBe(4);
$this->ith++;
});
afterEach(function () {
expect($this)
->toHaveProperty('ith')
->and($this->ith)
->toBe(2);
->toBe(5);
$this->ith++;
});
describe('nested', function () {
afterEach(function () {
expect($this)
->toHaveProperty('ith')
->and($this->ith)
->toBe(6);
$this->ith++;
});
test('nested afterEach execution order', function () {
expect($this)
->toHaveProperty('ith')
->and($this->ith)
->toBe(0);
$this->ith++;
});
afterEach(function () {
expect($this)
->toHaveProperty('ith')
->and($this->ith)
->toBe(7);
$this->ith++;
});
});
afterEach(function () {
expect($this)
->toHaveProperty('ith')
->and($this->ith)
->toBeBetween(6, 8);
$this->ith++;
});
test('global afterEach execution order', function () {
expect($this)
->not()
->toHaveProperty('ith');
->toHaveProperty('ith')
->and($this->ith)
->toBe(0);
$this->ith++;
});

View File

@ -32,7 +32,12 @@ pest()
$_SERVER['globalHook']->calls->beforeAll++;
})
->afterEach(function () {
$this->ith = 0;
if (! isset($this->ith)) {
return;
}
assert($this->ith === 1, 'Expected $this->ith to be 1, but got '.$this->ith);
$this->ith++;
})
->afterAll(function () {
$_SERVER['globalHook']->afterAll = 0;
@ -57,12 +62,12 @@ pest()->in('Hooks')
$_SERVER['globalHook']->beforeAll = 1;
})
->afterEach(function () {
expect($this)
->toHaveProperty('ith')
->and($this->ith)
->toBe(0);
if (! isset($this->ith)) {
return;
}
$this->ith = 1;
assert($this->ith === 2, 'Expected $this->ith to be 1, but got '.$this->ith);
$this->ith++;
})
->afterAll(function () {
expect($_SERVER['globalHook'])

View File

@ -1,7 +1,7 @@
<?php
it('creates a theme instance', function () {
$theme = pest()->theme();
it('creates a printer instance', function () {
$theme = pest()->printer();
expect($theme)->toBeInstanceOf(Pest\Configuration\Theme::class);
expect($theme)->toBeInstanceOf(Pest\Configuration\Printer::class);
});

View File

@ -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, 17 todos, 19 skipped, 1078 passed (2591 assertions)')
->toContain('Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 17 todos, 19 skipped, 1079 passed (2613 assertions)')
->toContain('Parallel: 3 processes');
})->skipOnWindows();