diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..ce3259e3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,66 @@ +name: Bug Report +description: Report an Issue or Bug with the Pest +title: "[Bug]: " +labels: ["bug"] +body: + - type: markdown + attributes: + value: | + We're sorry to hear you have a problem. Can you help us solve it by providing the following details. + - type: textarea + id: what-happened + attributes: + label: What Happened + description: What did you expect to happen? + placeholder: When I use expect()->toBeTrue() in my tests, I get an error + validations: + required: true + - type: textarea + id: how-to-reproduce + attributes: + label: How to Reproduce + description: How did this occur, please add any config values used and provide a set of reliable steps if possible. + placeholder: Install a fresh Laravel app, add Pest, add a test that uses expect()->toBeTrue() + validations: + required: true + - type: input + id: repository-sample + attributes: + label: Sample Repository + description: If possible, please provide a sample repository that reproduces the issue. + placeholder: https://github.com.br/your-username/your-repository + - type: input + id: pest-version + attributes: + label: Pest Version + description: What version of our Package are you running? Please be as specific as possible + placeholder: 2.14.1 + validations: + required: true + - type: input + id: php-version + attributes: + label: PHP Version + description: What version of PHP are you running? Please be as specific as possible + placeholder: 8.1.20 + validations: + required: true + - type: dropdown + id: operating-systems + attributes: + label: Operation System + description: On which operating systems does the problem occur? You can select more than one. + multiple: true + options: + - macOS + - Windows + - Linux + validations: + required: true + - type: textarea + id: notes + attributes: + label: Notes + description: Use this field to provide any other notes that you feel might be relevant to the issue. + validations: + required: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6b729631..742d2bc8 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,10 +1,16 @@ -| Q | A -| ------------- | --- -| Bug fix? | yes/no -| New feature? | yes/no -| Fixed tickets | #... - +### What: + +- [ ] Bug Fix +- [ ] New Feature + +### Description: + + + +### Related: + + diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 5c80602f..448cb235 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -14,7 +14,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] - php: ['8.1', '8.2'] + php: ['8.1', '8.2', '8.3'] dependency-version: [prefer-lowest, prefer-stable] name: PHP ${{ matrix.php }} - ${{ matrix.os }} - ${{ matrix.dependency-version }} diff --git a/CHANGELOG.md b/CHANGELOG.md index ce229105..ebeeafe4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,46 @@ ## Unreleased +## [v2.15.0 (2023-08-17)](https://github.com/pestphp/pest/compare/v2.14.1...v2.15.0) + +### Added + +- PHP 8.3 support ([0b261ef](https://github.com/pestphp/pest/commit/0b261ef97b7ceed20cbeeb2b0b41e08e0a8fcaa1)) + +## [v2.14.1 (2023-08-16)](https://github.com/pestphp/pest/compare/v2.14.0...v2.14.1) + +### Changed + +- Bumps PHPUnit to `^10.3.2` ([e012517](https://github.com/pestphp/pest/commit/e012517b1643002b36a68096f4a5e26682b1e175)) + +## [v2.14.0 (2023-08-14)](https://github.com/pestphp/pest/compare/v2.13.0...v2.14.0) + +### Added + +- `toBeUppercase()`, `toBeLowercase()`, `toBeAlphaNumeric()`, `toBeAlpha()` ([#906](https://github.com/pestphp/pest/pull/906)) + +## [v2.13.0 (2023-08-09)](https://github.com/pestphp/pest/compare/v2.12.2...v2.13.0) + +### Added + +- `expect()->ddWhen` and `expect()->ddUnless` ([306b7eb](https://github.com/pestphp/pest/commit/306b7eb2a6a57e570d58228b46501ad9ba4062b4)) + +## [v2.12.2 (2023-08-07)](https://github.com/pestphp/pest/compare/v2.12.0...v2.12.2) + +### Fixed + +- Running tests from `uses` parent class ([#898](https://github.com/pestphp/pest/pull/898)) + +## [v2.12.0 (2023-08-02)](https://github.com/pestphp/pest/compare/v2.11.0...v2.12.0) + +### Added + +- Allows multiple `toMatchSnapshot` per test ([#881](https://github.com/pestphp/pest/pull/881)) + +### Changed + +- Bumps PHPUnit to `^10.2.7` ([43107c1](https://github.com/pestphp/pest/commit/43107c17436e41e23018ae31705c688168c14784)) + ## [v2.11.0 (2023-08-01)](https://github.com/pestphp/pest/compare/v2.10.1...v2.11.0) ### Added diff --git a/composer.json b/composer.json index 199d047f..5e9cb34c 100644 --- a/composer.json +++ b/composer.json @@ -18,16 +18,16 @@ ], "require": { "php": "^8.1.0", - "brianium/paratest": "^7.2.3", - "nunomaduro/collision": "^7.7.0", + "brianium/paratest": "^7.2.5", + "nunomaduro/collision": "^7.8.1", "nunomaduro/termwind": "^1.15.1", "pestphp/pest-plugin": "^2.0.1", "pestphp/pest-plugin-arch": "^2.2.3", - "phpunit/phpunit": "^10.2.6" + "phpunit/phpunit": "^10.3.2" }, "conflict": { "webmozart/assert": "<1.11.0", - "phpunit/phpunit": ">10.2.6" + "phpunit/phpunit": ">10.3.2" }, "autoload": { "psr-4": { @@ -50,7 +50,7 @@ ] }, "require-dev": { - "pestphp/pest-dev-tools": "^2.12.0", + "pestphp/pest-dev-tools": "^2.15.0", "pestphp/pest-plugin-type-coverage": "^2.0.0", "symfony/process": "^6.3.2" }, diff --git a/overrides/Runner/Filter/NameFilterIterator.php b/overrides/Runner/Filter/NameFilterIterator.php index 391c3ed5..8b740c3f 100644 --- a/overrides/Runner/Filter/NameFilterIterator.php +++ b/overrides/Runner/Filter/NameFilterIterator.php @@ -34,17 +34,18 @@ namespace PHPUnit\Runner\Filter; -use function end; use Exception; -use function implode; use Pest\Contracts\HasPrintableTestCaseName; use PHPUnit\Framework\SelfDescribing; use PHPUnit\Framework\Test; use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestSuite; -use function preg_match; use RecursiveFilterIterator; use RecursiveIterator; + +use function end; +use function implode; +use function preg_match; use function sprintf; use function str_replace; diff --git a/overrides/Runner/ResultCache/DefaultResultCache.php b/overrides/Runner/ResultCache/DefaultResultCache.php index 40134011..c64602c0 100644 --- a/overrides/Runner/ResultCache/DefaultResultCache.php +++ b/overrides/Runner/ResultCache/DefaultResultCache.php @@ -45,9 +45,15 @@ declare(strict_types=1); namespace PHPUnit\Runner\ResultCache; +use const DIRECTORY_SEPARATOR; + +use PHPUnit\Framework\TestStatus\TestStatus; +use PHPUnit\Runner\DirectoryCannotBeCreatedException; +use PHPUnit\Runner\Exception; +use PHPUnit\Util\Filesystem; + use function array_keys; use function assert; -use const DIRECTORY_SEPARATOR; use function dirname; use function file_get_contents; use function file_put_contents; @@ -57,10 +63,6 @@ use function is_file; use function json_decode; use function json_encode; use function Pest\version; -use PHPUnit\Framework\TestStatus\TestStatus; -use PHPUnit\Runner\DirectoryCannotBeCreatedException; -use PHPUnit\Runner\Exception; -use PHPUnit\Util\Filesystem; /** * @internal This class is not covered by the backward compatibility promise for PHPUnit diff --git a/overrides/Runner/TestSuiteLoader.php b/overrides/Runner/TestSuiteLoader.php index d997aeb0..9c1a0935 100644 --- a/overrides/Runner/TestSuiteLoader.php +++ b/overrides/Runner/TestSuiteLoader.php @@ -36,18 +36,19 @@ declare(strict_types=1); namespace PHPUnit\Runner; -use function array_diff; -use function array_values; -use function basename; -use function class_exists; use Exception; -use function get_declared_classes; use Pest\Contracts\HasPrintableTestCaseName; use Pest\TestCases\IgnorableTestCase; use Pest\TestSuite; use PHPUnit\Framework\TestCase; use ReflectionClass; use ReflectionException; + +use function array_diff; +use function array_values; +use function basename; +use function class_exists; +use function get_declared_classes; use function substr; /** @@ -60,6 +61,11 @@ final class TestSuiteLoader */ private static array $loadedClasses = []; + /** + * @psalm-var array> + */ + private static array $loadedClassesByFilename = []; + /** * @psalm-var list */ @@ -97,6 +103,17 @@ final class TestSuiteLoader self::$loadedClasses = array_merge($loadedClasses, self::$loadedClasses); + foreach ($loadedClasses as $loadedClass) { + $reflection = new ReflectionClass($loadedClass); + $filename = $reflection->getFileName(); + self::$loadedClassesByFilename[$filename] = [ + $loadedClass, + ...self::$loadedClassesByFilename[$filename] ?? [], + ]; + } + + $loadedClasses = array_merge(self::$loadedClassesByFilename[$suiteClassFile] ?? [], $loadedClasses); + if (empty($loadedClasses)) { return $this->exceptionFor($suiteClassName, $suiteClassFile); } diff --git a/overrides/TextUI/TestSuiteFilterProcessor.php b/overrides/TextUI/TestSuiteFilterProcessor.php index 31ce5fe6..f4473289 100644 --- a/overrides/TextUI/TestSuiteFilterProcessor.php +++ b/overrides/TextUI/TestSuiteFilterProcessor.php @@ -45,7 +45,6 @@ declare(strict_types=1); namespace PHPUnit\TextUI; -use function array_map; use Pest\Plugins\Only; use PHPUnit\Event; use PHPUnit\Framework\TestSuite; @@ -53,6 +52,8 @@ use PHPUnit\Runner\Filter\Factory; use PHPUnit\TextUI\Configuration\Configuration; use PHPUnit\TextUI\Configuration\FilterNotConfiguredException; +use function array_map; + /** * @internal This class is not covered by the backward compatibility promise for PHPUnit */ diff --git a/phpstan.neon b/phpstan.neon index 1cd3a087..9ed48871 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,6 +1,5 @@ includes: - vendor/phpstan/phpstan-strict-rules/rules.neon - - vendor/ergebnis/phpstan-rules/rules.neon - vendor/thecodingmachine/phpstan-strict-rules/phpstan-strict-rules.neon parameters: @@ -12,12 +11,4 @@ parameters: reportUnmatchedIgnoredErrors: true ignoreErrors: - - "#has a nullable return type declaration.#" - - "#Language construct isset\\(\\) should not be used.#" - - "#is not allowed to extend#" - - "#is concrete, but does not have a Test suffix#" - - "#with a nullable type declaration#" - "#type mixed is not subtype of native#" - - "# with null as default value#" - - "#has parameter \\$closure with default value.#" - - "#has parameter \\$description with default value.#" diff --git a/src/Bootstrappers/BootFiles.php b/src/Bootstrappers/BootFiles.php index 3add2a70..411fd007 100644 --- a/src/Bootstrappers/BootFiles.php +++ b/src/Bootstrappers/BootFiles.php @@ -7,12 +7,13 @@ namespace Pest\Bootstrappers; use Pest\Contracts\Bootstrapper; use Pest\Support\DatasetInfo; use Pest\Support\Str; -use function Pest\testDirectory; use Pest\TestSuite; use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use SebastianBergmann\FileIterator\Facade as PhpUnitFileIterator; +use function Pest\testDirectory; + /** * @internal */ diff --git a/src/Concerns/Testable.php b/src/Concerns/Testable.php index 3268f2ae..e8d00588 100644 --- a/src/Concerns/Testable.php +++ b/src/Concerns/Testable.php @@ -62,6 +62,11 @@ trait Testable */ private static ?Closure $__afterAll = null; + /** + * The list of snapshot changes, if any. + */ + private array $__snapshotChanges = []; + /** * Resets the test case static properties. */ @@ -331,6 +336,24 @@ trait Testable return ExceptionTrace::ensure(fn (): mixed => call_user_func_array(Closure::bind($closure, $this, $this::class), $arguments)); } + /** @postCondition */ + protected function __MarkTestIncompleteIfSnapshotHaveChanged(): void + { + if (count($this->__snapshotChanges) === 0) { + return; + } + + if (count($this->__snapshotChanges) === 1) { + $this->markTestIncomplete($this->__snapshotChanges[0]); + + return; + } + + $messages = implode(PHP_EOL, array_map(static fn (string $message): string => '- $message', $this->__snapshotChanges)); + + $this->markTestIncomplete($messages); + } + /** * The printable test case name. */ diff --git a/src/Expectation.php b/src/Expectation.php index 61864092..1bf0249d 100644 --- a/src/Expectation.php +++ b/src/Expectation.php @@ -128,6 +128,40 @@ final class Expectation exit(1); } + /** + * Dump the expectation value when the result of the condition is truthy. + * + * @param (\Closure(TValue): bool)|bool $condition + * @return self + */ + public function ddWhen(Closure|bool $condition, mixed ...$arguments): Expectation + { + $condition = $condition instanceof Closure ? $condition($this->value) : $condition; + + if (! $condition) { + return $this; + } + + $this->dd(...$arguments); + } + + /** + * Dump the expectation value when the result of the condition is falsy. + * + * @param (\Closure(TValue): bool)|bool $condition + * @return self + */ + public function ddUnless(Closure|bool $condition, mixed ...$arguments): Expectation + { + $condition = $condition instanceof Closure ? $condition($this->value) : $condition; + + if ($condition) { + return $this; + } + + $this->dd(...$arguments); + } + /** * Send the expectation value to Ray along with all given arguments. * diff --git a/src/Expectations/EachExpectation.php b/src/Expectations/EachExpectation.php index 56cd937b..e5df6e9c 100644 --- a/src/Expectations/EachExpectation.php +++ b/src/Expectations/EachExpectation.php @@ -4,9 +4,10 @@ declare(strict_types=1); namespace Pest\Expectations; -use function expect; use Pest\Expectation; +use function expect; + /** * @internal * diff --git a/src/Factories/Attributes/Attribute.php b/src/Factories/Attributes/Attribute.php index 9bd43de9..21df216d 100644 --- a/src/Factories/Attributes/Attribute.php +++ b/src/Factories/Attributes/Attribute.php @@ -20,7 +20,7 @@ abstract class Attribute * @param array $attributes * @return array */ - public function __invoke(TestCaseMethodFactory $method, array $attributes): array // @phpstan-ignore-line + public function __invoke(TestCaseMethodFactory $method, array $attributes): array { return $attributes; } diff --git a/src/Factories/TestCaseFactory.php b/src/Factories/TestCaseFactory.php index cbe50985..98ccb3aa 100644 --- a/src/Factories/TestCaseFactory.php +++ b/src/Factories/TestCaseFactory.php @@ -193,7 +193,7 @@ final class TestCaseFactory } PHP; - eval($classCode); // @phpstan-ignore-line + eval($classCode); } catch (ParseError $caught) { throw new RuntimeException(sprintf( "Unable to create test case for test file at %s. \n %s", diff --git a/src/KernelDump.php b/src/KernelDump.php index 39f2004b..6e1833ca 100644 --- a/src/KernelDump.php +++ b/src/KernelDump.php @@ -40,7 +40,7 @@ final class KernelDump */ public function disable(): void { - @ob_clean(); // @phpstan-ignore-line + @ob_clean(); if ($this->buffer !== '') { $this->flush(); diff --git a/src/Mixins/Expectation.php b/src/Mixins/Expectation.php index b90e601a..cb3ec31d 100644 --- a/src/Mixins/Expectation.php +++ b/src/Mixins/Expectation.php @@ -502,6 +502,18 @@ final class Expectation return $this; } + /** + * Asserts that the value contains only digits. + * + * @return self + */ + public function toBeDigits(string $message = ''): self + { + Assert::assertTrue(ctype_digit((string) $this->value), $message); + + return $this; + } + /** * Asserts that the value is of type object. * @@ -805,6 +817,12 @@ final class Expectation */ public function toMatchSnapshot(string $message = ''): self { + $snapshots = TestSuite::getInstance()->snapshots; + $snapshots->startNewExpectation(); + + $testCase = TestSuite::getInstance()->test; + assert($testCase instanceof TestCase); + $string = match (true) { is_string($this->value) => $this->value, is_object($this->value) && method_exists($this->value, '__toString') => $this->value->__toString(), @@ -817,22 +835,18 @@ final class Expectation default => InvalidExpectationValue::expected('array|object|string'), }; - $testCase = TestSuite::getInstance()->test; - assert($testCase instanceof TestCase); - $snapshots = TestSuite::getInstance()->snapshots; - - if ($snapshots->has($testCase, $string)) { - [$filename, $content] = $snapshots->get($testCase, $string); + if ($snapshots->has()) { + [$filename, $content] = $snapshots->get(); Assert::assertSame( - $content, - $string, + strtr($content, ["\r\n" => "\n", "\r" => "\n"]), + strtr($string, ["\r\n" => "\n", "\r" => "\n"]), $message === '' ? "Failed asserting that the string value matches its snapshot ($filename)." : $message ); } else { - $filename = $snapshots->save($testCase, $string); + $filename = $snapshots->save($string); - $testCase::markTestIncomplete('Snapshot created at ['.$filename.'].'); + TestSuite::getInstance()->registerSnapshotChange("Snapshot created at [$filename]"); } return $this; @@ -959,4 +973,52 @@ final class Expectation return $this->exporter->shortenedExport($value); } + + /** + * Asserts that the value is uppercase. + * + * @return self + */ + public function toBeUppercase(string $message = ''): self + { + Assert::assertTrue(ctype_upper((string) $this->value), $message); + + return $this; + } + + /** + * Asserts that the value is lowercase. + * + * @return self + */ + public function toBeLowercase(string $message = ''): self + { + Assert::assertTrue(ctype_lower((string) $this->value), $message); + + return $this; + } + + /** + * Asserts that the value is alphanumeric. + * + * @return self + */ + public function toBeAlphaNumeric(string $message = ''): self + { + Assert::assertTrue(ctype_alnum((string) $this->value), $message); + + return $this; + } + + /** + * Asserts that the value is alpha. + * + * @return self + */ + public function toBeAlpha(string $message = ''): self + { + Assert::assertTrue(ctype_alpha((string) $this->value), $message); + + return $this; + } } diff --git a/src/Pest.php b/src/Pest.php index 37dc243d..cb694f20 100644 --- a/src/Pest.php +++ b/src/Pest.php @@ -6,7 +6,7 @@ namespace Pest; function version(): string { - return '2.11.0'; + return '2.15.0'; } function testDirectory(string $file = ''): string diff --git a/src/Plugins/Help.php b/src/Plugins/Help.php index b0643461..c8e4d32f 100644 --- a/src/Plugins/Help.php +++ b/src/Plugins/Help.php @@ -6,10 +6,11 @@ namespace Pest\Plugins; use Pest\Contracts\Plugins\HandlesArguments; use Pest\Support\View; -use function Pest\version; use PHPUnit\TextUI\Help as PHPUnitHelp; use Symfony\Component\Console\Output\OutputInterface; +use function Pest\version; + /** * @internal */ diff --git a/src/Plugins/Parallel.php b/src/Plugins/Parallel.php index 3354b743..fd643471 100644 --- a/src/Plugins/Parallel.php +++ b/src/Plugins/Parallel.php @@ -13,11 +13,12 @@ use Pest\Plugins\Parallel\Paratest\CleanConsoleOutput; use Pest\Support\Arr; use Pest\Support\Container; use Pest\TestSuite; -use function Pest\version; use Stringable; use Symfony\Component\Console\Application; use Symfony\Component\Console\Input\ArgvInput; +use function Pest\version; + final class Parallel implements HandlesArguments { use HandleArguments; diff --git a/src/Plugins/Parallel/Paratest/ResultPrinter.php b/src/Plugins/Parallel/Paratest/ResultPrinter.php index f9d96ca2..1e9cc245 100644 --- a/src/Plugins/Parallel/Paratest/ResultPrinter.php +++ b/src/Plugins/Parallel/Paratest/ResultPrinter.php @@ -4,6 +4,16 @@ declare(strict_types=1); namespace Pest\Plugins\Parallel\Paratest; +use ParaTest\Options; +use Pest\Plugins\Parallel\Support\CompactPrinter; +use Pest\Support\StateGenerator; +use PHPUnit\TestRunner\TestResult\TestResult; +use PHPUnit\TextUI\Output\Printer; +use SebastianBergmann\Timer\Duration; +use SplFileInfo; +use Symfony\Component\Console\Formatter\OutputFormatter; +use Symfony\Component\Console\Output\OutputInterface; + use function assert; use function fclose; use function feof; @@ -12,16 +22,7 @@ use function fread; use function fseek; use function ftell; use function fwrite; -use ParaTest\Options; -use Pest\Plugins\Parallel\Support\CompactPrinter; -use Pest\Support\StateGenerator; -use PHPUnit\TestRunner\TestResult\TestResult; -use PHPUnit\TextUI\Output\Printer; -use SebastianBergmann\Timer\Duration; -use SplFileInfo; use function strlen; -use Symfony\Component\Console\Formatter\OutputFormatter; -use Symfony\Component\Console\Output\OutputInterface; /** * @internal diff --git a/src/Plugins/Parallel/Paratest/WrapperRunner.php b/src/Plugins/Parallel/Paratest/WrapperRunner.php index 2a1db6bb..8b75bc4c 100644 --- a/src/Plugins/Parallel/Paratest/WrapperRunner.php +++ b/src/Plugins/Parallel/Paratest/WrapperRunner.php @@ -4,15 +4,9 @@ declare(strict_types=1); namespace Pest\Plugins\Parallel\Paratest; -use function array_merge; -use function array_merge_recursive; -use function array_shift; -use function assert; -use function count; use const DIRECTORY_SEPARATOR; -use function dirname; -use function file_get_contents; -use function max; + +use NunoMaduro\Collision\Adapters\Phpunit\Support\ResultReflection; use ParaTest\Coverage\CoverageMerger; use ParaTest\JUnit\LogMerger; use ParaTest\JUnit\Writer; @@ -29,11 +23,20 @@ use PHPUnit\TestRunner\TestResult\Facade as TestResultFacade; use PHPUnit\TestRunner\TestResult\TestResult; use PHPUnit\TextUI\Configuration\CodeCoverageFilterRegistry; use PHPUnit\Util\ExcludeList; -use function realpath; use SebastianBergmann\Timer\Timer; use SplFileInfo; use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Process\PhpExecutableFinder; + +use function array_merge; +use function array_merge_recursive; +use function array_shift; +use function assert; +use function count; +use function dirname; +use function file_get_contents; +use function max; +use function realpath; use function unlink; use function unserialize; use function usleep; @@ -273,7 +276,7 @@ final class WrapperRunner implements RunnerInterface assert($testResult instanceof TestResult); $testResultSum = new TestResult( - $testResultSum->numberOfTests() + $testResult->numberOfTests(), + (int) $testResultSum->hasTests() + (int) $testResult->hasTests(), $testResultSum->numberOfTestsRun() + $testResult->numberOfTestsRun(), $testResultSum->numberOfAssertions() + $testResult->numberOfAssertions(), array_merge_recursive($testResultSum->testErroredEvents(), $testResult->testErroredEvents()), @@ -282,23 +285,23 @@ final class WrapperRunner implements RunnerInterface array_merge_recursive($testResultSum->testSuiteSkippedEvents(), $testResult->testSuiteSkippedEvents()), array_merge_recursive($testResultSum->testSkippedEvents(), $testResult->testSkippedEvents()), array_merge_recursive($testResultSum->testMarkedIncompleteEvents(), $testResult->testMarkedIncompleteEvents()), - array_merge_recursive($testResultSum->testTriggeredDeprecationEvents(), $testResult->testTriggeredDeprecationEvents()), - array_merge_recursive($testResultSum->testTriggeredPhpDeprecationEvents(), $testResult->testTriggeredPhpDeprecationEvents()), array_merge_recursive($testResultSum->testTriggeredPhpunitDeprecationEvents(), $testResult->testTriggeredPhpunitDeprecationEvents()), - array_merge_recursive($testResultSum->testTriggeredErrorEvents(), $testResult->testTriggeredErrorEvents()), - array_merge_recursive($testResultSum->testTriggeredNoticeEvents(), $testResult->testTriggeredNoticeEvents()), - array_merge_recursive($testResultSum->testTriggeredPhpNoticeEvents(), $testResult->testTriggeredPhpNoticeEvents()), - array_merge_recursive($testResultSum->testTriggeredWarningEvents(), $testResult->testTriggeredWarningEvents()), - array_merge_recursive($testResultSum->testTriggeredPhpWarningEvents(), $testResult->testTriggeredPhpWarningEvents()), array_merge_recursive($testResultSum->testTriggeredPhpunitErrorEvents(), $testResult->testTriggeredPhpunitErrorEvents()), array_merge_recursive($testResultSum->testTriggeredPhpunitWarningEvents(), $testResult->testTriggeredPhpunitWarningEvents()), array_merge_recursive($testResultSum->testRunnerTriggeredDeprecationEvents(), $testResult->testRunnerTriggeredDeprecationEvents()), array_merge_recursive($testResultSum->testRunnerTriggeredWarningEvents(), $testResult->testRunnerTriggeredWarningEvents()), + array_merge_recursive($testResultSum->errors(), $testResult->errors()), + array_merge_recursive($testResultSum->deprecations(), $testResult->deprecations()), + array_merge_recursive($testResultSum->notices(), $testResult->notices()), + array_merge_recursive($testResultSum->warnings(), $testResult->warnings()), + array_merge_recursive($testResultSum->phpDeprecations(), $testResult->phpDeprecations()), + array_merge_recursive($testResultSum->phpNotices(), $testResult->phpNotices()), + array_merge_recursive($testResultSum->phpWarnings(), $testResult->phpWarnings()), ); } $testResultSum = new TestResult( - $testResultSum->numberOfTests(), + ResultReflection::numberOfTests($testResultSum), $testResultSum->numberOfTestsRun(), $testResultSum->numberOfAssertions(), $testResultSum->testErroredEvents(), @@ -307,14 +310,7 @@ final class WrapperRunner implements RunnerInterface $testResultSum->testSuiteSkippedEvents(), $testResultSum->testSkippedEvents(), $testResultSum->testMarkedIncompleteEvents(), - $testResultSum->testTriggeredDeprecationEvents(), - $testResultSum->testTriggeredPhpDeprecationEvents(), $testResultSum->testTriggeredPhpunitDeprecationEvents(), - $testResultSum->testTriggeredErrorEvents(), - $testResultSum->testTriggeredNoticeEvents(), - $testResultSum->testTriggeredPhpNoticeEvents(), - $testResultSum->testTriggeredWarningEvents(), - $testResultSum->testTriggeredPhpWarningEvents(), $testResultSum->testTriggeredPhpunitErrorEvents(), $testResultSum->testTriggeredPhpunitWarningEvents(), $testResultSum->testRunnerTriggeredDeprecationEvents(), @@ -322,6 +318,13 @@ final class WrapperRunner implements RunnerInterface $testResultSum->testRunnerTriggeredWarningEvents(), fn (WarningTriggered $event): bool => ! str_contains($event->message(), 'No tests found') )), + $testResultSum->errors(), + $testResultSum->deprecations(), + $testResultSum->notices(), + $testResultSum->warnings(), + $testResultSum->phpDeprecations(), + $testResultSum->phpNotices(), + $testResultSum->phpWarnings(), ); $this->printer->printResults( diff --git a/src/Plugins/Parallel/Support/CompactPrinter.php b/src/Plugins/Parallel/Support/CompactPrinter.php index aff82fa4..25226b10 100644 --- a/src/Plugins/Parallel/Support/CompactPrinter.php +++ b/src/Plugins/Parallel/Support/CompactPrinter.php @@ -16,8 +16,9 @@ use PHPUnit\TestRunner\TestResult\TestResult as PHPUnitTestResult; use SebastianBergmann\Timer\Duration; use Symfony\Component\Console\Output\ConsoleOutput; use Symfony\Component\Console\Output\OutputInterface; -use function Termwind\render; use Termwind\Terminal; + +use function Termwind\render; use function Termwind\terminal; /** @@ -134,6 +135,10 @@ final class CompactPrinter null, null, null, + null, + null, + null, + null, ); $telemetry = new Info( diff --git a/src/Plugins/Version.php b/src/Plugins/Version.php index 8422cb0d..3740f263 100644 --- a/src/Plugins/Version.php +++ b/src/Plugins/Version.php @@ -6,6 +6,7 @@ namespace Pest\Plugins; use Pest\Contracts\Plugins\HandlesArguments; use Pest\Support\View; + use function Pest\version; /** diff --git a/src/Repositories/DatasetsRepository.php b/src/Repositories/DatasetsRepository.php index a43f1a84..1c296fc9 100644 --- a/src/Repositories/DatasetsRepository.php +++ b/src/Repositories/DatasetsRepository.php @@ -10,9 +10,10 @@ use Pest\Exceptions\DatasetAlreadyExists; use Pest\Exceptions\DatasetDoesNotExist; use Pest\Exceptions\ShouldNotHappen; use Pest\Support\Exporter; -use function sprintf; use Traversable; +use function sprintf; + /** * @internal */ diff --git a/src/Repositories/SnapshotRepository.php b/src/Repositories/SnapshotRepository.php index 89a4135e..1cd3e666 100644 --- a/src/Repositories/SnapshotRepository.php +++ b/src/Repositories/SnapshotRepository.php @@ -5,14 +5,16 @@ declare(strict_types=1); namespace Pest\Repositories; use Pest\Exceptions\ShouldNotHappen; -use Pest\Support\Str; -use PHPUnit\Framework\TestCase; +use Pest\TestSuite; /** * @internal */ final class SnapshotRepository { + /** @var array */ + private static array $expectationsCounter = []; + /** * Creates a snapshot repository instance. */ @@ -25,11 +27,9 @@ final class SnapshotRepository /** * Checks if the snapshot exists. */ - public function has(TestCase $testCase, string $description): bool + public function has(): bool { - [$filename, $description] = $this->getFilenameAndDescription($testCase); - - return file_exists($this->getSnapshotFilename($filename, $description)); + return file_exists($this->getSnapshotFilename()); } /** @@ -39,11 +39,9 @@ final class SnapshotRepository * * @throws ShouldNotHappen */ - public function get(TestCase $testCase, string $description): array + public function get(): array { - [$filename, $description] = $this->getFilenameAndDescription($testCase); - - $contents = file_get_contents($snapshotFilename = $this->getSnapshotFilename($filename, $description)); + $contents = file_get_contents($snapshotFilename = $this->getSnapshotFilename()); if ($contents === false) { throw ShouldNotHappen::fromMessage('Snapshot file could not be read.'); @@ -57,11 +55,9 @@ final class SnapshotRepository /** * Saves the given snapshot for the given test case. */ - public function save(TestCase $testCase, string $snapshot): string + public function save(string $snapshot): string { - [$filename, $description] = $this->getFilenameAndDescription($testCase); - - $snapshotFilename = $this->getSnapshotFilename($filename, $description); + $snapshotFilename = $this->getSnapshotFilename(); if (! file_exists(dirname($snapshotFilename))) { mkdir(dirname($snapshotFilename), 0755, true); @@ -103,33 +99,43 @@ final class SnapshotRepository } } - /** - * Gets the snapshot's "filename" and "description". - * - * @return array{0: string, 1: string} - */ - private function getFilenameAndDescription(TestCase $testCase): array - { - $filename = (fn () => self::$__filename)->call($testCase, $testCase::class); // @phpstan-ignore-line - - $description = str_replace('__pest_evaluable_', '', $testCase->name()); - $datasetAsString = str_replace('__pest_evaluable_', '', Str::evaluable($testCase->dataSetAsStringWithData())); - - $description = str_replace(' ', '_', $description.$datasetAsString); - - return [$filename, $description]; - } - /** * Gets the snapshot's "filename". */ - private function getSnapshotFilename(string $filename, string $description): string + private function getSnapshotFilename(): string { - $relativePath = str_replace($this->testsPath, '', $filename); + $relativePath = str_replace($this->testsPath, '', TestSuite::getInstance()->getFilename()); // remove extension from filename $relativePath = substr($relativePath, 0, (int) strrpos($relativePath, '.')); + $description = TestSuite::getInstance()->getDescription(); + + if ($this->getCurrentSnapshotCounter() > 1) { + $description .= '__'.$this->getCurrentSnapshotCounter(); + } + return sprintf('%s/%s.snap', $this->testsPath.'/'.$this->snapshotsPath.$relativePath, $description); } + + private function getCurrentSnapshotKey(): string + { + return TestSuite::getInstance()->getFilename().'###'.TestSuite::getInstance()->getDescription(); + } + + private function getCurrentSnapshotCounter(): int + { + return self::$expectationsCounter[$this->getCurrentSnapshotKey()] ?? 0; + } + + public function startNewExpectation(): void + { + $key = $this->getCurrentSnapshotKey(); + + if (! isset(self::$expectationsCounter[$key])) { + self::$expectationsCounter[$key] = 0; + } + + self::$expectationsCounter[$key]++; + } } diff --git a/src/Result.php b/src/Result.php index 418de7db..d9f1f0e3 100644 --- a/src/Result.php +++ b/src/Result.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace Pest; +use NunoMaduro\Collision\Adapters\Phpunit\Support\ResultReflection; use PHPUnit\TestRunner\TestResult\TestResult; use PHPUnit\TextUI\Configuration\Configuration; @@ -44,7 +45,7 @@ final class Result return self::SUCCESS_EXIT; } - if ($configuration->failOnEmptyTestSuite() && $result->numberOfTests() === 0) { + if ($configuration->failOnEmptyTestSuite() && ResultReflection::numberOfTests($result) === 0) { return self::FAILURE_EXIT; } @@ -53,9 +54,9 @@ final class Result $returnCode = self::FAILURE_EXIT; } - $warnings = $result->numberOfTestsWithTestTriggeredPhpunitWarningEvents() - + $result->numberOfTestsWithTestTriggeredWarningEvents() - + $result->numberOfTestsWithTestTriggeredPhpWarningEvents(); + $warnings = $result->numberOfTestsWithTestTriggeredPhpunitWarningEvents() + + +count($result->warnings()) + + count($result->phpWarnings()); if ($configuration->failOnWarning() && $warnings > 0) { $returnCode = self::FAILURE_EXIT; diff --git a/src/Support/Coverage.php b/src/Support/Coverage.php index eccff9d3..e0794522 100644 --- a/src/Support/Coverage.php +++ b/src/Support/Coverage.php @@ -10,6 +10,7 @@ use SebastianBergmann\CodeCoverage\Node\Directory; use SebastianBergmann\CodeCoverage\Node\File; use SebastianBergmann\Environment\Runtime; use Symfony\Component\Console\Output\OutputInterface; + use function Termwind\render; use function Termwind\renderUsing; use function Termwind\terminal; diff --git a/src/Support/StateGenerator.php b/src/Support/StateGenerator.php index da22aac5..cfaea382 100644 --- a/src/Support/StateGenerator.php +++ b/src/Support/StateGenerator.php @@ -74,64 +74,76 @@ final class StateGenerator )); } - foreach ($testResult->testTriggeredDeprecationEvents() as $testResultEvent) { - $testResultEvent = $testResultEvent[0]; + foreach ($testResult->deprecations() as $testResultEvent) { + foreach ($testResultEvent->triggeringTests() as $triggeringTest) { + ['test' => $test] = $triggeringTest; - $state->add(TestResult::fromPestParallelTestCase( - $testResultEvent->test(), - TestResult::DEPRECATED, - ThrowableBuilder::from(new TestOutcome($testResultEvent->message())) - )); + $state->add(TestResult::fromPestParallelTestCase( + $test, + TestResult::DEPRECATED, + ThrowableBuilder::from(new TestOutcome($testResultEvent->description())) + )); + } } - foreach ($testResult->testTriggeredPhpDeprecationEvents() as $testResultEvent) { - $testResultEvent = $testResultEvent[0]; + foreach ($testResult->phpDeprecations() as $testResultEvent) { + foreach ($testResultEvent->triggeringTests() as $triggeringTest) { + ['test' => $test] = $triggeringTest; - $state->add(TestResult::fromPestParallelTestCase( - $testResultEvent->test(), - TestResult::DEPRECATED, - ThrowableBuilder::from(new TestOutcome($testResultEvent->message())) - )); + $state->add(TestResult::fromPestParallelTestCase( + $test, + TestResult::DEPRECATED, + ThrowableBuilder::from(new TestOutcome($testResultEvent->description())) + )); + } } - foreach ($testResult->testTriggeredNoticeEvents() as $testResultEvent) { - $testResultEvent = $testResultEvent[0]; + foreach ($testResult->notices() as $testResultEvent) { + foreach ($testResultEvent->triggeringTests() as $triggeringTest) { + ['test' => $test] = $triggeringTest; - $state->add(TestResult::fromPestParallelTestCase( - $testResultEvent->test(), - TestResult::NOTICE, - ThrowableBuilder::from(new TestOutcome($testResultEvent->message())) - )); + $state->add(TestResult::fromPestParallelTestCase( + $test, + TestResult::NOTICE, + ThrowableBuilder::from(new TestOutcome($testResultEvent->description())) + )); + } } - foreach ($testResult->testTriggeredPhpNoticeEvents() as $testResultEvent) { - $testResultEvent = $testResultEvent[0]; + foreach ($testResult->phpNotices() as $testResultEvent) { + foreach ($testResultEvent->triggeringTests() as $triggeringTest) { + ['test' => $test] = $triggeringTest; - $state->add(TestResult::fromPestParallelTestCase( - $testResultEvent->test(), - TestResult::NOTICE, - ThrowableBuilder::from(new TestOutcome($testResultEvent->message())) - )); + $state->add(TestResult::fromPestParallelTestCase( + $test, + TestResult::NOTICE, + ThrowableBuilder::from(new TestOutcome($testResultEvent->description())) + )); + } } - foreach ($testResult->testTriggeredWarningEvents() as $testResultEvent) { - $testResultEvent = $testResultEvent[0]; + foreach ($testResult->warnings() as $testResultEvent) { + foreach ($testResultEvent->triggeringTests() as $triggeringTest) { + ['test' => $test] = $triggeringTest; - $state->add(TestResult::fromPestParallelTestCase( - $testResultEvent->test(), - TestResult::WARN, - ThrowableBuilder::from(new TestOutcome($testResultEvent->message())) - )); + $state->add(TestResult::fromPestParallelTestCase( + $test, + TestResult::WARN, + ThrowableBuilder::from(new TestOutcome($testResultEvent->description())) + )); + } } - foreach ($testResult->testTriggeredPhpWarningEvents() as $testResultEvent) { - $testResultEvent = $testResultEvent[0]; + foreach ($testResult->phpWarnings() as $testResultEvent) { + foreach ($testResultEvent->triggeringTests() as $triggeringTest) { + ['test' => $test] = $triggeringTest; - $state->add(TestResult::fromPestParallelTestCase( - $testResultEvent->test(), - TestResult::WARN, - ThrowableBuilder::from(new TestOutcome($testResultEvent->message())) - )); + $state->add(TestResult::fromPestParallelTestCase( + $test, + TestResult::WARN, + ThrowableBuilder::from(new TestOutcome($testResultEvent->description())) + )); + } } // for each test that passed, we need to add it to the state @@ -140,7 +152,7 @@ final class StateGenerator new TestMethod( "$i", // @phpstan-ignore-line '', // @phpstan-ignore-line - '', + '', // @phpstan-ignore-line 1, TestDoxBuilder::fromClassNameAndMethodName('', ''), // @phpstan-ignore-line MetadataCollection::fromArray([]), diff --git a/src/Support/View.php b/src/Support/View.php index 9d5823a8..a73fd83a 100644 --- a/src/Support/View.php +++ b/src/Support/View.php @@ -5,9 +5,10 @@ declare(strict_types=1); namespace Pest\Support; use Symfony\Component\Console\Output\OutputInterface; +use Termwind\Termwind; + use function Termwind\render; use function Termwind\renderUsing; -use Termwind\Termwind; /** * @internal diff --git a/src/TestSuite.php b/src/TestSuite.php index 3504e764..885baa2f 100644 --- a/src/TestSuite.php +++ b/src/TestSuite.php @@ -11,6 +11,7 @@ use Pest\Repositories\BeforeAllRepository; use Pest\Repositories\BeforeEachRepository; use Pest\Repositories\SnapshotRepository; use Pest\Repositories\TestRepository; +use Pest\Support\Str; use PHPUnit\Framework\TestCase; /** @@ -105,4 +106,28 @@ final class TestSuite return self::$instance; } + + public function getFilename(): string + { + assert($this->test instanceof TestCase); + + return (fn () => self::$__filename)->call($this->test, $this->test::class); // @phpstan-ignore-line + } + + public function getDescription(): string + { + assert($this->test instanceof TestCase); + + $description = str_replace('__pest_evaluable_', '', $this->test->name()); + $datasetAsString = str_replace('__pest_evaluable_', '', Str::evaluable($this->test->dataSetAsStringWithData())); + + return str_replace(' ', '_', $description.$datasetAsString); + } + + public function registerSnapshotChange(string $message): void + { + assert($this->test instanceof TestCase); + + (fn (): string => $this->__snapshotChanges[] = $message)->call($this->test, $this->test::class); // @phpstan-ignore-line + } } diff --git a/stubs/init-laravel/phpunit.xml.stub b/stubs/init-laravel/phpunit.xml.stub index eb13aff1..9ce6b780 100644 --- a/stubs/init-laravel/phpunit.xml.stub +++ b/stubs/init-laravel/phpunit.xml.stub @@ -1,6 +1,6 @@ diff --git a/stubs/init/phpunit.xml.stub b/stubs/init/phpunit.xml.stub index ada83de9..70a8572e 100644 --- a/stubs/init/phpunit.xml.stub +++ b/stubs/init/phpunit.xml.stub @@ -1,6 +1,6 @@ diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/_describable__→_multiple_snapshot_expectations_with_describe.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/_describable__→_multiple_snapshot_expectations_with_describe.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/_describable__→_multiple_snapshot_expectations_with_describe.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/_describable__→_multiple_snapshot_expectations_with_describe__2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/_describable__→_multiple_snapshot_expectations_with_describe__2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/_describable__→_multiple_snapshot_expectations_with_describe__2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations__2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations__2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations__2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set___1____1___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar__.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar__.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar__.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar____2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar____2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____bar______bar____2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz__.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz__.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz__.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz____2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz____2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____baz______baz____2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo__.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo__.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo__.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo____2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo____2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_datasets_with_data_set____foo______foo____2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___10____10_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___10____10_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___10____10_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___10____10___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___10____10___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___10____10___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___1____1_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___1____1_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___1____1_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___1____1___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___1____1___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___1____1___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___2____2_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___2____2_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___2____2_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___2____2___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___2____2___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___2____2___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___3____3_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___3____3_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___3____3_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___3____3___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___3____3___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___3____3___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___4____4_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___4____4_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___4____4_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___4____4___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___4____4___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___4____4___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___5____5_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___5____5_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___5____5_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___5____5___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___5____5___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___5____5___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___6____6_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___6____6_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___6____6_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___6____6___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___6____6___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___6____6___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___7____7_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___7____7_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___7____7_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___7____7___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___7____7___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___7____7___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___8____8_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___8____8_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___8____8_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___8____8___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___8____8___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___8____8___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___9____9_.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___9____9_.snap new file mode 100644 index 00000000..7b5a8676 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___9____9_.snap @@ -0,0 +1 @@ +foo bar 1 \ No newline at end of file diff --git a/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___9____9___2.snap b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___9____9___2.snap new file mode 100644 index 00000000..206d0d02 --- /dev/null +++ b/tests/.pest/snapshots/Features/Expect/toMatchSnapshot/multiple_snapshot_expectations_with_repeat_with_data_set___9____9___2.snap @@ -0,0 +1 @@ +foo bar 2 \ No newline at end of file diff --git a/tests/.pest/snapshots/Visual/Help/visual_snapshot_of_help_command_output.snap b/tests/.pest/snapshots/Visual/Help/visual_snapshot_of_help_command_output.snap index c630e2d5..b0b2199c 100644 --- a/tests/.pest/snapshots/Visual/Help/visual_snapshot_of_help_command_output.snap +++ b/tests/.pest/snapshots/Visual/Help/visual_snapshot_of_help_command_output.snap @@ -1,5 +1,5 @@ - Pest Testing Framework 2.11.0. + Pest Testing Framework 2.15.0. USAGE: pest [options] diff --git a/tests/.pest/snapshots/Visual/Version/visual_snapshot_of_help_command_output.snap b/tests/.pest/snapshots/Visual/Version/visual_snapshot_of_help_command_output.snap index 30e2d8c5..9751ccf0 100644 --- a/tests/.pest/snapshots/Visual/Version/visual_snapshot_of_help_command_output.snap +++ b/tests/.pest/snapshots/Visual/Version/visual_snapshot_of_help_command_output.snap @@ -1,3 +1,3 @@ - Pest Testing Framework 2.11.0. + Pest Testing Framework 2.15.0. diff --git a/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index ee650c64..c0669f60 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -310,6 +310,18 @@ ✓ strict comparisons ✓ failures ✓ failures with custom message + ✓ not failures + + PASS Tests\Features\Expect\toBeAlpha + ✓ pass + ✓ failures + ✓ failures with custom message + ✓ not failures + + PASS Tests\Features\Expect\toBeAlphaNumeric + ✓ pass + ✓ failures + ✓ failures with custom message ✓ not failures PASS Tests\Features\Expect\toBeArray @@ -445,6 +457,12 @@ ✓ passes with DateTime and DateTimeImmutable ✓ failures ✓ failures with custom message + ✓ not failures + + PASS Tests\Features\Expect\toBeLowercase + ✓ pass + ✓ failures + ✓ failures with custom message ✓ not failures PASS Tests\Features\Expect\toBeNAN @@ -520,6 +538,12 @@ ✓ passes as not truthy with ('0') ✓ failures ✓ failures with custom message + ✓ not failures + + PASS Tests\Features\Expect\toBeUppercase + ✓ pass + ✓ failures + ✓ failures with custom message ✓ not failures PASS Tests\Features\Expect\toBeWritableDirectory @@ -700,6 +724,22 @@ ✓ failures ✓ failures with custom message ✓ not failures + ✓ multiple snapshot expectations + ✓ multiple snapshot expectations with datasets with (1) + ✓ multiple snapshot expectations with datasets with ('foo') + ✓ multiple snapshot expectations with datasets with ('bar') + ✓ multiple snapshot expectations with datasets with ('baz') + ✓ describable → multiple snapshot expectations with describe + ✓ multiple snapshot expectations with repeat @ repetition 1 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 2 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 3 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 4 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 5 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 6 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 7 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 8 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 9 of 10 + ✓ multiple snapshot expectations with repeat @ repetition 10 of 10 PASS Tests\Features\Expect\toStartWith ✓ pass @@ -1001,9 +1041,15 @@ PASS Tests\PHPUnit\CustomAffixes\snakecasespec ✓ it runs file names like snake_case_spec.php + PASS Tests\CustomTestCase\ChildTest + ✓ override method + PASS Tests\CustomTestCase\ExecutedTest ✓ that gets executed + PASS Tests\CustomTestCase\ParentTest + ✓ override method + PASS Tests\PHPUnit\CustomTestCase\UsesPerDirectory ✓ closure was bound to CustomTestCase @@ -1196,4 +1242,4 @@ WARN Tests\Visual\Version - visual snapshot of help command output - Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 19 skipped, 846 passed (1968 assertions) \ No newline at end of file + Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 19 skipped, 878 passed (2013 assertions) diff --git a/tests/.snapshots/todo.txt b/tests/.snapshots/todo.txt index 1d3687a5..414d1b98 100644 --- a/tests/.snapshots/todo.txt +++ b/tests/.snapshots/todo.txt @@ -19,7 +19,13 @@ ↓ something todo later chained ↓ something todo later chained and with function body + PASS Tests\CustomTestCase\ChildTest + ✓ override method + PASS Tests\CustomTestCase\ExecutedTest ✓ that gets executed - Tests: 13 todos, 1 passed (1 assertions) + PASS Tests\CustomTestCase\ParentTest + ✓ override method + + Tests: 13 todos, 3 passed (3 assertions) diff --git a/tests/Features/Expect/toBeAlpha.php b/tests/Features/Expect/toBeAlpha.php new file mode 100644 index 00000000..659c2de1 --- /dev/null +++ b/tests/Features/Expect/toBeAlpha.php @@ -0,0 +1,20 @@ +toBeAlpha(); + expect('123')->not->toBeAlpha(); +}); + +test('failures', function () { + expect('123')->toBeAlpha(); +})->throws(ExpectationFailedException::class); + +test('failures with custom message', function () { + expect('123')->toBeAlpha('oh no!'); +})->throws(ExpectationFailedException::class, 'oh no!'); + +test('not failures', function () { + expect('abc')->not->toBeAlpha(); +})->throws(ExpectationFailedException::class); diff --git a/tests/Features/Expect/toBeAlphaNumeric.php b/tests/Features/Expect/toBeAlphaNumeric.php new file mode 100644 index 00000000..5f4670e8 --- /dev/null +++ b/tests/Features/Expect/toBeAlphaNumeric.php @@ -0,0 +1,20 @@ +toBeAlphaNumeric(); + expect('-')->not->toBeAlphaNumeric(); +}); + +test('failures', function () { + expect('-')->toBeAlphaNumeric(); +})->throws(ExpectationFailedException::class); + +test('failures with custom message', function () { + expect('-')->toBeAlphaNumeric('oh no!'); +})->throws(ExpectationFailedException::class, 'oh no!'); + +test('not failures', function () { + expect('abc123')->not->toBeAlphaNumeric(); +})->throws(ExpectationFailedException::class); diff --git a/tests/Features/Expect/toBeDigits.php b/tests/Features/Expect/toBeDigits.php new file mode 100644 index 00000000..7b8d6d98 --- /dev/null +++ b/tests/Features/Expect/toBeDigits.php @@ -0,0 +1,20 @@ +toBeDigits(); + expect('123.14')->not->toBeDigits(); +}); + +test('failures', function () { + expect('123.14')->toBeDigits(); +})->throws(ExpectationFailedException::class); + +test('failures with custom message', function () { + expect('123.14')->toBeDigits('oh no!'); +})->throws(ExpectationFailedException::class, 'oh no!'); + +test('not failures', function () { + expect('445')->not->toBeDigits(); +})->throws(ExpectationFailedException::class); diff --git a/tests/Features/Expect/toBeLowercase.php b/tests/Features/Expect/toBeLowercase.php new file mode 100644 index 00000000..4eda711b --- /dev/null +++ b/tests/Features/Expect/toBeLowercase.php @@ -0,0 +1,20 @@ +toBeLowercase(); + expect('UPPERCASE')->not->toBeLowercase(); +}); + +test('failures', function () { + expect('UPPERCASE')->toBeLowercase(); +})->throws(ExpectationFailedException::class); + +test('failures with custom message', function () { + expect('UPPERCASE')->toBeLowercase('oh no!'); +})->throws(ExpectationFailedException::class, 'oh no!'); + +test('not failures', function () { + expect('lowercase')->not->toBeLowercase(); +})->throws(ExpectationFailedException::class); diff --git a/tests/Features/Expect/toBeUppercase.php b/tests/Features/Expect/toBeUppercase.php new file mode 100644 index 00000000..7a1345d7 --- /dev/null +++ b/tests/Features/Expect/toBeUppercase.php @@ -0,0 +1,20 @@ +toBeUppercase(); + expect('lowercase')->not->toBeUppercase(); +}); + +test('failures', function () { + expect('lowercase')->toBeUppercase(); +})->throws(ExpectationFailedException::class); + +test('failures with custom message', function () { + expect('lowercase')->toBeUppercase('oh no!'); +})->throws(ExpectationFailedException::class, 'oh no!'); + +test('not failures', function () { + expect('UPPERCASE')->not->toBeUppercase(); +})->throws(ExpectationFailedException::class); diff --git a/tests/Features/Expect/toMatchSnapshot.php b/tests/Features/Expect/toMatchSnapshot.php index 29a63a59..ed5c8458 100644 --- a/tests/Features/Expect/toMatchSnapshot.php +++ b/tests/Features/Expect/toMatchSnapshot.php @@ -16,13 +16,13 @@ beforeEach(function () { }); test('pass', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); expect($this->snapshotable)->toMatchSnapshot(); }); test('pass with `__toString`', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); $object = new class($this->snapshotable) { @@ -36,11 +36,11 @@ test('pass with `__toString`', function () { } }; - expect($object)->toMatchSnapshot()->toMatchSnapshot(); + expect($object)->toMatchSnapshot(); }); test('pass with `toString`', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); $object = new class($this->snapshotable) { @@ -54,12 +54,12 @@ test('pass with `toString`', function () { } }; - expect($object)->toMatchSnapshot()->toMatchSnapshot(); + expect($object)->toMatchSnapshot(); }); test('pass with dataset', function ($data) { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); - [$filename] = TestSuite::getInstance()->snapshots->get($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); + [$filename] = TestSuite::getInstance()->snapshots->get(); expect($filename)->toEndWith('pass_with_dataset_with_data_set____my_datas_set_value______my_datas_set_value__.snap') ->and($this->snapshotable)->toMatchSnapshot(); @@ -67,8 +67,8 @@ test('pass with dataset', function ($data) { describe('within describe', function () { test('pass with dataset', function ($data) { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); - [$filename] = TestSuite::getInstance()->snapshots->get($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); + [$filename] = TestSuite::getInstance()->snapshots->get(); expect($filename)->toEndWith('pass_with_dataset_with_data_set____my_datas_set_value______my_datas_set_value__.snap') ->and($this->snapshotable)->toMatchSnapshot(); @@ -76,7 +76,7 @@ describe('within describe', function () { })->with(['my-datas-set-value']); test('pass with `toArray`', function () { - TestSuite::getInstance()->snapshots->save($this, json_encode(['key' => $this->snapshotable], JSON_PRETTY_PRINT)); + TestSuite::getInstance()->snapshots->save(json_encode(['key' => $this->snapshotable], JSON_PRETTY_PRINT)); $object = new class($this->snapshotable) { @@ -92,31 +92,57 @@ test('pass with `toArray`', function () { } }; - expect($object)->toMatchSnapshot()->toMatchSnapshot(); + expect($object)->toMatchSnapshot(); }); test('pass with array', function () { - TestSuite::getInstance()->snapshots->save($this, json_encode(['key' => $this->snapshotable], JSON_PRETTY_PRINT)); + TestSuite::getInstance()->snapshots->save(json_encode(['key' => $this->snapshotable], JSON_PRETTY_PRINT)); expect([ 'key' => $this->snapshotable, - ])->toMatchSnapshot()->toMatchSnapshot(); + ])->toMatchSnapshot(); }); test('failures', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); expect('contain that does not match snapshot')->toMatchSnapshot(); })->throws(ExpectationFailedException::class, 'Failed asserting that two strings are identical.'); test('failures with custom message', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); expect('contain that does not match snapshot')->toMatchSnapshot('oh no'); })->throws(ExpectationFailedException::class, 'oh no'); test('not failures', function () { - TestSuite::getInstance()->snapshots->save($this, $this->snapshotable); + TestSuite::getInstance()->snapshots->save($this->snapshotable); expect($this->snapshotable)->not->toMatchSnapshot(); })->throws(ExpectationFailedException::class); + +test('multiple snapshot expectations', function () { + expect('foo bar 1')->toMatchSnapshot(); + + expect('foo bar 2')->toMatchSnapshot(); +}); + +test('multiple snapshot expectations with datasets', function () { + expect('foo bar 1')->toMatchSnapshot(); + + expect('foo bar 2')->toMatchSnapshot(); +})->with([1, 'foo', 'bar', 'baz']); + +describe('describable', function () { + test('multiple snapshot expectations with describe', function () { + expect('foo bar 1')->toMatchSnapshot(); + + expect('foo bar 2')->toMatchSnapshot(); + }); +}); + +test('multiple snapshot expectations with repeat', function () { + expect('foo bar 1')->toMatchSnapshot(); + + expect('foo bar 2')->toMatchSnapshot(); +})->repeat(10); diff --git a/tests/PHPUnit/CustomTestCase/ChildTest.php b/tests/PHPUnit/CustomTestCase/ChildTest.php new file mode 100644 index 00000000..15ad37cc --- /dev/null +++ b/tests/PHPUnit/CustomTestCase/ChildTest.php @@ -0,0 +1,13 @@ +getEntity() || true); + } +} diff --git a/tests/Visual/Parallel.php b/tests/Visual/Parallel.php index 406c0f5b..84d89a0d 100644 --- a/tests/Visual/Parallel.php +++ b/tests/Visual/Parallel.php @@ -16,7 +16,7 @@ $run = function () { test('parallel', function () use ($run) { expect($run('--exclude-group=integration')) - ->toContain('Tests: 1 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 15 skipped, 833 passed (1932 assertions)') + ->toContain('Tests: 1 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 15 skipped, 867 passed (1998 assertions)') ->toContain('Parallel: 3 processes'); })->skipOnWindows();