This commit is contained in:
Nuno Maduro
2023-02-07 01:06:31 +00:00
parent f48ae48677
commit 6338d762fa
6 changed files with 31 additions and 27 deletions

View File

@ -45,13 +45,13 @@ $bootPest = (static function (): void {
'phpunit-argv:', 'phpunit-argv:',
]); ]);
require_once __DIR__ . '/../overrides/Runner/TestSuiteLoader.php'; require_once __DIR__.'/../overrides/Runner/TestSuiteLoader.php';
require_once __DIR__ . '/../overrides/Runner/Filter/NameFilterIterator.php'; require_once __DIR__.'/../overrides/Runner/Filter/NameFilterIterator.php';
$composerAutoloadFiles = [ $composerAutoloadFiles = [
dirname(__DIR__, 3) . DIRECTORY_SEPARATOR . 'autoload.php', dirname(__DIR__, 3).DIRECTORY_SEPARATOR.'autoload.php',
dirname(__DIR__, 2) . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php', dirname(__DIR__, 2).DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php',
dirname(__DIR__) . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php', dirname(__DIR__).DIRECTORY_SEPARATOR.'vendor'.DIRECTORY_SEPARATOR.'autoload.php',
]; ];
foreach ($composerAutoloadFiles as $file) { foreach ($composerAutoloadFiles as $file) {
@ -69,8 +69,8 @@ $bootPest = (static function (): void {
assert(isset($getopt['progress-file']) && is_string($getopt['progress-file'])); assert(isset($getopt['progress-file']) && is_string($getopt['progress-file']));
assert(isset($getopt['testresult-file']) && is_string($getopt['testresult-file'])); assert(isset($getopt['testresult-file']) && is_string($getopt['testresult-file']));
assert(!isset($getopt['teamcity-file']) || is_string($getopt['teamcity-file'])); assert(! isset($getopt['teamcity-file']) || is_string($getopt['teamcity-file']));
assert(!isset($getopt['testdox-file']) || is_string($getopt['testdox-file'])); assert(! isset($getopt['testdox-file']) || is_string($getopt['testdox-file']));
assert(isset($getopt['phpunit-argv']) && is_string($getopt['phpunit-argv'])); assert(isset($getopt['phpunit-argv']) && is_string($getopt['phpunit-argv']));
$phpunitArgv = unserialize($getopt['phpunit-argv'], ['allowed_classes' => false]); $phpunitArgv = unserialize($getopt['phpunit-argv'], ['allowed_classes' => false]);

View File

@ -17,7 +17,7 @@ final class Parallel implements HandlesArguments
{ {
use HandleArguments; use HandleArguments;
private array $handlers = [ private const HANDLERS = [
\Pest\Plugins\Parallel\Handlers\Parallel::class, \Pest\Plugins\Parallel\Handlers\Parallel::class,
\Pest\Plugins\Parallel\Handlers\Laravel::class, \Pest\Plugins\Parallel\Handlers\Laravel::class,
]; ];
@ -36,8 +36,10 @@ final class Parallel implements HandlesArguments
private function argumentsContainParallelFlags(array $arguments): bool private function argumentsContainParallelFlags(array $arguments): bool
{ {
return $this->hasArgument('--parallel', $arguments) if ($this->hasArgument('--parallel', $arguments)) {
|| $this->hasArgument('-p', $arguments); return true;
}
return $this->hasArgument('-p', $arguments);
} }
private function runTestSuiteInParallel(array $arguments): int private function runTestSuiteInParallel(array $arguments): int
@ -49,7 +51,7 @@ final class Parallel implements HandlesArguments
} }
$filteredArguments = array_reduce( $filteredArguments = array_reduce(
$this->handlers, self::HANDLERS,
fn($arguments, $handler) => (new $handler())->handle($arguments), fn($arguments, $handler) => (new $handler())->handle($arguments),
$arguments $arguments
); );

View File

@ -27,7 +27,7 @@ final class Laravel
$this->setLaravelParallelRunner(); $this->setLaravelParallelRunner();
foreach ($args as $value) { foreach ($args as $value) {
if (str_starts_with($value, '--runner')) { if (str_starts_with((string) $value, '--runner')) {
$args = $this->popArgument($value, $args); $args = $this->popArgument($value, $args);
} }
} }
@ -41,9 +41,7 @@ final class Laravel
exit('Using parallel with Pest requires Laravel v8.55.0 or higher.'); exit('Using parallel with Pest requires Laravel v8.55.0 or higher.');
} }
ParallelRunner::resolveRunnerUsing(function (Options $options, OutputInterface $output): RunnerInterface { ParallelRunner::resolveRunnerUsing(fn(Options $options, OutputInterface $output): RunnerInterface => new WrapperRunner($options, $output));
return new WrapperRunner($options, $output);
});
} }
private static function isALaravelApplication(): bool private static function isALaravelApplication(): bool

View File

@ -14,16 +14,18 @@ use Symfony\Component\Console\Input\ArgvInput;
final class Parallel final class Parallel
{ {
use HandleArguments; use HandleArguments;
/**
public function handle(array $args): array * @var string[]
{ */
$argsToRemove = [ private const ARGS_TO_REMOVE = [
'--parallel', '--parallel',
'-p', '-p',
'--no-output', '--no-output',
]; ];
$args = array_reduce($argsToRemove, fn ($args, $arg) => $this->popArgument($arg, $args), $args); public function handle(array $args): array
{
$args = array_reduce(self::ARGS_TO_REMOVE, fn ($args, $arg): array => $this->popArgument($arg, $args), $args);
return $this->pushArgument('--runner=' . WrapperRunner::class, $args); return $this->pushArgument('--runner=' . WrapperRunner::class, $args);
} }

View File

@ -44,7 +44,7 @@ final class WrapperRunner implements RunnerInterface
{ {
private const CYCLE_SLEEP = 10000; private const CYCLE_SLEEP = 10000;
private readonly ResultPrinter $printer; private readonly ResultPrinter $printer;
private Timer $timer; private readonly Timer $timer;
/** @var non-empty-string[] */ /** @var non-empty-string[] */
private array $pending = []; private array $pending = [];
@ -131,7 +131,7 @@ final class WrapperRunner implements RunnerInterface
{ {
$batchSize = $this->options->maxBatchSize; $batchSize = $this->options->maxBatchSize;
while (count($this->pending) > 0 && count($this->workers) > 0) { while ($this->pending !== [] && $this->workers !== []) {
foreach ($this->workers as $token => $worker) { foreach ($this->workers as $token => $worker) {
if (! $worker->isRunning()) { if (! $worker->isRunning()) {
throw $worker->getWorkerCrashedException(); throw $worker->getWorkerCrashedException();
@ -178,7 +178,7 @@ final class WrapperRunner implements RunnerInterface
private function waitForAllToFinish(): void private function waitForAllToFinish(): void
{ {
$stopped = []; $stopped = [];
while (count($this->workers) > 0) { while ($this->workers !== []) {
foreach ($this->workers as $index => $worker) { foreach ($this->workers as $index => $worker) {
if ($worker->isRunning()) { if ($worker->isRunning()) {
if (! isset($stopped[$index]) && $worker->isFree()) { if (! isset($stopped[$index]) && $worker->isFree()) {
@ -307,7 +307,7 @@ final class WrapperRunner implements RunnerInterface
return $exitcode; return $exitcode;
} }
protected function generateCodeCoverageReports(): void private function generateCodeCoverageReports(): void
{ {
if ($this->coverageFiles === []) { if ($this->coverageFiles === []) {
return; return;
@ -361,7 +361,7 @@ final class WrapperRunner implements RunnerInterface
$tests = array_filter( $tests = array_filter(
$suiteLoader->files, $suiteLoader->files,
fn(string $filename) => ! str_ends_with($filename, "eval()'d code") fn(string $filename): bool => ! str_ends_with($filename, "eval()'d code")
); );
return [...$tests, ...TestSuite::getInstance()->tests->getFilenames()]; return [...$tests, ...TestSuite::getInstance()->tests->getFilenames()];

View File

@ -25,6 +25,8 @@ final class CompactPrinter
{ {
private readonly Terminal $terminal; private readonly Terminal $terminal;
private readonly ConsoleOutputInterface $output;
private readonly Style $style; private readonly Style $style;
private int $compactProcessed = 0; private int $compactProcessed = 0;