argumentsContainParallelFlags($arguments)) { exit($this->runTestSuiteInParallel($arguments)); } $this->markTestSuiteAsParallelSubProcessIfRequired(); return $arguments; } private function argumentsContainParallelFlags(array $arguments): bool { if ($this->hasArgument('--parallel', $arguments)) { return true; } return $this->hasArgument('-p', $arguments); } private function runTestSuiteInParallel(array $arguments): int { if (! class_exists(ParaTestCommand::class)) { $this->askUserToInstallParatest(); return Command::FAILURE; } $filteredArguments = array_reduce( self::HANDLERS, fn ($arguments, $handler) => (new $handler())->handle($arguments), $arguments ); $exitCode = $this->paratestCommand()->run(new ArgvInput($filteredArguments), new CleanConsoleOutput()); return (new CallsAddsOutput())($exitCode); } private function markTestSuiteAsParallelSubProcessIfRequired(): void { if ((int) Arr::get($_SERVER, 'PARATEST') === 1) { $_SERVER['PEST_PARALLEL'] = 1; } } private function askUserToInstallParatest(): void { Container::getInstance()->get(OutputInterface::class)->writeln([ 'Pest Parallel requires ParaTest to run.', 'Please run composer require --dev brianium/paratest.', ]); } private function paratestCommand(): Application { $command = ParaTestCommand::applicationFactory(TestSuite::getInstance()->rootPath); $command->setAutoExit(false); $command->setName('Pest'); $command->setVersion(version()); return $command; } }