*/ private const BOOTSTRAPPERS = [ Bootstrappers\BootOverrides::class, Bootstrappers\BootSubscribers::class, Bootstrappers\BootFiles::class, Bootstrappers\BootView::class, Bootstrappers\BootKernelDump::class, Bootstrappers\BootExcludeList::class, ]; /** * Creates a new Kernel instance. */ public function __construct( private readonly Application $application, private readonly OutputInterface $output, ) { register_shutdown_function(fn () => $this->shutdown()); } /** * Boots the Kernel. */ public static function boot(TestSuite $testSuite, InputInterface $input, OutputInterface $output): self { $container = Container::getInstance(); $container ->add(TestSuite::class, $testSuite) ->add(InputInterface::class, $input) ->add(OutputInterface::class, $output) ->add(Container::class, $container); foreach (self::BOOTSTRAPPERS as $bootstrapper) { $bootstrapper = Container::getInstance()->get($bootstrapper); assert($bootstrapper instanceof Bootstrapper); $bootstrapper->boot(); } CallsBoot::execute(); $kernel = new self( new Application(), $output, ); Container::getInstance()->add(self::class, $kernel); return $kernel; } /** * Runs the application, and returns the exit code. * * @param array $args */ public function handle(array $args): int { $args = CallsHandleArguments::execute($args); try { $this->application->run($args); } catch (NoDirtyTestsFound) { $this->output->writeln([ '', ' INFO No tests found.', '', ]); } $configuration = Registry::get(); $result = Facade::result(); return CallsAddsOutput::execute( Result::exitCode($configuration, $result), ); } /** * Shutdown the Kernel. */ public function shutdown(): void { $preBufferOutput = Container::getInstance()->get(KernelDump::class); assert($preBufferOutput instanceof KernelDump); $preBufferOutput->shutdown(); CallsShutdown::execute(); } }