diff --git a/.gitignore b/.gitignore
index d069e29..aff9154 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,3 @@
-vendor
+/vendor
composer.lock
composer.phar
diff --git a/README.md b/README.md
index ac7b762..50a943c 100644
--- a/README.md
+++ b/README.md
@@ -5,6 +5,18 @@ A simple plug-in which allows to you interrupt running PHPUnit tests **gracefull
```bash
composer require --dev esler/phpunit-graceful-interrupt
```
+
+#### For PHPUnit >= 10
+```xml
+Add extension to your `phpunit.xml`
+
+
+
+
+
+```
+
+#### For PHPUnit < 10
Add listener to your `phpunit.xml`
```xml
diff --git a/composer.json b/composer.json
index 8940223..1134c82 100644
--- a/composer.json
+++ b/composer.json
@@ -13,7 +13,7 @@
],
"require": {
"ext-pcntl": "*",
- "phpunit/phpunit": "^7.0||^8.0||^9.0"
+ "phpunit/phpunit": "^7.0||^8.0||^9.0||^10.0"
},
"autoload": {
"psr-4": {
diff --git a/phpunit.xml b/phpunit.xml
index ec70e44..293dd79 100644
--- a/phpunit.xml
+++ b/phpunit.xml
@@ -1,7 +1,10 @@
-
+
+
+
+
./tests/unit/
diff --git a/src/PHPUnit/GracefulInterruptExtension.php b/src/PHPUnit/GracefulInterruptExtension.php
new file mode 100644
index 0000000..d9c2380
--- /dev/null
+++ b/src/PHPUnit/GracefulInterruptExtension.php
@@ -0,0 +1,33 @@
+
+ * @license MIT
+ */
+final class GracefulInterruptExtension implements Extension
+{
+ public function bootstrap(Configuration $configuration, Facade $facade, ParameterCollection $parameters): void
+ {
+ if (!function_exists('pcntl_signal')) {
+ throw new BadMethodCallException('PCNTL is disabled');
+ }
+
+ $facade->registerSubscriber($subscriber = new GracefulInterruptSubscriber());
+
+ pcntl_signal(SIGQUIT, static function () use ($subscriber) {
+ $subscriber->interrupted = true;
+ });
+ }
+}
diff --git a/src/PHPUnit/GracefulInterruptSubscriber.php b/src/PHPUnit/GracefulInterruptSubscriber.php
new file mode 100644
index 0000000..d7a66da
--- /dev/null
+++ b/src/PHPUnit/GracefulInterruptSubscriber.php
@@ -0,0 +1,29 @@
+
+ * @license MIT
+ */
+final class GracefulInterruptSubscriber implements PreparedSubscriber
+{
+ public bool $interrupted = false;
+
+ public function notify(Prepared $event): void
+ {
+ pcntl_signal_dispatch();
+
+ if ($this->interrupted) {
+ Assert::markTestSkipped('Skipped by ' . $this::class);
+ }
+ }
+}
diff --git a/src/PHPUnit/Listener/GracefulInterruptListener.php b/src/PHPUnit/Listener/GracefulInterruptListener.php
index dfda880..d14a8b3 100644
--- a/src/PHPUnit/Listener/GracefulInterruptListener.php
+++ b/src/PHPUnit/Listener/GracefulInterruptListener.php
@@ -19,6 +19,9 @@ class GracefulInterruptListener implements TestListener
{
use TestListenerDefaultImplementation;
+ /** @var Test */
+ private $test;
+
/**
* Constructor
*/