argumentsContainParallelFlags($arguments)) { exit($this->runTestSuiteInParallel($arguments)); } if ((int) Arr::get($_SERVER, 'PARATEST') === 1) { return $this->runSubprocessHandlers($arguments); } 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; } $handlers = array_filter( array_map(fn ($handler) => Container::getInstance()->get($handler), self::HANDLERS), fn ($handler) => $handler instanceof HandlesArguments, ); $filteredArguments = array_reduce( $handlers, fn ($arguments, HandlesArguments $handler) => $handler->handleArguments($arguments), $arguments ); $exitCode = $this->paratestCommand()->run(new ArgvInput($filteredArguments), new CleanConsoleOutput()); return (new CallsAddsOutput())($exitCode); } private function runSubprocessHandlers(array $arguments): array { $handlers = array_filter( array_map(fn ($handler) => Container::getInstance()->get($handler), self::HANDLERS), fn ($handler) => $handler instanceof HandlesSubprocessArguments, ); return array_reduce( $handlers, fn ($arguments, HandlesSubprocessArguments $handler) => $handler->handleSubprocessArguments($arguments), $arguments ); } 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; } }