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(), + ); + } +}