summaryrefslogtreecommitdiff
path: root/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php')
-rw-r--r--vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php117
1 files changed, 117 insertions, 0 deletions
diff --git a/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php b/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php
new file mode 100644
index 000000000..286f717ee
--- /dev/null
+++ b/vendor/phpunit/phpunit/src/Runner/Extension/ExtensionHandler.php
@@ -0,0 +1,117 @@
+<?php declare(strict_types=1);
+/*
+ * This file is part of PHPUnit.
+ *
+ * (c) Sebastian Bergmann <[email protected]>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Runner\Extension;
+
+use function class_exists;
+use function sprintf;
+use PHPUnit\Framework\TestListener;
+use PHPUnit\Runner\Exception;
+use PHPUnit\Runner\Hook;
+use PHPUnit\TextUI\TestRunner;
+use PHPUnit\TextUI\XmlConfiguration\Extension;
+use ReflectionClass;
+use ReflectionException;
+
+/**
+ * @internal This class is not covered by the backward compatibility promise for PHPUnit
+ */
+final class ExtensionHandler
+{
+ /**
+ * @throws Exception
+ */
+ public function registerExtension(Extension $extensionConfiguration, TestRunner $runner): void
+ {
+ $extension = $this->createInstance($extensionConfiguration);
+
+ if (!$extension instanceof Hook) {
+ throw new Exception(
+ sprintf(
+ 'Class "%s" does not implement a PHPUnit\Runner\Hook interface',
+ $extensionConfiguration->className()
+ )
+ );
+ }
+
+ $runner->addExtension($extension);
+ }
+
+ /**
+ * @throws Exception
+ *
+ * @deprecated
+ */
+ public function createTestListenerInstance(Extension $listenerConfiguration): TestListener
+ {
+ $listener = $this->createInstance($listenerConfiguration);
+
+ if (!$listener instanceof TestListener) {
+ throw new Exception(
+ sprintf(
+ 'Class "%s" does not implement the PHPUnit\Framework\TestListener interface',
+ $listenerConfiguration->className()
+ )
+ );
+ }
+
+ return $listener;
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function createInstance(Extension $extensionConfiguration): object
+ {
+ $this->ensureClassExists($extensionConfiguration);
+
+ try {
+ $reflector = new ReflectionClass($extensionConfiguration->className());
+ } catch (ReflectionException $e) {
+ throw new Exception(
+ $e->getMessage(),
+ (int) $e->getCode(),
+ $e
+ );
+ }
+
+ if (!$extensionConfiguration->hasArguments()) {
+ return $reflector->newInstance();
+ }
+
+ return $reflector->newInstanceArgs($extensionConfiguration->arguments());
+ }
+
+ /**
+ * @throws Exception
+ */
+ private function ensureClassExists(Extension $extensionConfiguration): void
+ {
+ if (class_exists($extensionConfiguration->className(), false)) {
+ return;
+ }
+
+ if ($extensionConfiguration->hasSourceFile()) {
+ /**
+ * @noinspection PhpIncludeInspection
+ * @psalm-suppress UnresolvableInclude
+ */
+ require_once $extensionConfiguration->sourceFile();
+ }
+
+ if (!class_exists($extensionConfiguration->className())) {
+ throw new Exception(
+ sprintf(
+ 'Class "%s" does not exist',
+ $extensionConfiguration->className()
+ )
+ );
+ }
+ }
+}