diff --git a/src/PendingCalls/TestCall.php b/src/PendingCalls/TestCall.php index 3586cdcc..9e7f718f 100644 --- a/src/PendingCalls/TestCall.php +++ b/src/PendingCalls/TestCall.php @@ -216,12 +216,37 @@ final class TestCall return $this; } + /** + * Skips the current test on the given PHP version. + */ + public function skipOnPhp(string $version): self + { + if (mb_strlen($version) < 2) { + throw new InvalidArgumentException('The version must start with [<] or [>].'); + } + + if (str_starts_with($version, '>=') || str_starts_with($version, '<=')) { + $operator = substr($version, 0, 2); + $version = substr($version, 2); + } elseif (str_starts_with($version, '>') || str_starts_with($version, '<')) { + $operator = $version[0]; + $version = substr($version, 1); + // ensure starts with number: + } elseif (is_numeric($version[0])) { + $operator = '=='; + } else { + throw new InvalidArgumentException('The version must start with [<, >, <=, >=] or a number.'); + } + + return $this->skip(version_compare(PHP_VERSION, $version, $operator), sprintf('This test is skipped on PHP [%s%s].', $operator, $version)); + } + /** * Skips the current test if the given test is running on Windows. */ public function skipOnWindows(): self { - return $this->skipOn('Windows', 'This test is skipped on [Windows].'); + return $this->skipOnOs('Windows', 'This test is skipped on [Windows].'); } /** @@ -229,7 +254,7 @@ final class TestCall */ public function skipOnMac(): self { - return $this->skipOn('Darwin', 'This test is skipped on [Mac].'); + return $this->skipOnOs('Darwin', 'This test is skipped on [Mac].'); } /** @@ -237,13 +262,13 @@ final class TestCall */ public function skipOnLinux(): self { - return $this->skipOn('Linux', 'This test is skipped on [Linux].'); + return $this->skipOnOs('Linux', 'This test is skipped on [Linux].'); } /** * Skips the current test if the given test is running on the given operating systems. */ - private function skipOn(string $osFamily, string $message): self + private function skipOnOs(string $osFamily, string $message): self { return $osFamily === PHP_OS_FAMILY ? $this->skip($message) diff --git a/src/Pest.php b/src/Pest.php index 30b83c2b..6a361fcf 100644 --- a/src/Pest.php +++ b/src/Pest.php @@ -6,7 +6,7 @@ namespace Pest; function version(): string { - return '3.0.0-dev-0001'; + return '3.0.0-dev-0002'; } function testDirectory(string $file = ''): string 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 deleted file mode 100644 index b2569ab7..00000000 --- a/tests/.pest/snapshots/Visual/Help/visual_snapshot_of_help_command_output.snap +++ /dev/null @@ -1,118 +0,0 @@ - - Pest Testing Framework 3.0.0-dev-0001. - - USAGE: pest [options] - - CONFIGURATION OPTIONS: - --init ............................ Initialise a standard Pest configuration - --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 [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 - --generate-baseline [file] .................... Generate baseline for issues - --use-baseline [file] ........................ Use baseline to ignore issues - --ignore-baseline ..................... Do not use baseline to ignore issues - - SELECTION OPTIONS: - --bail ........................... Stop execution upon first not-passed test - --todos ........................ Output to standard output the list of todos - --retry Run non-passing tests first and stop execution upon first error or failure - --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 [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 [file] ................. List available tests in XML format - --filter [pattern] ............................... Filter which tests to run - --exclude-filter [pattern] .. Exclude tests for the specified filter pattern - --test-suffix [suffixes] Only search for test in files with specified suffix(es). Default: Test.php,.phpt - - EXECUTION OPTIONS: - --parallel ........................................... Run tests in parallel - --update-snapshots Update snapshots for tests using the "toMatchSnapshot" expectation - --process-isolation ................ Run each test in a separate PHP process - --globals-backup ................. Backup and restore $GLOBALS for each test - --static-backup ......... Backup and restore static properties for each test - --strict-coverage ................... Be strict about code coverage metadata - --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 [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 after first error, failure, warning, or risky test - --stop-on-error ..................................... Stop after first error - --stop-on-failure ................................. Stop after first failure - --stop-on-warning ................................. Stop after first warning - --stop-on-risky ................................ Stop after first risky test - --stop-on-deprecation ... Stop after first test that triggered a deprecation - --stop-on-notice ............. Stop after first test that triggered a notice - --stop-on-skipped ............................ Stop after first skipped test - --stop-on-incomplete ...................... Stop after first incomplete test - --fail-on-warning Signal failure using shell exit code when a warning was triggered - --fail-on-risky Signal failure using shell exit code when a test was considered risky - --fail-on-deprecation Signal failure using shell exit code when a deprecation was triggered - --fail-on-notice Signal failure using shell exit code when a notice was triggered - --fail-on-skipped Signal failure using shell exit code when a test was skipped - --fail-on-incomplete Signal failure using shell exit code when a test was marked incomplete - --cache-result ............................ Write test results to cache file - --do-not-cache-result .............. Do not write test results to cache file - --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 [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 - --no-results ................................ Disable output of test results - --no-output ............................................. Disable all output - --display-incomplete .................. Display details for incomplete tests - --display-skipped ........................ Display details for skipped tests - --display-deprecations . Display details for deprecations triggered by tests - --display-errors ............. Display details for errors triggered by tests - --display-notices ........... Display details for notices triggered by tests - --display-warnings ......... Display details for warnings triggered by tests - --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 - --debug Replace default progress and result output with debugging information - --compact ................ Replace default result output with Compact format - - LOGGING OPTIONS: - --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 extended 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-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 [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 - - PROFILING OPTIONS: - --profile .............. Output to standard output the top ten slowest tests - 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 deleted file mode 100644 index 777a72dd..00000000 --- a/tests/.pest/snapshots/Visual/Version/visual_snapshot_of_help_command_output.snap +++ /dev/null @@ -1,3 +0,0 @@ - - Pest Testing Framework 3.0.0-dev-0001. - diff --git a/tests/.snapshots/success.txt b/tests/.snapshots/success.txt index a03a6bdb..b9243353 100644 --- a/tests/.snapshots/success.txt +++ b/tests/.snapshots/success.txt @@ -1090,6 +1090,12 @@ - it can use something in the test case as a condition → This test was skipped - it can user higher order callables and skip + WARN Tests\Features\SkipOnPhp + ✓ it can run on php version + - it can skip on specific php version → This test is skipped on PHP [==8.3.1]. + ✓ it can run on specific php version + - it can skip on php versions depending on constraint → This test is skipped on PHP [>=7.4.0]. + PASS Tests\Features\Test ✓ a test ✓ higher order message test @@ -1368,4 +1374,4 @@ WARN Tests\Visual\Version - visual snapshot of help command output - Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 23 skipped, 968 passed (2293 assertions) \ No newline at end of file + Tests: 2 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 21 skipped, 978 passed (2304 assertions) diff --git a/tests/Features/SkipOnPhp.php b/tests/Features/SkipOnPhp.php new file mode 100644 index 00000000..ad528954 --- /dev/null +++ b/tests/Features/SkipOnPhp.php @@ -0,0 +1,17 @@ +skipOnPhp('<=7.4.0') + ->assertTrue(true); + +it('can skip on specific php version') + ->skipOnPhp(PHP_VERSION) + ->assertTrue(false); + +it('can run on specific php version') + ->skipOnPhp('7.4.0') + ->assertTrue(true); + +it('can skip on php versions depending on constraint') + ->skipOnPhp('>=7.4.0') + ->assertTrue(false); diff --git a/tests/Visual/Parallel.php b/tests/Visual/Parallel.php index 1b5eb3a2..78053666 100644 --- a/tests/Visual/Parallel.php +++ b/tests/Visual/Parallel.php @@ -18,7 +18,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, 963 passed (2283 assertions)') + ->toContain('Tests: 1 deprecated, 4 warnings, 5 incomplete, 2 notices, 13 todos, 17 skipped, 965 passed (2285 assertions)') ->toContain('Parallel: 3 processes'); })->skipOnWindows();