diff --git a/composer.json b/composer.json index 9feafffc..2b937bb8 100644 --- a/composer.json +++ b/composer.json @@ -83,6 +83,7 @@ "extra": { "pest": { "plugins": [ + "Pest\\Plugins\\Bail", "Pest\\Plugins\\Cache", "Pest\\Plugins\\Coverage", "Pest\\Plugins\\Init", diff --git a/src/Bootstrappers/BootSubscribers.php b/src/Bootstrappers/BootSubscribers.php index 43ee7db1..1a5a6c74 100644 --- a/src/Bootstrappers/BootSubscribers.php +++ b/src/Bootstrappers/BootSubscribers.php @@ -23,8 +23,9 @@ final class BootSubscribers implements Bootstrapper private const SUBSCRIBERS = [ Subscribers\EnsureConfigurationIsValid::class, Subscribers\EnsureConfigurationIsAvailable::class, - Subscribers\EnsureTeamCityEnabled::class, + Subscribers\EnsureIgnorableTestCasesAreIgnored::class, Subscribers\EnsureKernelDumpIsFlushed::class, + Subscribers\EnsureTeamCityEnabled::class, ]; /** diff --git a/src/Plugins/Bail.php b/src/Plugins/Bail.php new file mode 100644 index 00000000..2920a97a --- /dev/null +++ b/src/Plugins/Bail.php @@ -0,0 +1,30 @@ +hasArgument('--bail', $arguments)) { + $arguments = $this->popArgument('--bail', $arguments); + + $arguments = $this->pushArgument('--stop-on-defect', $arguments); + } + + return $arguments; + } +} diff --git a/src/Plugins/Help.php b/src/Plugins/Help.php index 4e3ba55f..0ba60883 100644 --- a/src/Plugins/Help.php +++ b/src/Plugins/Help.php @@ -58,6 +58,8 @@ final class Help implements HandlesArguments 'desc' => $description, ] = $option; + assert(is_string($argument)); + View::render('components.two-column-detail', [ 'left' => $this->colorizeOptions($argument), 'right' => preg_replace(['//'], ['[', ']'], $description), @@ -78,7 +80,7 @@ final class Help implements HandlesArguments */ private function colorizeOptions(string $argument): string { - return preg_replace( + return (string) preg_replace( ['//', '/(-+[\w-]+)/'], ['[', ']', '$1'], $argument @@ -95,12 +97,12 @@ final class Help implements HandlesArguments /** @var array> $content */ $content = $helpReflection->getConstant('HELP_TEXT'); - $content['Configuration'] = [[ + $content['Configuration'] = [...[[ 'arg' => '--init', 'desc' => 'Initialise a standard Pest configuration', - ], $content['Configuration']]; + ]], ...$content['Configuration']]; - $content['Selection'] = [ + $content['Selection'] = array_merge([ [ 'arg' => '--todos', 'desc' => 'Output to standard output the list of todos', @@ -109,7 +111,7 @@ final class Help implements HandlesArguments 'arg' => '--retry', 'desc' => 'Run non-passing tests first and stop execution upon first error or failure', ], - ] + $content['Selection']; + ], $content['Selection']); $content['Reporting'] = [...$content['Reporting'], ...[ [ diff --git a/src/Subscribers/EnsureIgnorableTestCasesAreIgnored.php b/src/Subscribers/EnsureIgnorableTestCasesAreIgnored.php new file mode 100644 index 00000000..1cf3d55a --- /dev/null +++ b/src/Subscribers/EnsureIgnorableTestCasesAreIgnored.php @@ -0,0 +1,42 @@ +getProperty('collector'); + $property->setAccessible(true); + $collector = $property->getValue(); + + assert($collector instanceof Collector); + + $reflection = new ReflectionClass($collector); + $property = $reflection->getProperty('testRunnerTriggeredWarningEvents'); + $property->setAccessible(true); + + /** @var array $testRunnerTriggeredWarningEvents */ + $testRunnerTriggeredWarningEvents = $property->getValue($collector); + + $testRunnerTriggeredWarningEvents = array_values(array_filter($testRunnerTriggeredWarningEvents, fn (WarningTriggered $event): bool => $event->message() !== 'No tests found in class "Pest\TestCases\IgnorableTestCase".')); + + $property->setValue($collector, $testRunnerTriggeredWarningEvents); + } +} diff --git a/tests/.snapshots/help-command.txt b/tests/.snapshots/help-command.txt index bfc2d07e..9a350f3d 100644 --- a/tests/.snapshots/help-command.txt +++ b/tests/.snapshots/help-command.txt @@ -5,28 +5,31 @@ CONFIGURATION OPTIONS: --init ............................ Initialise a standard Pest configuration - -c|--configuration ....................... Read configuration from XML file + --bootstrap [file] ...... A PHP script that is included before the tests run + -c|--configuration [file] ................. Read configuration from XML file --no-configuration ......... Ignore default configuration file (phpunit.xml) --no-extensions ............................. Do not load PHPUnit extensions - --include-path ..... Prepend PHP's include_path with given path(s) - -d ...................................... Sets a php.ini value - --cache-directory ................................. Specify cache directory + --include-path [path(s)] ..... Prepend PHP's include_path with given path(s) + -d [key[=value]] ...................................... Sets a php.ini value + --cache-directory [dir] ............................ Specify cache directory --generate-configuration Generate configuration file with suggested settings --migrate-configuration ....... Migrate configuration file to current format SELECTION OPTIONS: --todos ........................ Output to standard output the list of todos --retry Run non-passing tests first and stop execution upon first error or failure - --exclude-testsuite ........ Exclude tests from the specified test suite(s) + --list-suites ................................... List available test suites + --testsuite [name] ......... Only run tests from the specified test suite(s) + --exclude-testsuite [name] .. Exclude tests from the specified test suite(s) --list-groups ................................... List available test groups - --group ........................ Only run tests from the specified group(s) - --exclude-group ................. Exclude tests from the specified group(s) - --covers ............................. Only run tests that intend to cover - --uses ................................. Only run tests that intend to use + --group [name] .................. Only run tests from the specified group(s) + --exclude-group [name] ........... Exclude tests from the specified group(s) + --covers [name] ................. Only run tests that intend to cover [name] + --uses [name] ..................... Only run tests that intend to use [name] --list-tests .......................................... List available tests - --list-tests-xml ....................... List available tests in XML format - --filter ........................................ Filter which tests to run - --test-suffix Only search for test in files with specified suffix(es). Default: Test.php,.phpt + --list-tests-xml [file] ................. List available tests in XML format + --filter [pattern] ............................... Filter which tests to run + --test-suffix [suffixes] Only search for test in files with specified suffix(es). Default: Test.php,.phpt EXECUTION OPTIONS: --process-isolation ................ Run each test in a separate PHP process @@ -36,7 +39,7 @@ --strict-global-state .............. Be strict about changes to global state --disallow-test-output ................. Be strict about output during tests --enforce-time-limit ................. Enforce time limit based on test size - --default-time-limit Timeout in seconds for tests that have no declared size + --default-time-limit [sec] Timeout in seconds for tests that have no declared size --dont-report-useless-tests .. Do not report tests that do not test anything --stop-on-defect ................. Stop execution upon first not-passed test --stop-on-error ............................ Stop execution upon first error @@ -51,12 +54,12 @@ --fail-on-warning .................... Treat tests with warnings as failures --cache-result ............................ Write test results to cache file --do-not-cache-result .............. Do not write test results to cache file - --order-by Run tests in order: default|defects|depends|duration|no-depends|random|reverse|size - --random-order-seed Use the specified random seed when running tests in random order + --order-by [order] Run tests in order: default|defects|depends|duration|no-depends|random|reverse|size + --random-order-seed [N] Use the specified random seed when running tests in random order REPORTING OPTIONS: - --colors ............... Use colors in output ("never", "auto" or "always") - --columns .................... Number of columns to use for progress output + --colors [flag] ......... Use colors in output ("never", "auto" or "always") + --columns [n] ................. Number of columns to use for progress output --columns max ............ Use maximum number of columns for progress output --stderr ................................. Write to STDERR instead of STDOUT --no-progress .................... Disable output of test execution progress @@ -71,26 +74,29 @@ --reverse-list .............................. Print defects in reverse order --teamcity . Replace default progress and result output with TeamCity format --testdox ................ Replace default result output with TestDox format + --compact ................ Replace default result output with Compact format LOGGING OPTIONS: - --log-junit ................ Write test results in JUnit XML format to file - --log-teamcity .............. Write test results in TeamCity format to file - --testdox-html ........ Write test results in TestDox format (HTML) to file - --testdox-text .. Write test results in TestDox format (plain text) to file - --log-events-text ..................... Stream events as plain text to file - --log-events-verbose-text Stream events as plain text (with telemetry information) to file + --log-junit [file] .......... Write test results in JUnit XML format to file + --log-teamcity [file] ........ Write test results in TeamCity format to file + --testdox-html [file] .. Write test results in TestDox format (HTML) to file + --testdox-text [file] Write test results in TestDox format (plain text) to file + --log-events-text [file] ............... Stream events as plain text to file + --log-events-verbose-text [file] Stream events as plain text (with telemetry information) to file --no-logging ....... Ignore logging configured in the XML configuration file CODE COVERAGE OPTIONS: --coverage ..... Generate code coverage report and output to standard output --coverage --min Set the minimum required coverage percentage, and fail if not met - --coverage-crap4j . Write code coverage report in Crap4J XML format to file - --coverage-html .... Write code coverage report in HTML format to directory - --coverage-php ................ Write serialized code coverage data to file - --coverage-text= Write code coverage report in text format to file [default: standard output] - --coverage-xml ...... Write code coverage report in XML format to directory + --coverage-clover [file] Write code coverage report in Clover XML format to file + --coverage-cobertura [file] Write code coverage report in Cobertura XML format to file + --coverage-crap4j [file] Write code coverage report in Crap4J XML format to file + --coverage-html [dir] Write code coverage report in HTML format to directory + --coverage-php [file] .......... Write serialized code coverage data to file + --coverage-text=[file] Write code coverage report in text format to file [default: standard output] + --coverage-xml [dir] . Write code coverage report in XML format to directory --warm-coverage-cache ........................... Warm static analysis cache - --coverage-filter ..................... Include in code coverage reporting + --coverage-filter [dir] ........... Include [dir] in code coverage reporting --path-coverage .......... Report path coverage in addition to line coverage --disable-coverage-ignore ...... Disable metadata for ignoring code coverage --no-coverage Ignore code coverage reporting configured in the XML configuration file