diff --git a/.psalm/baseline.xml b/.psalm/baseline.xml
index 8959e902162..6a8c7a6ac5b 100644
--- a/.psalm/baseline.xml
+++ b/.psalm/baseline.xml
@@ -6,10 +6,27 @@
+
+ telemetryInfo(),
+ $testMethod,
+ $dataProviderMethod,
+ )]]>
+ telemetryInfo(),
+ $testMethod,
+ ...$calledMethods,
+ )]]>
+
+
+
+
+
+
@@ -40,11 +57,21 @@
+
+
+
+
+
+
+
+
+
+
@@ -59,6 +86,10 @@
+
+
+
+
@@ -619,6 +650,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
@@ -627,6 +670,15 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/Event/Emitter/DispatchingEmitter.php b/src/Event/Emitter/DispatchingEmitter.php
index 53c5022a285..4b20e2d69ca 100644
--- a/src/Event/Emitter/DispatchingEmitter.php
+++ b/src/Event/Emitter/DispatchingEmitter.php
@@ -17,8 +17,17 @@
use PHPUnit\Event\Code\TestMethod;
use PHPUnit\Event\Code\TestMethodBuilder;
use PHPUnit\Event\Code\Throwable;
-use PHPUnit\Event\Test\DataProviderMethodCalled;
-use PHPUnit\Event\Test\DataProviderMethodFinished;
+use PHPUnit\Event\DataProvider\DeprecationTriggered as DataProviderTriggeredDeprecation;
+use PHPUnit\Event\DataProvider\ErrorTriggered as DataProviderTriggeredError;
+use PHPUnit\Event\DataProvider\MethodCalled as DataProviderMethodCalled;
+use PHPUnit\Event\DataProvider\MethodFinished as DataProviderMethodFinished;
+use PHPUnit\Event\DataProvider\NoticeTriggered as DataProviderTriggeredNotice;
+use PHPUnit\Event\DataProvider\PhpDeprecationTriggered as DataProviderTriggeredPhpDeprecation;
+use PHPUnit\Event\DataProvider\PhpNoticeTriggered as DataProviderTriggeredPhpNotice;
+use PHPUnit\Event\DataProvider\PhpWarningTriggered as DataProviderTriggeredPhpWarning;
+use PHPUnit\Event\DataProvider\WarningTriggered as DataProviderTriggeredWarning;
+use PHPUnit\Event\Test\DataProviderMethodCalled as DeprecatedDataProviderMethodCalled;
+use PHPUnit\Event\Test\DataProviderMethodFinished as DeprecatedDataProviderMethodFinished;
use PHPUnit\Event\TestSuite\Filtered as TestSuiteFiltered;
use PHPUnit\Event\TestSuite\Finished as TestSuiteFinished;
use PHPUnit\Event\TestSuite\Loaded as TestSuiteLoaded;
@@ -150,6 +159,14 @@ public function dataProviderMethodCalled(ClassMethod $testMethod, ClassMethod $d
$dataProviderMethod,
),
);
+
+ $this->dispatcher->dispatch(
+ new DeprecatedDataProviderMethodCalled(
+ $this->telemetryInfo(),
+ $testMethod,
+ $dataProviderMethod,
+ ),
+ );
}
/**
@@ -165,6 +182,176 @@ public function dataProviderMethodFinished(ClassMethod $testMethod, ClassMethod
...$calledMethods,
),
);
+
+ $this->dispatcher->dispatch(
+ new DeprecatedDataProviderMethodFinished(
+ $this->telemetryInfo(),
+ $testMethod,
+ ...$calledMethods,
+ ),
+ );
+ }
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ *
+ * @throws InvalidArgumentException
+ * @throws UnknownEventTypeException
+ */
+ public function dataProviderTriggeredDeprecation(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, IssueTrigger $trigger): void
+ {
+ $this->dispatcher->dispatch(
+ new DataProviderTriggeredDeprecation(
+ $this->telemetryInfo(),
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ $trigger,
+ ),
+ );
+ }
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ *
+ * @throws InvalidArgumentException
+ * @throws UnknownEventTypeException
+ */
+ public function dataProviderTriggeredError(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed): void
+ {
+ $this->dispatcher->dispatch(
+ new DataProviderTriggeredError(
+ $this->telemetryInfo(),
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ ),
+ );
+ }
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ *
+ * @throws InvalidArgumentException
+ * @throws UnknownEventTypeException
+ */
+ public function dataProviderTriggeredNotice(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void
+ {
+ $this->dispatcher->dispatch(
+ new DataProviderTriggeredNotice(
+ $this->telemetryInfo(),
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ ),
+ );
+ }
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ *
+ * @throws InvalidArgumentException
+ * @throws UnknownEventTypeException
+ */
+ public function dataProviderTriggeredPhpDeprecation(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, IssueTrigger $trigger): void
+ {
+ $this->dispatcher->dispatch(
+ new DataProviderTriggeredPhpDeprecation(
+ $this->telemetryInfo(),
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ $trigger,
+ ),
+ );
+ }
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ *
+ * @throws InvalidArgumentException
+ * @throws UnknownEventTypeException
+ */
+ public function dataProviderTriggeredPhpNotice(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void
+ {
+ $this->dispatcher->dispatch(
+ new DataProviderTriggeredPhpNotice(
+ $this->telemetryInfo(),
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ ),
+ );
+ }
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ *
+ * @throws InvalidArgumentException
+ * @throws UnknownEventTypeException
+ */
+ public function dataProviderTriggeredPhpWarning(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void
+ {
+ $this->dispatcher->dispatch(
+ new DataProviderTriggeredPhpWarning(
+ $this->telemetryInfo(),
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ ),
+ );
+ }
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ *
+ * @throws InvalidArgumentException
+ * @throws UnknownEventTypeException
+ */
+ public function dataProviderTriggeredWarning(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void
+ {
+ $this->dispatcher->dispatch(
+ new DataProviderTriggeredWarning(
+ $this->telemetryInfo(),
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ ),
+ );
}
/**
diff --git a/src/Event/Emitter/Emitter.php b/src/Event/Emitter/Emitter.php
index 8c1aa09c970..a6e00006793 100644
--- a/src/Event/Emitter/Emitter.php
+++ b/src/Event/Emitter/Emitter.php
@@ -41,6 +41,55 @@ public function dataProviderMethodCalled(ClassMethod $testMethod, ClassMethod $d
public function dataProviderMethodFinished(ClassMethod $testMethod, ClassMethod ...$calledMethods): void;
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function dataProviderTriggeredDeprecation(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, IssueTrigger $trigger): void;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function dataProviderTriggeredError(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed): void;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function dataProviderTriggeredNotice(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function dataProviderTriggeredPhpDeprecation(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, IssueTrigger $trigger): void;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function dataProviderTriggeredPhpNotice(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function dataProviderTriggeredPhpWarning(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function dataProviderTriggeredWarning(ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline): void;
+
public function testSuiteLoaded(TestSuite $testSuite): void;
public function testSuiteFiltered(TestSuite $testSuite): void;
diff --git a/src/Event/Events/DataProvider/Issue/DeprecationTriggered.php b/src/Event/Events/DataProvider/Issue/DeprecationTriggered.php
new file mode 100644
index 00000000000..98fe6f029aa
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/DeprecationTriggered.php
@@ -0,0 +1,138 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use function implode;
+use function sprintf;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Code\IssueTrigger\IssueTrigger;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class DeprecationTriggered implements Event
+{
+ private Telemetry\Info $telemetryInfo;
+ private ClassMethod $dataProvider;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $message;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $file;
+
+ /**
+ * @psalm-var positive-int
+ */
+ private int $line;
+ private bool $suppressed;
+ private bool $ignoredByBaseline;
+ private IssueTrigger $trigger;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, IssueTrigger $trigger)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->dataProvider = $dataProvider;
+ $this->message = $message;
+ $this->file = $file;
+ $this->line = $line;
+ $this->suppressed = $suppressed;
+ $this->ignoredByBaseline = $ignoredByBaseline;
+ $this->trigger = $trigger;
+ }
+
+ public function telemetryInfo(): Telemetry\Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function dataProvider(): ClassMethod
+ {
+ return $this->dataProvider;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function message(): string
+ {
+ return $this->message;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function file(): string
+ {
+ return $this->file;
+ }
+
+ /**
+ * @psalm-return positive-int
+ */
+ public function line(): int
+ {
+ return $this->line;
+ }
+
+ public function wasSuppressed(): bool
+ {
+ return $this->suppressed;
+ }
+
+ public function ignoredByBaseline(): bool
+ {
+ return $this->ignoredByBaseline;
+ }
+
+ public function trigger(): IssueTrigger
+ {
+ return $this->trigger;
+ }
+
+ public function asString(): string
+ {
+ $message = $this->message;
+
+ if (!empty($message)) {
+ $message = PHP_EOL . $message;
+ }
+
+ $details = [$this->dataProvider->className() . '::' . $this->dataProvider->methodName(), $this->trigger->asString()];
+
+ if ($this->suppressed) {
+ $details[] = 'suppressed using operator';
+ }
+
+ if ($this->ignoredByBaseline) {
+ $details[] = 'ignored by baseline';
+ }
+
+ return sprintf(
+ 'Data Provider Triggered Deprecation (%s)%s',
+ implode(', ', $details),
+ $message,
+ );
+ }
+}
diff --git a/src/Event/Events/DataProvider/Issue/DeprecationTriggeredSubscriber.php b/src/Event/Events/DataProvider/Issue/DeprecationTriggeredSubscriber.php
new file mode 100644
index 00000000000..22231c57462
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/DeprecationTriggeredSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface DeprecationTriggeredSubscriber extends Subscriber
+{
+ public function notify(DeprecationTriggered $event): void;
+}
diff --git a/src/Event/Events/DataProvider/Issue/ErrorTriggered.php b/src/Event/Events/DataProvider/Issue/ErrorTriggered.php
new file mode 100644
index 00000000000..3e5fe4d428e
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/ErrorTriggered.php
@@ -0,0 +1,119 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use function implode;
+use function sprintf;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class ErrorTriggered implements Event
+{
+ private Telemetry\Info $telemetryInfo;
+ private ClassMethod $dataProvider;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $message;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $file;
+
+ /**
+ * @psalm-var positive-int
+ */
+ private int $line;
+ private bool $suppressed;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->dataProvider = $dataProvider;
+ $this->message = $message;
+ $this->file = $file;
+ $this->line = $line;
+ $this->suppressed = $suppressed;
+ }
+
+ public function telemetryInfo(): Telemetry\Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function dataProvider(): ClassMethod
+ {
+ return $this->dataProvider;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function message(): string
+ {
+ return $this->message;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function file(): string
+ {
+ return $this->file;
+ }
+
+ /**
+ * @psalm-return positive-int
+ */
+ public function line(): int
+ {
+ return $this->line;
+ }
+
+ public function wasSuppressed(): bool
+ {
+ return $this->suppressed;
+ }
+
+ public function asString(): string
+ {
+ $message = $this->message;
+
+ if (!empty($message)) {
+ $message = PHP_EOL . $message;
+ }
+
+ $details = [$this->dataProvider->className() . '::' . $this->dataProvider->methodName()];
+
+ if ($this->suppressed) {
+ $details[] = 'suppressed using operator';
+ }
+
+ return sprintf(
+ 'Data Provider Triggered Error (%s)%s',
+ implode(', ', $details),
+ $message,
+ );
+ }
+}
diff --git a/src/Event/Events/DataProvider/Issue/ErrorTriggeredSubscriber.php b/src/Event/Events/DataProvider/Issue/ErrorTriggeredSubscriber.php
new file mode 100644
index 00000000000..6c3b3f4bf85
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/ErrorTriggeredSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface ErrorTriggeredSubscriber extends Subscriber
+{
+ public function notify(ErrorTriggered $event): void;
+}
diff --git a/src/Event/Events/DataProvider/Issue/NoticeTriggered.php b/src/Event/Events/DataProvider/Issue/NoticeTriggered.php
new file mode 100644
index 00000000000..9a3e2ca900e
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/NoticeTriggered.php
@@ -0,0 +1,130 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use function implode;
+use function sprintf;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class NoticeTriggered implements Event
+{
+ private Telemetry\Info $telemetryInfo;
+ private ClassMethod $dataProvider;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $message;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $file;
+
+ /**
+ * @psalm-var positive-int
+ */
+ private int $line;
+ private bool $suppressed;
+ private bool $ignoredByBaseline;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->dataProvider = $dataProvider;
+ $this->message = $message;
+ $this->file = $file;
+ $this->line = $line;
+ $this->suppressed = $suppressed;
+ $this->ignoredByBaseline = $ignoredByBaseline;
+ }
+
+ public function telemetryInfo(): Telemetry\Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function dataProvider(): ClassMethod
+ {
+ return $this->dataProvider;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function message(): string
+ {
+ return $this->message;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function file(): string
+ {
+ return $this->file;
+ }
+
+ /**
+ * @psalm-return positive-int
+ */
+ public function line(): int
+ {
+ return $this->line;
+ }
+
+ public function wasSuppressed(): bool
+ {
+ return $this->suppressed;
+ }
+
+ public function ignoredByBaseline(): bool
+ {
+ return $this->ignoredByBaseline;
+ }
+
+ public function asString(): string
+ {
+ $message = $this->message;
+
+ if (!empty($message)) {
+ $message = PHP_EOL . $message;
+ }
+
+ $details = [$this->dataProvider->className() . '::' . $this->dataProvider->methodName()];
+
+ if ($this->suppressed) {
+ $details[] = 'suppressed using operator';
+ }
+
+ if ($this->ignoredByBaseline) {
+ $details[] = 'ignored by baseline';
+ }
+
+ return sprintf(
+ 'Data Provider Triggered Notice (%s)%s',
+ implode(', ', $details),
+ $message,
+ );
+ }
+}
diff --git a/src/Event/Events/DataProvider/Issue/NoticeTriggeredSubscriber.php b/src/Event/Events/DataProvider/Issue/NoticeTriggeredSubscriber.php
new file mode 100644
index 00000000000..a54ee78620a
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/NoticeTriggeredSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface NoticeTriggeredSubscriber extends Subscriber
+{
+ public function notify(NoticeTriggered $event): void;
+}
diff --git a/src/Event/Events/DataProvider/Issue/PhpDeprecationTriggered.php b/src/Event/Events/DataProvider/Issue/PhpDeprecationTriggered.php
new file mode 100644
index 00000000000..77ad8b10545
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/PhpDeprecationTriggered.php
@@ -0,0 +1,138 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use function implode;
+use function sprintf;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Code\IssueTrigger\IssueTrigger;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class PhpDeprecationTriggered implements Event
+{
+ private Telemetry\Info $telemetryInfo;
+ private ClassMethod $dataProvider;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $message;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $file;
+
+ /**
+ * @psalm-var positive-int
+ */
+ private int $line;
+ private bool $suppressed;
+ private bool $ignoredByBaseline;
+ private IssueTrigger $trigger;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline, IssueTrigger $trigger)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->dataProvider = $dataProvider;
+ $this->message = $message;
+ $this->file = $file;
+ $this->line = $line;
+ $this->suppressed = $suppressed;
+ $this->ignoredByBaseline = $ignoredByBaseline;
+ $this->trigger = $trigger;
+ }
+
+ public function telemetryInfo(): Telemetry\Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function dataProvider(): ClassMethod
+ {
+ return $this->dataProvider;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function message(): string
+ {
+ return $this->message;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function file(): string
+ {
+ return $this->file;
+ }
+
+ /**
+ * @psalm-return positive-int
+ */
+ public function line(): int
+ {
+ return $this->line;
+ }
+
+ public function wasSuppressed(): bool
+ {
+ return $this->suppressed;
+ }
+
+ public function ignoredByBaseline(): bool
+ {
+ return $this->ignoredByBaseline;
+ }
+
+ public function trigger(): IssueTrigger
+ {
+ return $this->trigger;
+ }
+
+ public function asString(): string
+ {
+ $message = $this->message;
+
+ if (!empty($message)) {
+ $message = PHP_EOL . $message;
+ }
+
+ $details = [$this->dataProvider->className() . '::' . $this->dataProvider->methodName(), $this->trigger->asString()];
+
+ if ($this->suppressed) {
+ $details[] = 'suppressed using operator';
+ }
+
+ if ($this->ignoredByBaseline) {
+ $details[] = 'ignored by baseline';
+ }
+
+ return sprintf(
+ 'Data Provider Triggered PHP Deprecation (%s)%s',
+ implode(', ', $details),
+ $message,
+ );
+ }
+}
diff --git a/src/Event/Events/DataProvider/Issue/PhpDeprecationTriggeredSubscriber.php b/src/Event/Events/DataProvider/Issue/PhpDeprecationTriggeredSubscriber.php
new file mode 100644
index 00000000000..58ef329d06a
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/PhpDeprecationTriggeredSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface PhpDeprecationTriggeredSubscriber extends Subscriber
+{
+ public function notify(PhpDeprecationTriggered $event): void;
+}
diff --git a/src/Event/Events/DataProvider/Issue/PhpNoticeTriggered.php b/src/Event/Events/DataProvider/Issue/PhpNoticeTriggered.php
new file mode 100644
index 00000000000..d6940c69753
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/PhpNoticeTriggered.php
@@ -0,0 +1,130 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use function implode;
+use function sprintf;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class PhpNoticeTriggered implements Event
+{
+ private Telemetry\Info $telemetryInfo;
+ private ClassMethod $dataProvider;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $message;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $file;
+
+ /**
+ * @psalm-var positive-int
+ */
+ private int $line;
+ private bool $suppressed;
+ private bool $ignoredByBaseline;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->dataProvider = $dataProvider;
+ $this->message = $message;
+ $this->file = $file;
+ $this->line = $line;
+ $this->suppressed = $suppressed;
+ $this->ignoredByBaseline = $ignoredByBaseline;
+ }
+
+ public function telemetryInfo(): Telemetry\Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function dataProvider(): ClassMethod
+ {
+ return $this->dataProvider;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function message(): string
+ {
+ return $this->message;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function file(): string
+ {
+ return $this->file;
+ }
+
+ /**
+ * @psalm-return positive-int
+ */
+ public function line(): int
+ {
+ return $this->line;
+ }
+
+ public function wasSuppressed(): bool
+ {
+ return $this->suppressed;
+ }
+
+ public function ignoredByBaseline(): bool
+ {
+ return $this->ignoredByBaseline;
+ }
+
+ public function asString(): string
+ {
+ $message = $this->message;
+
+ if (!empty($message)) {
+ $message = PHP_EOL . $message;
+ }
+
+ $details = [$this->dataProvider->className() . '::' . $this->dataProvider->methodName()];
+
+ if ($this->suppressed) {
+ $details[] = 'suppressed using operator';
+ }
+
+ if ($this->ignoredByBaseline) {
+ $details[] = 'ignored by baseline';
+ }
+
+ return sprintf(
+ 'Data Provider Triggered PHP Notice (%s)%s',
+ implode(', ', $details),
+ $message,
+ );
+ }
+}
diff --git a/src/Event/Events/DataProvider/Issue/PhpNoticeTriggeredSubscriber.php b/src/Event/Events/DataProvider/Issue/PhpNoticeTriggeredSubscriber.php
new file mode 100644
index 00000000000..ea4434ea60d
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/PhpNoticeTriggeredSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface PhpNoticeTriggeredSubscriber extends Subscriber
+{
+ public function notify(PhpNoticeTriggered $event): void;
+}
diff --git a/src/Event/Events/DataProvider/Issue/PhpWarningTriggered.php b/src/Event/Events/DataProvider/Issue/PhpWarningTriggered.php
new file mode 100644
index 00000000000..686a0560eb2
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/PhpWarningTriggered.php
@@ -0,0 +1,130 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use function implode;
+use function sprintf;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class PhpWarningTriggered implements Event
+{
+ private Telemetry\Info $telemetryInfo;
+ private ClassMethod $dataProvider;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $message;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $file;
+
+ /**
+ * @psalm-var positive-int
+ */
+ private int $line;
+ private bool $suppressed;
+ private bool $ignoredByBaseline;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->dataProvider = $dataProvider;
+ $this->message = $message;
+ $this->file = $file;
+ $this->line = $line;
+ $this->suppressed = $suppressed;
+ $this->ignoredByBaseline = $ignoredByBaseline;
+ }
+
+ public function telemetryInfo(): Telemetry\Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function dataProvider(): ClassMethod
+ {
+ return $this->dataProvider;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function message(): string
+ {
+ return $this->message;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function file(): string
+ {
+ return $this->file;
+ }
+
+ /**
+ * @psalm-return positive-int
+ */
+ public function line(): int
+ {
+ return $this->line;
+ }
+
+ public function wasSuppressed(): bool
+ {
+ return $this->suppressed;
+ }
+
+ public function ignoredByBaseline(): bool
+ {
+ return $this->ignoredByBaseline;
+ }
+
+ public function asString(): string
+ {
+ $message = $this->message;
+
+ if (!empty($message)) {
+ $message = PHP_EOL . $message;
+ }
+
+ $details = [$this->dataProvider->className() . '::' . $this->dataProvider->methodName()];
+
+ if ($this->suppressed) {
+ $details[] = 'suppressed using operator';
+ }
+
+ if ($this->ignoredByBaseline) {
+ $details[] = 'ignored by baseline';
+ }
+
+ return sprintf(
+ 'Data Provider Triggered PHP Warning (%s)%s',
+ implode(', ', $details),
+ $message,
+ );
+ }
+}
diff --git a/src/Event/Events/DataProvider/Issue/PhpWarningTriggeredSubscriber.php b/src/Event/Events/DataProvider/Issue/PhpWarningTriggeredSubscriber.php
new file mode 100644
index 00000000000..3915a730523
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/PhpWarningTriggeredSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface PhpWarningTriggeredSubscriber extends Subscriber
+{
+ public function notify(PhpWarningTriggered $event): void;
+}
diff --git a/src/Event/Events/DataProvider/Issue/WarningTriggered.php b/src/Event/Events/DataProvider/Issue/WarningTriggered.php
new file mode 100644
index 00000000000..fb994a51383
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/WarningTriggered.php
@@ -0,0 +1,130 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use function implode;
+use function sprintf;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class WarningTriggered implements Event
+{
+ private Telemetry\Info $telemetryInfo;
+ private ClassMethod $dataProvider;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $message;
+
+ /**
+ * @psalm-var non-empty-string
+ */
+ private string $file;
+
+ /**
+ * @psalm-var positive-int
+ */
+ private int $line;
+ private bool $suppressed;
+ private bool $ignoredByBaseline;
+
+ /**
+ * @psalm-param non-empty-string $message
+ * @psalm-param non-empty-string $file
+ * @psalm-param positive-int $line
+ */
+ public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $dataProvider, string $message, string $file, int $line, bool $suppressed, bool $ignoredByBaseline)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->dataProvider = $dataProvider;
+ $this->message = $message;
+ $this->file = $file;
+ $this->line = $line;
+ $this->suppressed = $suppressed;
+ $this->ignoredByBaseline = $ignoredByBaseline;
+ }
+
+ public function telemetryInfo(): Telemetry\Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function dataProvider(): ClassMethod
+ {
+ return $this->dataProvider;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function message(): string
+ {
+ return $this->message;
+ }
+
+ /**
+ * @psalm-return non-empty-string
+ */
+ public function file(): string
+ {
+ return $this->file;
+ }
+
+ /**
+ * @psalm-return positive-int
+ */
+ public function line(): int
+ {
+ return $this->line;
+ }
+
+ public function wasSuppressed(): bool
+ {
+ return $this->suppressed;
+ }
+
+ public function ignoredByBaseline(): bool
+ {
+ return $this->ignoredByBaseline;
+ }
+
+ public function asString(): string
+ {
+ $message = $this->message;
+
+ if (!empty($message)) {
+ $message = PHP_EOL . $message;
+ }
+
+ $details = [$this->dataProvider->className() . '::' . $this->dataProvider->methodName()];
+
+ if ($this->suppressed) {
+ $details[] = 'suppressed using operator';
+ }
+
+ if ($this->ignoredByBaseline) {
+ $details[] = 'ignored by baseline';
+ }
+
+ return sprintf(
+ 'Data Provider Triggered Warning (%s)%s',
+ implode(', ', $details),
+ $message,
+ );
+ }
+}
diff --git a/src/Event/Events/DataProvider/Issue/WarningTriggeredSubscriber.php b/src/Event/Events/DataProvider/Issue/WarningTriggeredSubscriber.php
new file mode 100644
index 00000000000..6b8a78108bd
--- /dev/null
+++ b/src/Event/Events/DataProvider/Issue/WarningTriggeredSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface WarningTriggeredSubscriber extends Subscriber
+{
+ public function notify(WarningTriggered $event): void;
+}
diff --git a/src/Event/Events/DataProvider/Lifecycle/MethodCalled.php b/src/Event/Events/DataProvider/Lifecycle/MethodCalled.php
new file mode 100644
index 00000000000..3e930d513e0
--- /dev/null
+++ b/src/Event/Events/DataProvider/Lifecycle/MethodCalled.php
@@ -0,0 +1,60 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use function sprintf;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry\Info;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class MethodCalled implements Event
+{
+ private Info $telemetryInfo;
+ private ClassMethod $testMethod;
+ private ClassMethod $dataProviderMethod;
+
+ public function __construct(Info $telemetryInfo, ClassMethod $testMethod, ClassMethod $dataProviderMethod)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->testMethod = $testMethod;
+ $this->dataProviderMethod = $dataProviderMethod;
+ }
+
+ public function telemetryInfo(): Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function testMethod(): ClassMethod
+ {
+ return $this->testMethod;
+ }
+
+ public function dataProviderMethod(): ClassMethod
+ {
+ return $this->dataProviderMethod;
+ }
+
+ public function asString(): string
+ {
+ return sprintf(
+ 'Data Provider Method Called (%s::%s for test method %s::%s)',
+ $this->dataProviderMethod->className(),
+ $this->dataProviderMethod->methodName(),
+ $this->testMethod->className(),
+ $this->testMethod->methodName(),
+ );
+ }
+}
diff --git a/src/Event/Events/DataProvider/Lifecycle/MethodCalledSubscriber.php b/src/Event/Events/DataProvider/Lifecycle/MethodCalledSubscriber.php
new file mode 100644
index 00000000000..d8023a890b2
--- /dev/null
+++ b/src/Event/Events/DataProvider/Lifecycle/MethodCalledSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface MethodCalledSubscriber extends Subscriber
+{
+ public function notify(MethodCalled $event): void;
+}
diff --git a/src/Event/Events/DataProvider/Lifecycle/MethodFinished.php b/src/Event/Events/DataProvider/Lifecycle/MethodFinished.php
new file mode 100644
index 00000000000..dc61f419453
--- /dev/null
+++ b/src/Event/Events/DataProvider/Lifecycle/MethodFinished.php
@@ -0,0 +1,77 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use function sprintf;
+use PHPUnit\Event\Code;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Event;
+use PHPUnit\Event\Telemetry;
+
+/**
+ * @psalm-immutable
+ *
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+final readonly class MethodFinished implements Event
+{
+ private Telemetry\Info $telemetryInfo;
+ private ClassMethod $testMethod;
+
+ /**
+ * @psalm-var list
+ */
+ private array $calledMethods;
+
+ public function __construct(Telemetry\Info $telemetryInfo, ClassMethod $testMethod, ClassMethod ...$calledMethods)
+ {
+ $this->telemetryInfo = $telemetryInfo;
+ $this->testMethod = $testMethod;
+ $this->calledMethods = $calledMethods;
+ }
+
+ public function telemetryInfo(): Telemetry\Info
+ {
+ return $this->telemetryInfo;
+ }
+
+ public function testMethod(): ClassMethod
+ {
+ return $this->testMethod;
+ }
+
+ /**
+ * @psalm-return list
+ */
+ public function calledMethods(): array
+ {
+ return $this->calledMethods;
+ }
+
+ public function asString(): string
+ {
+ $buffer = sprintf(
+ 'Data Provider Method Finished for %s::%s:',
+ $this->testMethod->className(),
+ $this->testMethod->methodName(),
+ );
+
+ foreach ($this->calledMethods as $calledMethod) {
+ $buffer .= sprintf(
+ PHP_EOL . '- %s::%s',
+ $calledMethod->className(),
+ $calledMethod->methodName(),
+ );
+ }
+
+ return $buffer;
+ }
+}
diff --git a/src/Event/Events/DataProvider/Lifecycle/MethodFinishedSubscriber.php b/src/Event/Events/DataProvider/Lifecycle/MethodFinishedSubscriber.php
new file mode 100644
index 00000000000..40583481a0e
--- /dev/null
+++ b/src/Event/Events/DataProvider/Lifecycle/MethodFinishedSubscriber.php
@@ -0,0 +1,20 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\Subscriber;
+
+/**
+ * @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ */
+interface MethodFinishedSubscriber extends Subscriber
+{
+ public function notify(MethodFinished $event): void;
+}
diff --git a/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php b/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php
index 5581f7dda04..2799f5c035c 100644
--- a/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php
+++ b/src/Event/Events/Test/Lifecycle/DataProviderMethodCalled.php
@@ -18,6 +18,8 @@
* @psalm-immutable
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ *
+ * @deprecated Use PHPUnit\Event\DataProvider\MethodCalled instead
*/
final readonly class DataProviderMethodCalled implements Event
{
diff --git a/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php b/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php
index 5f7d4013bb6..3a50f553fd4 100644
--- a/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php
+++ b/src/Event/Events/Test/Lifecycle/DataProviderMethodCalledSubscriber.php
@@ -13,6 +13,8 @@
/**
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ *
+ * @deprecated Use PHPUnit\Event\DataProvider\MethodCalled\Subscriber instead
*/
interface DataProviderMethodCalledSubscriber extends Subscriber
{
diff --git a/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php b/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php
index f12c0f2b9e4..03be69129e2 100644
--- a/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php
+++ b/src/Event/Events/Test/Lifecycle/DataProviderMethodFinished.php
@@ -20,6 +20,8 @@
* @psalm-immutable
*
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ *
+ * @deprecated Use PHPUnit\Event\DataProvider\MethodFinished instead
*/
final readonly class DataProviderMethodFinished implements Event
{
diff --git a/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php b/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php
index 624f8921d96..703fc0d7e22 100644
--- a/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php
+++ b/src/Event/Events/Test/Lifecycle/DataProviderMethodFinishedSubscriber.php
@@ -13,6 +13,8 @@
/**
* @no-named-arguments Parameter names are not covered by the backward compatibility promise for PHPUnit
+ *
+ * @deprecated Use PHPUnit\Event\DataProvider\MethodFinishedSubscriber instead
*/
interface DataProviderMethodFinishedSubscriber extends Subscriber
{
diff --git a/src/Event/Exception/NoDataProviderOnCallStackException.php b/src/Event/Exception/NoDataProviderOnCallStackException.php
new file mode 100644
index 00000000000..3bac40bbb8e
--- /dev/null
+++ b/src/Event/Exception/NoDataProviderOnCallStackException.php
@@ -0,0 +1,24 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\Code;
+
+use PHPUnit\Event\Exception;
+use RuntimeException;
+
+/**
+ * @internal This class is not covered by the backward compatibility promise for PHPUnit
+ */
+final class NoDataProviderOnCallStackException extends RuntimeException implements Exception
+{
+ public function __construct()
+ {
+ parent::__construct('Cannot find data provider method on call stack');
+ }
+}
diff --git a/src/Event/Facade.php b/src/Event/Facade.php
index aad8d6846c1..1a553d01941 100644
--- a/src/Event/Facade.php
+++ b/src/Event/Facade.php
@@ -168,6 +168,16 @@ private function registerDefaultTypes(TypeMap $typeMap): void
Application\Started::class,
Application\Finished::class,
+ DataProvider\MethodCalled::class,
+ DataProvider\MethodFinished::class,
+ DataProvider\DeprecationTriggered::class,
+ DataProvider\ErrorTriggered::class,
+ DataProvider\NoticeTriggered::class,
+ DataProvider\WarningTriggered::class,
+ DataProvider\PhpDeprecationTriggered::class,
+ DataProvider\PhpNoticeTriggered::class,
+ DataProvider\PhpWarningTriggered::class,
+
Test\DataProviderMethodCalled::class,
Test\DataProviderMethodFinished::class,
Test\MarkedIncomplete::class,
diff --git a/src/Framework/TestRunner.php b/src/Framework/TestRunner.php
index e41a44bfcb6..e1772cca44d 100644
--- a/src/Framework/TestRunner.php
+++ b/src/Framework/TestRunner.php
@@ -80,7 +80,7 @@ public function run(TestCase $test): void
$skipped = false;
if ($this->shouldErrorHandlerBeUsed($test)) {
- ErrorHandler::instance()->enable();
+ ErrorHandler::instance()->enableForTest();
}
$collectCodeCoverage = CodeCoverage::instance()->isActive() &&
@@ -191,7 +191,7 @@ public function run(TestCase $test): void
}
}
- ErrorHandler::instance()->disable();
+ ErrorHandler::instance()->disableForTest();
if (!$error &&
!$incomplete &&
diff --git a/src/Metadata/Api/DataProvider.php b/src/Metadata/Api/DataProvider.php
index b2221e68c86..531a1bd813a 100644
--- a/src/Metadata/Api/DataProvider.php
+++ b/src/Metadata/Api/DataProvider.php
@@ -32,6 +32,7 @@
use PHPUnit\Metadata\MetadataCollection;
use PHPUnit\Metadata\Parser\Registry as MetadataRegistry;
use PHPUnit\Metadata\TestWith;
+use PHPUnit\Runner\ErrorHandler;
use ReflectionClass;
use ReflectionMethod;
use Throwable;
@@ -143,7 +144,10 @@ private function dataProvidedByMethods(string $className, string $methodName, Me
$className = $_dataProvider->className();
$methodName = $_dataProvider->methodName();
- $data = $className::$methodName();
+
+ ErrorHandler::instance()->enableForDataProvider();
+
+ $data = $className::$methodName();
} catch (Throwable $e) {
Event\Facade::emitter()->dataProviderMethodFinished(
$testMethod,
@@ -155,6 +159,8 @@ private function dataProvidedByMethods(string $className, string $methodName, Me
$e->getCode(),
$e,
);
+ } finally {
+ ErrorHandler::instance()->disableForDataProvider();
}
if ($data instanceof Traversable) {
diff --git a/src/Runner/ErrorHandler.php b/src/Runner/ErrorHandler.php
index ba0f41e1545..ab7a0192fca 100644
--- a/src/Runner/ErrorHandler.php
+++ b/src/Runner/ErrorHandler.php
@@ -33,15 +33,18 @@
use function restore_error_handler;
use function set_error_handler;
use PHPUnit\Event;
+use PHPUnit\Event\Code\ClassMethod;
use PHPUnit\Event\Code\IssueTrigger\IssueTrigger;
+use PHPUnit\Event\Code\NoDataProviderOnCallStackException;
use PHPUnit\Event\Code\NoTestCaseObjectOnCallStackException;
-use PHPUnit\Event\Code\TestMethod;
+use PHPUnit\Metadata\Api\DataProvider;
use PHPUnit\Runner\Baseline\Baseline;
use PHPUnit\Runner\Baseline\Issue;
use PHPUnit\TextUI\Configuration\Registry;
use PHPUnit\TextUI\Configuration\Source;
use PHPUnit\TextUI\Configuration\SourceFilter;
use PHPUnit\Util\ExcludeList;
+use ReflectionClass;
/**
* @internal This class is not covered by the backward compatibility promise for PHPUnit
@@ -52,7 +55,8 @@ final class ErrorHandler
private const INSUPPRESSIBLE_LEVELS = E_ERROR | E_PARSE | E_CORE_ERROR | E_COMPILE_ERROR | E_USER_ERROR | E_RECOVERABLE_ERROR;
private static ?self $instance = null;
private ?Baseline $baseline = null;
- private bool $enabled = false;
+ private bool $enabledForDataProvider = false;
+ private bool $enabledForTest = false;
private ?int $originalErrorReportingLevel = null;
private readonly Source $source;
private readonly SourceFilter $sourceFilter;
@@ -74,6 +78,7 @@ private function __construct(Source $source)
}
/**
+ * @throws NoDataProviderOnCallStackException
* @throws NoTestCaseObjectOnCallStackException
*/
public function __invoke(int $errorNumber, string $errorString, string $errorFile, int $errorLine): bool
@@ -84,10 +89,113 @@ public function __invoke(int $errorNumber, string $errorString, string $errorFil
return false;
}
- $test = Event\Code\TestMethodBuilder::fromCallStack();
-
$ignoredByBaseline = $this->ignoredByBaseline($errorFile, $errorLine, $errorString);
- $ignoredByTest = $test->metadata()->isIgnoreDeprecations()->isNotEmpty();
+
+ if ($this->enabledForTest) {
+ return $this->processForTest($errorNumber, $errorString, $errorFile, $errorLine, $suppressed, $ignoredByBaseline);
+ }
+
+ if ($this->enabledForDataProvider) {
+ return $this->processForDataProvider($errorNumber, $errorString, $errorFile, $errorLine, $suppressed, $ignoredByBaseline);
+ }
+
+ return false;
+ }
+
+ public function enableForDataProvider(): void
+ {
+ if (!$this->enable()) {
+ return;
+ }
+
+ $this->enabledForDataProvider = true;
+ }
+
+ public function disableForDataProvider(): void
+ {
+ if (!$this->enabledForDataProvider) {
+ return;
+ }
+
+ $this->enabledForDataProvider = false;
+
+ $this->disable();
+ }
+
+ public function enableForTest(): void
+ {
+ if (!$this->enable()) {
+ return;
+ }
+
+ $this->enabledForTest = true;
+ }
+
+ public function disableForTest(): void
+ {
+ if (!$this->enabledForTest) {
+ return;
+ }
+
+ $this->enabledForTest = false;
+
+ $this->disable();
+ }
+
+ public function useBaseline(Baseline $baseline): void
+ {
+ $this->baseline = $baseline;
+ }
+
+ /**
+ * @psalm-param array{functions: list, methods: list} $deprecationTriggers
+ */
+ public function useDeprecationTriggers(array $deprecationTriggers): void
+ {
+ $this->deprecationTriggers = $deprecationTriggers;
+ }
+
+ private function enable(): bool
+ {
+ if ($this->enabledForDataProvider || $this->enabledForTest) {
+ return true;
+ }
+
+ $oldErrorHandler = set_error_handler($this);
+
+ if ($oldErrorHandler !== null) {
+ restore_error_handler();
+
+ return false;
+ }
+
+ $this->originalErrorReportingLevel = error_reporting();
+
+ error_reporting($this->originalErrorReportingLevel & self::UNHANDLEABLE_LEVELS);
+
+ return true;
+ }
+
+ private function disable(): void
+ {
+ if ($this->enabledForDataProvider || $this->enabledForTest) {
+ return;
+ }
+
+ restore_error_handler();
+
+ error_reporting(error_reporting() | $this->originalErrorReportingLevel);
+
+ $this->originalErrorReportingLevel = null;
+ }
+
+ /**
+ * @throws NoTestCaseObjectOnCallStackException
+ */
+ private function processForTest(int $errorNumber, string $errorString, string $errorFile, int $errorLine, bool $suppressed, bool $ignoredByBaseline): bool
+ {
+ $test = Event\Code\TestMethodBuilder::fromCallStack();
+ $ignoredByTest = $test->metadata()->isIgnoreDeprecations()->isNotEmpty();
switch ($errorNumber) {
case E_NOTICE:
@@ -148,7 +256,7 @@ public function __invoke(int $errorNumber, string $errorString, string $errorFil
$suppressed,
$ignoredByBaseline,
$ignoredByTest,
- $this->trigger($test, false),
+ $this->trigger($test->file(), false),
);
break;
@@ -162,7 +270,7 @@ public function __invoke(int $errorNumber, string $errorString, string $errorFil
$suppressed,
$ignoredByBaseline,
$ignoredByTest,
- $this->trigger($test, true),
+ $this->trigger($test->file(), true),
);
break;
@@ -185,51 +293,105 @@ public function __invoke(int $errorNumber, string $errorString, string $errorFil
return false;
}
- public function enable(): void
+ /**
+ * @throws NoDataProviderOnCallStackException
+ */
+ private function processForDataProvider(int $errorNumber, string $errorString, string $errorFile, int $errorLine, bool $suppressed, bool $ignoredByBaseline): bool
{
- if ($this->enabled) {
- return;
- }
+ $dataProvider = $this->findDataProviderMethodOnCallStack();
- $oldErrorHandler = set_error_handler($this);
+ switch ($errorNumber) {
+ case E_NOTICE:
+ case E_STRICT:
+ Event\Facade::emitter()->dataProviderTriggeredPhpNotice(
+ $dataProvider['method'],
+ $errorString,
+ $errorFile,
+ $errorLine,
+ $suppressed,
+ $ignoredByBaseline,
+ );
- if ($oldErrorHandler !== null) {
- restore_error_handler();
+ break;
- return;
- }
+ case E_USER_NOTICE:
+ Event\Facade::emitter()->dataProviderTriggeredNotice(
+ $dataProvider['method'],
+ $errorString,
+ $errorFile,
+ $errorLine,
+ $suppressed,
+ $ignoredByBaseline,
+ );
- $this->enabled = true;
- $this->originalErrorReportingLevel = error_reporting();
+ break;
- error_reporting($this->originalErrorReportingLevel & self::UNHANDLEABLE_LEVELS);
- }
+ case E_WARNING:
+ Event\Facade::emitter()->dataProviderTriggeredPhpWarning(
+ $dataProvider['method'],
+ $errorString,
+ $errorFile,
+ $errorLine,
+ $suppressed,
+ $ignoredByBaseline,
+ );
- public function disable(): void
- {
- if (!$this->enabled) {
- return;
- }
+ break;
- restore_error_handler();
+ case E_USER_WARNING:
+ Event\Facade::emitter()->dataProviderTriggeredWarning(
+ $dataProvider['method'],
+ $errorString,
+ $errorFile,
+ $errorLine,
+ $suppressed,
+ $ignoredByBaseline,
+ );
- error_reporting(error_reporting() | $this->originalErrorReportingLevel);
+ break;
- $this->enabled = false;
- $this->originalErrorReportingLevel = null;
- }
+ case E_DEPRECATED:
+ Event\Facade::emitter()->dataProviderTriggeredPhpDeprecation(
+ $dataProvider['method'],
+ $errorString,
+ $errorFile,
+ $errorLine,
+ $suppressed,
+ $ignoredByBaseline,
+ $this->trigger($dataProvider['file'], false),
+ );
- public function useBaseline(Baseline $baseline): void
- {
- $this->baseline = $baseline;
- }
+ break;
- /**
- * @psalm-param array{functions: list, methods: list} $deprecationTriggers
- */
- public function useDeprecationTriggers(array $deprecationTriggers): void
- {
- $this->deprecationTriggers = $deprecationTriggers;
+ case E_USER_DEPRECATED:
+ Event\Facade::emitter()->dataProviderTriggeredDeprecation(
+ $dataProvider['method'],
+ $errorString,
+ $errorFile,
+ $errorLine,
+ $suppressed,
+ $ignoredByBaseline,
+ $this->trigger($dataProvider['file'], true),
+ );
+
+ break;
+
+ case E_USER_ERROR:
+ Event\Facade::emitter()->dataProviderTriggeredError(
+ $dataProvider['method'],
+ $errorString,
+ $errorFile,
+ $errorLine,
+ $suppressed,
+ );
+
+ throw new ErrorException('E_USER_ERROR was triggered');
+
+ default:
+ return false;
+ }
+
+ return false;
}
/**
@@ -246,7 +408,10 @@ private function ignoredByBaseline(string $file, int $line, string $description)
return $this->baseline->has(Issue::from($file, $line, null, $description));
}
- private function trigger(TestMethod $test, bool $filterTrigger): IssueTrigger
+ /**
+ * @psalm-param non-empty-string $file
+ */
+ private function trigger(string $file, bool $filterTrigger): IssueTrigger
{
if (!$this->source->notEmpty()) {
return IssueTrigger::unknown();
@@ -260,12 +425,12 @@ private function trigger(TestMethod $test, bool $filterTrigger): IssueTrigger
$triggeredInFirstPartyCode = false;
$triggerCalledFromFirstPartyCode = false;
- if ($trace[0]['file'] === $test->file() ||
+ if ($trace[0]['file'] === $file ||
$this->sourceFilter->includes($this->source, $trace[0]['file'])) {
$triggeredInFirstPartyCode = true;
}
- if ($trace[1]['file'] === $test->file() ||
+ if ($trace[1]['file'] === $file ||
$this->sourceFilter->includes($this->source, $trace[1]['file'])) {
$triggerCalledFromFirstPartyCode = true;
}
@@ -285,8 +450,8 @@ private function filteredStackTrace(bool $filterDeprecationTriggers): array
{
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
- // self::filteredStackTrace(), self::trigger(), self::__invoke()
- unset($trace[0], $trace[1], $trace[2]);
+ // self::filteredStackTrace(), self::trigger(), self::processForTest(), self::__invoke()
+ unset($trace[0], $trace[1], $trace[2], $trace[3]);
if ($this->deprecationTriggers === null || !$filterDeprecationTriggers) {
return array_values($trace);
@@ -317,4 +482,46 @@ private function filteredStackTrace(bool $filterDeprecationTriggers): array
return array_values($trace);
}
+
+ /**
+ * @psalm-return array{file: non-empty-string, method: ClassMethod}
+ *
+ * @throws NoDataProviderOnCallStackException
+ */
+ private function findDataProviderMethodOnCallStack(): array
+ {
+ $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+ $dataProviderFrame = false;
+
+ foreach (array_keys($trace) as $frame) {
+ if (!isset($trace[$frame]['class'])) {
+ continue;
+ }
+
+ if ($trace[$frame]['class'] === DataProvider::class) {
+ // PHPUnit\Metadata\Api\DataProvider::dataProvidedByMethods()
+ $dataProviderFrame = $frame - 1;
+
+ break;
+ }
+ }
+
+ if ($dataProviderFrame === false) {
+ throw new NoDataProviderOnCallStackException;
+ }
+
+ assert(isset($trace[$dataProviderFrame]));
+ assert(isset($trace[$dataProviderFrame]['class']));
+ assert(isset($trace[$dataProviderFrame]['function']));
+ assert($trace[$dataProviderFrame]['function'] !== '');
+
+ /** @noinspection PhpUnhandledExceptionInspection */
+ return [
+ 'file' => (new ReflectionClass($trace[$dataProviderFrame]['class']))->getFileName(),
+ 'method' => new ClassMethod(
+ $trace[$dataProviderFrame]['class'],
+ $trace[$dataProviderFrame]['function'],
+ ),
+ ];
+ }
}
diff --git a/tests/end-to-end/event/_files/DataProviderDeprecationTest.php b/tests/end-to-end/event/_files/DataProviderDeprecationTest.php
new file mode 100644
index 00000000000..dbc5075401d
--- /dev/null
+++ b/tests/end-to-end/event/_files/DataProviderDeprecationTest.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\TestFixture\Event;
+
+use function trigger_error;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+final class DataProviderDeprecationTest extends TestCase
+{
+ public static function values(): array
+ {
+ trigger_error('message', E_USER_DEPRECATED);
+
+ return [[true], [true]];
+ }
+
+ #[DataProvider('values')]
+ public function testSuccess(bool $value): void
+ {
+ $this->assertTrue($value);
+ }
+}
diff --git a/tests/end-to-end/event/_files/DataProviderErrorTest.php b/tests/end-to-end/event/_files/DataProviderErrorTest.php
new file mode 100644
index 00000000000..3f4f0918f72
--- /dev/null
+++ b/tests/end-to-end/event/_files/DataProviderErrorTest.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\TestFixture\Event;
+
+use function trigger_error;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+final class DataProviderErrorTest extends TestCase
+{
+ public static function values(): array
+ {
+ trigger_error('message', E_USER_ERROR);
+
+ return [[true], [true]];
+ }
+
+ #[DataProvider('values')]
+ public function testSuccess(bool $value): void
+ {
+ $this->assertTrue($value);
+ }
+}
diff --git a/tests/end-to-end/event/_files/DataProviderNoticeTest.php b/tests/end-to-end/event/_files/DataProviderNoticeTest.php
new file mode 100644
index 00000000000..bcd74b3f225
--- /dev/null
+++ b/tests/end-to-end/event/_files/DataProviderNoticeTest.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\TestFixture\Event;
+
+use function trigger_error;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+final class DataProviderNoticeTest extends TestCase
+{
+ public static function values(): array
+ {
+ trigger_error('message', E_USER_NOTICE);
+
+ return [[true], [true]];
+ }
+
+ #[DataProvider('values')]
+ public function testSuccess(bool $value): void
+ {
+ $this->assertTrue($value);
+ }
+}
diff --git a/tests/end-to-end/event/_files/DataProviderPhpDeprecationTest.php b/tests/end-to-end/event/_files/DataProviderPhpDeprecationTest.php
new file mode 100644
index 00000000000..76a7d3c7ec0
--- /dev/null
+++ b/tests/end-to-end/event/_files/DataProviderPhpDeprecationTest.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\TestFixture\Event;
+
+use function strlen;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+final class DataProviderPhpDeprecationTest extends TestCase
+{
+ public static function values(): array
+ {
+ strlen(null);
+
+ return [[true], [true]];
+ }
+
+ #[DataProvider('values')]
+ public function testSuccess(bool $value): void
+ {
+ $this->assertTrue($value);
+ }
+}
diff --git a/tests/end-to-end/event/_files/DataProviderPhpNoticeTest.php b/tests/end-to-end/event/_files/DataProviderPhpNoticeTest.php
new file mode 100644
index 00000000000..db3b5abbef1
--- /dev/null
+++ b/tests/end-to-end/event/_files/DataProviderPhpNoticeTest.php
@@ -0,0 +1,33 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\TestFixture\Event;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+final class DataProviderPhpNoticeTest extends TestCase
+{
+ public static function values(): array
+ {
+ $f = static function (): void
+ {
+ };
+
+ $a = &$f();
+
+ return [[true], [true]];
+ }
+
+ #[DataProvider('values')]
+ public function testSuccess(bool $value): void
+ {
+ $this->assertTrue($value);
+ }
+}
diff --git a/tests/end-to-end/event/_files/DataProviderPhpWarningTest.php b/tests/end-to-end/event/_files/DataProviderPhpWarningTest.php
new file mode 100644
index 00000000000..ed7c597a498
--- /dev/null
+++ b/tests/end-to-end/event/_files/DataProviderPhpWarningTest.php
@@ -0,0 +1,29 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\TestFixture\Event;
+
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+final class DataProviderPhpWarningTest extends TestCase
+{
+ public static function values(): array
+ {
+ $a = $b;
+
+ return [[true], [true]];
+ }
+
+ #[DataProvider('values')]
+ public function testSuccess(bool $value): void
+ {
+ $this->assertTrue($value);
+ }
+}
diff --git a/tests/end-to-end/event/_files/DataProviderWarningTest.php b/tests/end-to-end/event/_files/DataProviderWarningTest.php
new file mode 100644
index 00000000000..c121ce768b7
--- /dev/null
+++ b/tests/end-to-end/event/_files/DataProviderWarningTest.php
@@ -0,0 +1,30 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\TestFixture\Event;
+
+use function trigger_error;
+use PHPUnit\Framework\Attributes\DataProvider;
+use PHPUnit\Framework\TestCase;
+
+final class DataProviderWarningTest extends TestCase
+{
+ public static function values(): array
+ {
+ trigger_error('message', E_USER_WARNING);
+
+ return [[true], [true]];
+ }
+
+ #[DataProvider('values')]
+ public function testSuccess(bool $value): void
+ {
+ $this->assertTrue($value);
+ }
+}
diff --git a/tests/end-to-end/event/data-provider-deprecation.phpt b/tests/end-to-end/event/data-provider-deprecation.phpt
new file mode 100644
index 00000000000..1114ed43b1f
--- /dev/null
+++ b/tests/end-to-end/event/data-provider-deprecation.phpt
@@ -0,0 +1,53 @@
+--TEST--
+The right events are emitted in the right order for a successful test that uses a data provider which triggers E_USER_DEPRECATED
+--XFAIL--
+Trigger (self, direct, indirect, unknown) for errors in data providers is not yet detected correctly
+--FILE--
+run($_SERVER['argv']);
+
+print file_get_contents($traceFile);
+
+unlink($traceFile);
+--EXPECTF--
+PHPUnit Started (PHPUnit %s using %s)
+Test Runner Configured
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::values for test method PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::values for test method PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess)
+Data Provider Triggered Deprecation (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::values, issue triggered by first-party code calling into first-party code)
+message
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderDeprecationTest::values
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderDeprecationTest::values
+Test Suite Loaded (2 tests)
+Event Facade Sealed
+Test Runner Started
+Test Suite Sorted
+Test Runner Execution Started (2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderDeprecationTest, 2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess, 2 tests)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess#0)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess#0)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess#0)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess#0)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess#1)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess#1)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess#1)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess#1)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderDeprecationTest::testSuccess, 2 tests)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderDeprecationTest, 2 tests)
+Test Runner Execution Finished
+Test Runner Finished
+PHPUnit Finished (Shell Exit Code: 0)
diff --git a/tests/end-to-end/event/data-provider-duplicate-key.phpt b/tests/end-to-end/event/data-provider-duplicate-key.phpt
index 4fa48f82cda..297930a3c19 100644
--- a/tests/end-to-end/event/data-provider-duplicate-key.phpt
+++ b/tests/end-to-end/event/data-provider-duplicate-key.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::provider for test method PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::testSomething)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::provider for test method PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::testSomething)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::testSomething:
+- PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::provider
Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::testSomething:
- PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::provider
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\DataProviderDuplicateKeyTest::testSomething)
diff --git a/tests/end-to-end/event/data-provider-empty.phpt b/tests/end-to-end/event/data-provider-empty.phpt
index 4e028a1782e..8e49c8b8228 100644
--- a/tests/end-to-end/event/data-provider-empty.phpt
+++ b/tests/end-to-end/event/data-provider-empty.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\EmptyDataProviderTest::providerMethod for test method PHPUnit\TestFixture\Event\EmptyDataProviderTest::testCase)
+Data Provider Method Called (PHPUnit\TestFixture\Event\EmptyDataProviderTest::providerMethod for test method PHPUnit\TestFixture\Event\EmptyDataProviderTest::testCase)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\EmptyDataProviderTest::testCase:
+- PHPUnit\TestFixture\Event\EmptyDataProviderTest::providerMethod
Data Provider Method Finished for PHPUnit\TestFixture\Event\EmptyDataProviderTest::testCase:
- PHPUnit\TestFixture\Event\EmptyDataProviderTest::providerMethod
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\EmptyDataProviderTest::testCase)
diff --git a/tests/end-to-end/event/data-provider-error.phpt b/tests/end-to-end/event/data-provider-error.phpt
new file mode 100644
index 00000000000..2f4a13a1e96
--- /dev/null
+++ b/tests/end-to-end/event/data-provider-error.phpt
@@ -0,0 +1,43 @@
+--TEST--
+The right events are emitted in the right order for a successful test that uses a data provider which triggers E_USER_ERROR
+--FILE--
+run($_SERVER['argv']);
+
+print file_get_contents($traceFile);
+
+unlink($traceFile);
+--EXPECTF--
+PHPUnit Started (PHPUnit %s using %s)
+Test Runner Configured
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderErrorTest::values for test method PHPUnit\TestFixture\Event\DataProviderErrorTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderErrorTest::values for test method PHPUnit\TestFixture\Event\DataProviderErrorTest::testSuccess)
+Data Provider Triggered Error (PHPUnit\TestFixture\Event\DataProviderErrorTest::values)
+message
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderErrorTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderErrorTest::values
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderErrorTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderErrorTest::values
+Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\DataProviderErrorTest::testSuccess)
+The data provider specified for PHPUnit\TestFixture\Event\DataProviderErrorTest::testSuccess is invalid
+E_USER_ERROR was triggered
+Test Runner Triggered Warning (No tests found in class "PHPUnit\TestFixture\Event\DataProviderErrorTest".)
+Test Suite Loaded (0 tests)
+Event Facade Sealed
+Test Runner Started
+Test Suite Sorted
+Test Runner Execution Started (0 tests)
+Test Runner Execution Finished
+Test Runner Finished
+PHPUnit Finished (Shell Exit Code: 2)
diff --git a/tests/end-to-end/event/data-provider-exception.phpt b/tests/end-to-end/event/data-provider-exception.phpt
index 49713099035..f08c71d4d64 100644
--- a/tests/end-to-end/event/data-provider-exception.phpt
+++ b/tests/end-to-end/event/data-provider-exception.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::provider for test method PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::testOne)
+Data Provider Method Called (PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::provider for test method PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::testOne)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::testOne:
+- PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::provider
Data Provider Method Finished for PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::testOne:
- PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::provider
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\ExceptionInDataProviderTest::testOne)
diff --git a/tests/end-to-end/event/data-provider-expects-argument.phpt b/tests/end-to-end/event/data-provider-expects-argument.phpt
index 61964103061..e0e85caf679 100644
--- a/tests/end-to-end/event/data-provider-expects-argument.phpt
+++ b/tests/end-to-end/event/data-provider-expects-argument.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\ArgumentDataProviderTest::values for test method PHPUnit\TestFixture\Event\ArgumentDataProviderTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\ArgumentDataProviderTest::values for test method PHPUnit\TestFixture\Event\ArgumentDataProviderTest::testSuccess)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\ArgumentDataProviderTest::testSuccess:
+- PHPUnit\TestFixture\Event\ArgumentDataProviderTest::values
Data Provider Method Finished for PHPUnit\TestFixture\Event\ArgumentDataProviderTest::testSuccess:
- PHPUnit\TestFixture\Event\ArgumentDataProviderTest::values
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\ArgumentDataProviderTest::testSuccess)
diff --git a/tests/end-to-end/event/data-provider-external.phpt b/tests/end-to-end/event/data-provider-external.phpt
index 59279e4490f..96fa8f6c90a 100644
--- a/tests/end-to-end/event/data-provider-external.phpt
+++ b/tests/end-to-end/event/data-provider-external.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\DataProvider::values for test method PHPUnit\TestFixture\Event\DataProviderExternalTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProvider::values for test method PHPUnit\TestFixture\Event\DataProviderExternalTest::testSuccess)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderExternalTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProvider::values
Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderExternalTest::testSuccess:
- PHPUnit\TestFixture\Event\DataProvider::values
Test Suite Loaded (2 tests)
diff --git a/tests/end-to-end/event/data-provider-invalid-argument-name.phpt b/tests/end-to-end/event/data-provider-invalid-argument-name.phpt
index 41ceb531259..c72e4e675d6 100644
--- a/tests/end-to-end/event/data-provider-invalid-argument-name.phpt
+++ b/tests/end-to-end/event/data-provider-invalid-argument-name.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::values for test method PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::values for test method PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess:
+- PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::values
Data Provider Method Finished for PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::testSuccess:
- PHPUnit\TestFixture\Event\InvalidParameterNameDataProviderTest::values
Test Suite Loaded (2 tests)
diff --git a/tests/end-to-end/event/data-provider-not-public.phpt b/tests/end-to-end/event/data-provider-not-public.phpt
index d5e59a908e8..9d4b645c4a2 100644
--- a/tests/end-to-end/event/data-provider-not-public.phpt
+++ b/tests/end-to-end/event/data-provider-not-public.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\PrivateDataProviderTest::values for test method PHPUnit\TestFixture\Event\PrivateDataProviderTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\PrivateDataProviderTest::values for test method PHPUnit\TestFixture\Event\PrivateDataProviderTest::testSuccess)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\PrivateDataProviderTest::testSuccess:
+- PHPUnit\TestFixture\Event\PrivateDataProviderTest::values
Data Provider Method Finished for PHPUnit\TestFixture\Event\PrivateDataProviderTest::testSuccess:
- PHPUnit\TestFixture\Event\PrivateDataProviderTest::values
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\PrivateDataProviderTest::testSuccess)
diff --git a/tests/end-to-end/event/data-provider-not-static.phpt b/tests/end-to-end/event/data-provider-not-static.phpt
index 60618a6a417..ddaf305d4dd 100644
--- a/tests/end-to-end/event/data-provider-not-static.phpt
+++ b/tests/end-to-end/event/data-provider-not-static.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\DynamicDataProviderTest::values for test method PHPUnit\TestFixture\Event\DynamicDataProviderTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DynamicDataProviderTest::values for test method PHPUnit\TestFixture\Event\DynamicDataProviderTest::testSuccess)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DynamicDataProviderTest::testSuccess:
+- PHPUnit\TestFixture\Event\DynamicDataProviderTest::values
Data Provider Method Finished for PHPUnit\TestFixture\Event\DynamicDataProviderTest::testSuccess:
- PHPUnit\TestFixture\Event\DynamicDataProviderTest::values
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\DynamicDataProviderTest::testSuccess)
diff --git a/tests/end-to-end/event/data-provider-notice.phpt b/tests/end-to-end/event/data-provider-notice.phpt
new file mode 100644
index 00000000000..60d93ce74b4
--- /dev/null
+++ b/tests/end-to-end/event/data-provider-notice.phpt
@@ -0,0 +1,51 @@
+--TEST--
+The right events are emitted in the right order for a successful test that uses a data provider which triggers E_USER_NOTICE
+--FILE--
+run($_SERVER['argv']);
+
+print file_get_contents($traceFile);
+
+unlink($traceFile);
+--EXPECTF--
+PHPUnit Started (PHPUnit %s using %s)
+Test Runner Configured
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderNoticeTest::values for test method PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderNoticeTest::values for test method PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess)
+Data Provider Triggered Notice (PHPUnit\TestFixture\Event\DataProviderNoticeTest::values)
+message
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderNoticeTest::values
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderNoticeTest::values
+Test Suite Loaded (2 tests)
+Event Facade Sealed
+Test Runner Started
+Test Suite Sorted
+Test Runner Execution Started (2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderNoticeTest, 2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess, 2 tests)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess#0)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess#0)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess#0)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess#0)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess#1)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess#1)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess#1)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess#1)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderNoticeTest::testSuccess, 2 tests)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderNoticeTest, 2 tests)
+Test Runner Execution Finished
+Test Runner Finished
+PHPUnit Finished (Shell Exit Code: 0)
diff --git a/tests/end-to-end/event/data-provider-php-deprecation.phpt b/tests/end-to-end/event/data-provider-php-deprecation.phpt
new file mode 100644
index 00000000000..6a180eb2de3
--- /dev/null
+++ b/tests/end-to-end/event/data-provider-php-deprecation.phpt
@@ -0,0 +1,53 @@
+--TEST--
+The right events are emitted in the right order for a successful test that uses a data provider which triggers E_DEPRECATED
+--XFAIL--
+"Data Provider Triggered PHP Deprecation" event is not emitted
+--FILE--
+run($_SERVER['argv']);
+
+print file_get_contents($traceFile);
+
+unlink($traceFile);
+--EXPECTF--
+PHPUnit Started (PHPUnit %s using %s)
+Test Runner Configured
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::values for test method PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::values for test method PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess)
+Data Provider Triggered PHP Deprecation (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::values, issue triggered by first-party code calling into first-party code)
+strlen(): Passing null to parameter #1 ($string) of type string is deprecated
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::values
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::values
+Test Suite Loaded (2 tests)
+Event Facade Sealed
+Test Runner Started
+Test Suite Sorted
+Test Runner Execution Started (2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest, 2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess, 2 tests)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess#0)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess#0)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess#0)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess#0)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess#1)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess#1)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess#1)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess#1)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest::testSuccess, 2 tests)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderPhpDeprecationTest, 2 tests)
+Test Runner Execution Finished
+Test Runner Finished
+PHPUnit Finished (Shell Exit Code: 0)
diff --git a/tests/end-to-end/event/data-provider-php-notice.phpt b/tests/end-to-end/event/data-provider-php-notice.phpt
new file mode 100644
index 00000000000..5e9514d4c62
--- /dev/null
+++ b/tests/end-to-end/event/data-provider-php-notice.phpt
@@ -0,0 +1,51 @@
+--TEST--
+The right events are emitted in the right order for a successful test that uses a data provider which triggers E_NOTICE
+--FILE--
+run($_SERVER['argv']);
+
+print file_get_contents($traceFile);
+
+unlink($traceFile);
+--EXPECTF--
+PHPUnit Started (PHPUnit %s using %s)
+Test Runner Configured
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::values for test method PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::values for test method PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess)
+Data Provider Triggered PHP Notice (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::values)
+Only variables should be assigned by reference
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::values
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::values
+Test Suite Loaded (2 tests)
+Event Facade Sealed
+Test Runner Started
+Test Suite Sorted
+Test Runner Execution Started (2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest, 2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess, 2 tests)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess#0)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess#0)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess#0)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess#0)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess#1)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess#1)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess#1)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess#1)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest::testSuccess, 2 tests)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderPhpNoticeTest, 2 tests)
+Test Runner Execution Finished
+Test Runner Finished
+PHPUnit Finished (Shell Exit Code: 0)
diff --git a/tests/end-to-end/event/data-provider-php-warning.phpt b/tests/end-to-end/event/data-provider-php-warning.phpt
new file mode 100644
index 00000000000..fb60095cc19
--- /dev/null
+++ b/tests/end-to-end/event/data-provider-php-warning.phpt
@@ -0,0 +1,51 @@
+--TEST--
+The right events are emitted in the right order for a successful test that uses a data provider which triggers E_WARNING
+--FILE--
+run($_SERVER['argv']);
+
+print file_get_contents($traceFile);
+
+unlink($traceFile);
+--EXPECTF--
+PHPUnit Started (PHPUnit %s using %s)
+Test Runner Configured
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::values for test method PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::values for test method PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess)
+Data Provider Triggered PHP Warning (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::values)
+Undefined variable $b
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::values
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::values
+Test Suite Loaded (2 tests)
+Event Facade Sealed
+Test Runner Started
+Test Suite Sorted
+Test Runner Execution Started (2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest, 2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess, 2 tests)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess#0)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess#0)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess#0)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess#0)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess#1)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess#1)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess#1)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess#1)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest::testSuccess, 2 tests)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderPhpWarningTest, 2 tests)
+Test Runner Execution Finished
+Test Runner Finished
+PHPUnit Finished (Shell Exit Code: 0)
diff --git a/tests/end-to-end/event/data-provider-warning.phpt b/tests/end-to-end/event/data-provider-warning.phpt
new file mode 100644
index 00000000000..56d1a40ef88
--- /dev/null
+++ b/tests/end-to-end/event/data-provider-warning.phpt
@@ -0,0 +1,51 @@
+--TEST--
+The right events are emitted in the right order for a successful test that uses a data provider which triggers E_USER_WARNING
+--FILE--
+run($_SERVER['argv']);
+
+print file_get_contents($traceFile);
+
+unlink($traceFile);
+--EXPECTF--
+PHPUnit Started (PHPUnit %s using %s)
+Test Runner Configured
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderWarningTest::values for test method PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderWarningTest::values for test method PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess)
+Data Provider Triggered Warning (PHPUnit\TestFixture\Event\DataProviderWarningTest::values)
+message
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderWarningTest::values
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderWarningTest::values
+Test Suite Loaded (2 tests)
+Event Facade Sealed
+Test Runner Started
+Test Suite Sorted
+Test Runner Execution Started (2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderWarningTest, 2 tests)
+Test Suite Started (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess, 2 tests)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess#0)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess#0)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess#0)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess#0)
+Test Preparation Started (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess#1)
+Test Prepared (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess#1)
+Test Passed (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess#1)
+Test Finished (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess#1)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderWarningTest::testSuccess, 2 tests)
+Test Suite Finished (PHPUnit\TestFixture\Event\DataProviderWarningTest, 2 tests)
+Test Runner Execution Finished
+Test Runner Finished
+PHPUnit Finished (Shell Exit Code: 0)
diff --git a/tests/end-to-end/event/data-provider.phpt b/tests/end-to-end/event/data-provider.phpt
index d62b31ee6d9..601ac543b15 100644
--- a/tests/end-to-end/event/data-provider.phpt
+++ b/tests/end-to-end/event/data-provider.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderTest::values for test method PHPUnit\TestFixture\Event\DataProviderTest::testSuccess)
+Data Provider Method Called (PHPUnit\TestFixture\Event\DataProviderTest::values for test method PHPUnit\TestFixture\Event\DataProviderTest::testSuccess)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderTest::testSuccess:
+- PHPUnit\TestFixture\Event\DataProviderTest::values
Data Provider Method Finished for PHPUnit\TestFixture\Event\DataProviderTest::testSuccess:
- PHPUnit\TestFixture\Event\DataProviderTest::values
Test Suite Loaded (2 tests)
diff --git a/tests/end-to-end/event/invalid-data-provider-with-passing-test.phpt b/tests/end-to-end/event/invalid-data-provider-with-passing-test.phpt
index 325d511482b..9ce64baafac 100644
--- a/tests/end-to-end/event/invalid-data-provider-with-passing-test.phpt
+++ b/tests/end-to-end/event/invalid-data-provider-with-passing-test.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::provider for test method PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::testOne)
+Data Provider Method Called (PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::provider for test method PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::testOne)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::testOne:
+- PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::provider
Data Provider Method Finished for PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::testOne:
- PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::provider
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\InvalidDataProviderWithOneTestPassingTest::testOne)
diff --git a/tests/end-to-end/event/invalid-data-provider.phpt b/tests/end-to-end/event/invalid-data-provider.phpt
index ee6c60a4600..30bc6bcf549 100644
--- a/tests/end-to-end/event/invalid-data-provider.phpt
+++ b/tests/end-to-end/event/invalid-data-provider.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Event\InvalidDataProviderTest::provider for test method PHPUnit\TestFixture\Event\InvalidDataProviderTest::testOne)
+Data Provider Method Called (PHPUnit\TestFixture\Event\InvalidDataProviderTest::provider for test method PHPUnit\TestFixture\Event\InvalidDataProviderTest::testOne)
+Data Provider Method Finished for PHPUnit\TestFixture\Event\InvalidDataProviderTest::testOne:
+- PHPUnit\TestFixture\Event\InvalidDataProviderTest::provider
Data Provider Method Finished for PHPUnit\TestFixture\Event\InvalidDataProviderTest::testOne:
- PHPUnit\TestFixture\Event\InvalidDataProviderTest::provider
Test Triggered PHPUnit Error (PHPUnit\TestFixture\Event\InvalidDataProviderTest::testOne)
diff --git a/tests/end-to-end/regression/5287.phpt b/tests/end-to-end/regression/5287.phpt
index d054f63de90..5d9920ac1b5 100644
--- a/tests/end-to-end/regression/5287.phpt
+++ b/tests/end-to-end/regression/5287.phpt
@@ -22,6 +22,9 @@ unlink($traceFile);
PHPUnit Started (PHPUnit %s using %s)
Test Runner Configured
Data Provider Method Called (PHPUnit\TestFixture\Issue5278\A\AnotherClassTest::provide for test method PHPUnit\TestFixture\Issue5278\A\AnotherClassTest::test)
+Data Provider Method Called (PHPUnit\TestFixture\Issue5278\A\AnotherClassTest::provide for test method PHPUnit\TestFixture\Issue5278\A\AnotherClassTest::test)
+Data Provider Method Finished for PHPUnit\TestFixture\Issue5278\A\AnotherClassTest::test:
+- PHPUnit\TestFixture\Issue5278\A\AnotherClassTest::provide
Data Provider Method Finished for PHPUnit\TestFixture\Issue5278\A\AnotherClassTest::test:
- PHPUnit\TestFixture\Issue5278\A\AnotherClassTest::provide
Test Suite Loaded (3 tests)
diff --git a/tests/unit/Event/Events/DataProvider/Issue/DeprecationTriggeredTest.php b/tests/unit/Event/Events/DataProvider/Issue/DeprecationTriggeredTest.php
new file mode 100644
index 00000000000..94ed699e9ad
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Issue/DeprecationTriggeredTest.php
@@ -0,0 +1,89 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Code\IssueTrigger\IssueTrigger;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(DeprecationTriggered::class)]
+#[Small]
+final class DeprecationTriggeredTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $dataProvider = new ClassMethod('the-class', 'the-method');
+ $message = 'message';
+ $file = 'file';
+ $line = 1;
+ $suppressed = false;
+ $ignoredByBaseline = false;
+ $trigger = IssueTrigger::unknown();
+
+ $event = new DeprecationTriggered(
+ $telemetryInfo,
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ $trigger,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($dataProvider, $event->dataProvider());
+ $this->assertSame($message, $event->message());
+ $this->assertSame($file, $event->file());
+ $this->assertSame($line, $event->line());
+ $this->assertSame($suppressed, $event->wasSuppressed());
+ $this->assertSame($ignoredByBaseline, $event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered Deprecation (the-class::the-method, unknown if issue was triggered in first-party code or third-party code)' . PHP_EOL . 'message', $event->asString());
+ $this->assertSame($trigger, $event->trigger());
+ }
+
+ public function testCanBeIgnoredByBaseline(): void
+ {
+ $event = new DeprecationTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ false,
+ true,
+ IssueTrigger::unknown(),
+ );
+
+ $this->assertTrue($event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered Deprecation (the-class::the-method, unknown if issue was triggered in first-party code or third-party code, ignored by baseline)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeSuppressed(): void
+ {
+ $event = new DeprecationTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ true,
+ false,
+ IssueTrigger::unknown(),
+ );
+
+ $this->assertTrue($event->wasSuppressed());
+ $this->assertSame('Data Provider Triggered Deprecation (the-class::the-method, unknown if issue was triggered in first-party code or third-party code, suppressed using operator)' . PHP_EOL . 'message', $event->asString());
+ }
+}
diff --git a/tests/unit/Event/Events/DataProvider/Issue/ErrorTriggeredTest.php b/tests/unit/Event/Events/DataProvider/Issue/ErrorTriggeredTest.php
new file mode 100644
index 00000000000..f5909faeec1
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Issue/ErrorTriggeredTest.php
@@ -0,0 +1,63 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(ErrorTriggered::class)]
+#[Small]
+final class ErrorTriggeredTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $dataProvider = new ClassMethod('the-class', 'the-method');
+ $message = 'message';
+ $file = 'file';
+ $line = 1;
+ $suppressed = false;
+
+ $event = new ErrorTriggered(
+ $telemetryInfo,
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($dataProvider, $event->dataProvider());
+ $this->assertSame($message, $event->message());
+ $this->assertSame($file, $event->file());
+ $this->assertSame($line, $event->line());
+ $this->assertSame($suppressed, $event->wasSuppressed());
+ $this->assertSame('Data Provider Triggered Error (the-class::the-method)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeSuppressed(): void
+ {
+ $event = new ErrorTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ true,
+ );
+
+ $this->assertTrue($event->wasSuppressed());
+ $this->assertSame('Data Provider Triggered Error (the-class::the-method, suppressed using operator)' . PHP_EOL . 'message', $event->asString());
+ }
+}
diff --git a/tests/unit/Event/Events/DataProvider/Issue/NoticeTriggeredTest.php b/tests/unit/Event/Events/DataProvider/Issue/NoticeTriggeredTest.php
new file mode 100644
index 00000000000..a69e1e29462
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Issue/NoticeTriggeredTest.php
@@ -0,0 +1,83 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(NoticeTriggered::class)]
+#[Small]
+final class NoticeTriggeredTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $dataProvider = new ClassMethod('the-class', 'the-method');
+ $message = 'message';
+ $file = 'file';
+ $line = 1;
+ $suppressed = false;
+ $ignoredByBaseline = false;
+
+ $event = new NoticeTriggered(
+ $telemetryInfo,
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($dataProvider, $event->dataProvider());
+ $this->assertSame($message, $event->message());
+ $this->assertSame($file, $event->file());
+ $this->assertSame($line, $event->line());
+ $this->assertSame($suppressed, $event->wasSuppressed());
+ $this->assertSame($ignoredByBaseline, $event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered Notice (the-class::the-method)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeIgnoredByBaseline(): void
+ {
+ $event = new NoticeTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ false,
+ true,
+ );
+
+ $this->assertTrue($event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered Notice (the-class::the-method, ignored by baseline)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeSuppressed(): void
+ {
+ $event = new NoticeTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ true,
+ false,
+ );
+
+ $this->assertTrue($event->wasSuppressed());
+ $this->assertSame('Data Provider Triggered Notice (the-class::the-method, suppressed using operator)' . PHP_EOL . 'message', $event->asString());
+ }
+}
diff --git a/tests/unit/Event/Events/DataProvider/Issue/PhpDeprecationTriggeredTest.php b/tests/unit/Event/Events/DataProvider/Issue/PhpDeprecationTriggeredTest.php
new file mode 100644
index 00000000000..2f4ace6e782
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Issue/PhpDeprecationTriggeredTest.php
@@ -0,0 +1,89 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Event\Code\IssueTrigger\IssueTrigger;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(PhpDeprecationTriggered::class)]
+#[Small]
+final class PhpDeprecationTriggeredTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $dataProvider = new ClassMethod('the-class', 'the-method');
+ $message = 'message';
+ $file = 'file';
+ $line = 1;
+ $suppressed = false;
+ $ignoredByBaseline = false;
+ $trigger = IssueTrigger::unknown();
+
+ $event = new PhpDeprecationTriggered(
+ $telemetryInfo,
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ $trigger,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($dataProvider, $event->dataProvider());
+ $this->assertSame($message, $event->message());
+ $this->assertSame($file, $event->file());
+ $this->assertSame($line, $event->line());
+ $this->assertSame($suppressed, $event->wasSuppressed());
+ $this->assertSame($ignoredByBaseline, $event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered PHP Deprecation (the-class::the-method, unknown if issue was triggered in first-party code or third-party code)' . PHP_EOL . 'message', $event->asString());
+ $this->assertSame($trigger, $event->trigger());
+ }
+
+ public function testCanBeIgnoredByBaseline(): void
+ {
+ $event = new PhpDeprecationTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ false,
+ true,
+ IssueTrigger::unknown(),
+ );
+
+ $this->assertTrue($event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered PHP Deprecation (the-class::the-method, unknown if issue was triggered in first-party code or third-party code, ignored by baseline)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeSuppressed(): void
+ {
+ $event = new PhpDeprecationTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ true,
+ false,
+ IssueTrigger::unknown(),
+ );
+
+ $this->assertTrue($event->wasSuppressed());
+ $this->assertSame('Data Provider Triggered PHP Deprecation (the-class::the-method, unknown if issue was triggered in first-party code or third-party code, suppressed using operator)' . PHP_EOL . 'message', $event->asString());
+ }
+}
diff --git a/tests/unit/Event/Events/DataProvider/Issue/PhpNoticeTriggeredTest.php b/tests/unit/Event/Events/DataProvider/Issue/PhpNoticeTriggeredTest.php
new file mode 100644
index 00000000000..71d5d40e1ce
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Issue/PhpNoticeTriggeredTest.php
@@ -0,0 +1,83 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(PhpNoticeTriggered::class)]
+#[Small]
+final class PhpNoticeTriggeredTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $dataProvider = new ClassMethod('the-class', 'the-method');
+ $message = 'message';
+ $file = 'file';
+ $line = 1;
+ $suppressed = false;
+ $ignoredByBaseline = false;
+
+ $event = new PhpNoticeTriggered(
+ $telemetryInfo,
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($dataProvider, $event->dataProvider());
+ $this->assertSame($message, $event->message());
+ $this->assertSame($file, $event->file());
+ $this->assertSame($line, $event->line());
+ $this->assertSame($suppressed, $event->wasSuppressed());
+ $this->assertSame($ignoredByBaseline, $event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered PHP Notice (the-class::the-method)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeIgnoredByBaseline(): void
+ {
+ $event = new PhpNoticeTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ false,
+ true,
+ );
+
+ $this->assertTrue($event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered PHP Notice (the-class::the-method, ignored by baseline)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeSuppressed(): void
+ {
+ $event = new PhpNoticeTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ true,
+ false,
+ );
+
+ $this->assertTrue($event->wasSuppressed());
+ $this->assertSame('Data Provider Triggered PHP Notice (the-class::the-method, suppressed using operator)' . PHP_EOL . 'message', $event->asString());
+ }
+}
diff --git a/tests/unit/Event/Events/DataProvider/Issue/PhpWarningTriggeredTest.php b/tests/unit/Event/Events/DataProvider/Issue/PhpWarningTriggeredTest.php
new file mode 100644
index 00000000000..203cf6b0d7c
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Issue/PhpWarningTriggeredTest.php
@@ -0,0 +1,83 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(PhpWarningTriggered::class)]
+#[Small]
+final class PhpWarningTriggeredTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $dataProvider = new ClassMethod('the-class', 'the-method');
+ $message = 'message';
+ $file = 'file';
+ $line = 1;
+ $suppressed = false;
+ $ignoredByBaseline = false;
+
+ $event = new PhpWarningTriggered(
+ $telemetryInfo,
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($dataProvider, $event->dataProvider());
+ $this->assertSame($message, $event->message());
+ $this->assertSame($file, $event->file());
+ $this->assertSame($line, $event->line());
+ $this->assertSame($suppressed, $event->wasSuppressed());
+ $this->assertSame($ignoredByBaseline, $event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered PHP Warning (the-class::the-method)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeIgnoredByBaseline(): void
+ {
+ $event = new PhpWarningTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ false,
+ true,
+ );
+
+ $this->assertTrue($event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered PHP Warning (the-class::the-method, ignored by baseline)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeSuppressed(): void
+ {
+ $event = new PhpWarningTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ true,
+ false,
+ );
+
+ $this->assertTrue($event->wasSuppressed());
+ $this->assertSame('Data Provider Triggered PHP Warning (the-class::the-method, suppressed using operator)' . PHP_EOL . 'message', $event->asString());
+ }
+}
diff --git a/tests/unit/Event/Events/DataProvider/Issue/WarningTriggeredTest.php b/tests/unit/Event/Events/DataProvider/Issue/WarningTriggeredTest.php
new file mode 100644
index 00000000000..ab97601317d
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Issue/WarningTriggeredTest.php
@@ -0,0 +1,83 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use const PHP_EOL;
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(WarningTriggered::class)]
+#[Small]
+final class WarningTriggeredTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $dataProvider = new ClassMethod('the-class', 'the-method');
+ $message = 'message';
+ $file = 'file';
+ $line = 1;
+ $suppressed = false;
+ $ignoredByBaseline = false;
+
+ $event = new WarningTriggered(
+ $telemetryInfo,
+ $dataProvider,
+ $message,
+ $file,
+ $line,
+ $suppressed,
+ $ignoredByBaseline,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($dataProvider, $event->dataProvider());
+ $this->assertSame($message, $event->message());
+ $this->assertSame($file, $event->file());
+ $this->assertSame($line, $event->line());
+ $this->assertSame($suppressed, $event->wasSuppressed());
+ $this->assertSame($ignoredByBaseline, $event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered Warning (the-class::the-method)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeIgnoredByBaseline(): void
+ {
+ $event = new WarningTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ false,
+ true,
+ );
+
+ $this->assertTrue($event->ignoredByBaseline());
+ $this->assertSame('Data Provider Triggered Warning (the-class::the-method, ignored by baseline)' . PHP_EOL . 'message', $event->asString());
+ }
+
+ public function testCanBeSuppressed(): void
+ {
+ $event = new WarningTriggered(
+ $this->telemetryInfo(),
+ new ClassMethod('the-class', 'the-method'),
+ 'message',
+ 'file',
+ 1,
+ true,
+ false,
+ );
+
+ $this->assertTrue($event->wasSuppressed());
+ $this->assertSame('Data Provider Triggered Warning (the-class::the-method, suppressed using operator)' . PHP_EOL . 'message', $event->asString());
+ }
+}
diff --git a/tests/unit/Event/Events/DataProvider/Lifecycle/MethodCalledTest.php b/tests/unit/Event/Events/DataProvider/Lifecycle/MethodCalledTest.php
new file mode 100644
index 00000000000..76029d07e79
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Lifecycle/MethodCalledTest.php
@@ -0,0 +1,48 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(MethodCalled::class)]
+#[Small]
+final class MethodCalledTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $testMethod = new ClassMethod('ClassTest', 'testOne');
+ $dataProviderMethod = new ClassMethod('ClassTest', 'dataProvider');
+
+ $event = new MethodCalled(
+ $telemetryInfo,
+ $testMethod,
+ $dataProviderMethod,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($testMethod, $event->testMethod());
+ $this->assertSame($dataProviderMethod, $event->dataProviderMethod());
+ }
+
+ public function testCanBeRepresentedAsString(): void
+ {
+ $event = new MethodCalled(
+ $this->telemetryInfo(),
+ new ClassMethod('ClassTest', 'testOne'),
+ new ClassMethod('ClassTest', 'dataProvider'),
+ );
+
+ $this->assertSame('Data Provider Method Called (ClassTest::dataProvider for test method ClassTest::testOne)', $event->asString());
+ }
+}
diff --git a/tests/unit/Event/Events/DataProvider/Lifecycle/MethodFinishedTest.php b/tests/unit/Event/Events/DataProvider/Lifecycle/MethodFinishedTest.php
new file mode 100644
index 00000000000..1c54446588f
--- /dev/null
+++ b/tests/unit/Event/Events/DataProvider/Lifecycle/MethodFinishedTest.php
@@ -0,0 +1,55 @@
+
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+namespace PHPUnit\Event\DataProvider;
+
+use PHPUnit\Event\AbstractEventTestCase;
+use PHPUnit\Event\Code\ClassMethod;
+use PHPUnit\Framework\Attributes\CoversClass;
+use PHPUnit\Framework\Attributes\Small;
+
+#[CoversClass(MethodFinished::class)]
+#[Small]
+final class MethodFinishedTest extends AbstractEventTestCase
+{
+ public function testConstructorSetsValues(): void
+ {
+ $telemetryInfo = $this->telemetryInfo();
+ $testMethod = new ClassMethod('ClassTest', 'testOne');
+ $dataProviderMethod = new ClassMethod('ClassTest', 'dataProvider');
+
+ $event = new MethodFinished(
+ $telemetryInfo,
+ $testMethod,
+ $dataProviderMethod,
+ );
+
+ $this->assertSame($telemetryInfo, $event->telemetryInfo());
+ $this->assertSame($testMethod, $event->testMethod());
+ $this->assertSame([$dataProviderMethod], $event->calledMethods());
+ }
+
+ public function testCanBeRepresentedAsString(): void
+ {
+ $event = new MethodFinished(
+ $this->telemetryInfo(),
+ new ClassMethod('ClassTest', 'testOne'),
+ new ClassMethod('ClassTest', 'dataProvider'),
+ );
+
+ $this->assertStringEqualsStringIgnoringLineEndings(
+ <<<'EOT'
+Data Provider Method Finished for ClassTest::testOne:
+- ClassTest::dataProvider
+EOT
+ ,
+ $event->asString(),
+ );
+ }
+}