| by dg | HttpAssert: headers are taken from the final response only With follow: true, curl returns header blocks of all responses in the redirect chain (and interim responses like 100 Continue), and they were merged into one array, so e.g. Location of the 302 response was visible after following it. Now each status line resets the parsed headers. A header sent multiple times (e.g. Set-Cookie) is combined into one comma-separated value instead of keeping only the last one. | | | |
| by dg | HttpAssert: header existence checks are counted as assertions expectHeader() without an expected value and denyHeader() for a missing header did not increment Assert::$counter, so a test consisting only of such checks failed with "This test forgets to execute an assertion". | | | |
| by dg | Dumper: toPhp() no longer modifies dumped data containing references A float reachable through a PHP reference (array item, object property) was converted to a string in the original variable, so a failed assertion could change data used later by the test or its teardown. INF, -INF and NAN are now dumped as valid PHP instead of INF.0 etc. | | | |
| by dg | Assert: exception() and error() verify also an empty or '0' message A message pattern '' or '0' was treated as "do not check", so any message passed. Now only null skips the check. Tests that used '' to disable the message check must pass null instead. The failure message also shows an exception or error message '0' instead of omitting it. | | | |
| by dg | Job: fixed parsing of CGI headers Header lines were split by CRLF only, so anything the interpreter printed before the headers (a startup warning about a missing extension, for example) merged with the first header and swallowed it, most visibly Status, which made @httpCode read the wrong code. Not covered by a test, as it needs php-cgi printing something before the headers. | | | |
| by dg | Runner: @phpVersion no longer skips the version it requires The operands of version_compare() were swapped, so the annotation was compared against the interpreter instead of the other way round and the result was used directly as the skip condition. Equality therefore fell on the wrong side: @phpVersion 8.4.3 was skipped on PHP 8.4.3, and @phpVersion < 8.0 ran on PHP 8.0. The condition is now "skip unless the interpreter satisfies the annotation", which fixes every boundary case at once. Two-component annotations such as @phpVersion 8.4 keep working as before, since '8.4' sorts below '8.4.0'. | | | |
| by dg | Dumper: stack traces now show call arguments Frames other than Assert:: calls now display the actual argument values (from the backtrace) instead of empty parentheses, so it's clear which call failed - e.g. redirect('https://…', 'https://…', 302, 'cs') rather than redirect(). Each value is shortened via toLine() and the argument list is capped, so large strings/arrays/objects can't flood the output. Environment enables zend.exception_ignore_args=0 so the arguments are available regardless of the php.ini profile. | | | |
| by dg | Environment::lock() no longer consumes the test time limit while waiting On Windows the time limit measures real time, so a test blocked on the lock could be killed by 'Maximum execution time exceeded' before it even started. The limit is lifted for the flock() wait and set again right after, so the test has its full time limit from the moment it acquires the lock. | | | |
| by dg | TestCase: run() continues with remaining tests after a failure [Closes #469] The results of all methods are printed first, followed by the details of each failure. The last failure is rethrown and determines the exit code, so an error takes precedence over a failed assertion. | | | |
| by dg | test: restored test lost in 6b046673 The test was accidentally deleted in "extracted Ansi class from Dumper". Instead of httpbin.org it now uses the built-in PHP server with a fixture script, so it is fast and deterministic. Under php-cgi and phpdbg the server is started by the sibling CLI binary; without it the test is skipped. | | | |
| by dg | phpstan fixes | | | |
| by dg | added AGENTS.md & DOCS | | | |
| by dg | CI: switched Coveralls upload to the official action The php-coveralls phar is replaced by coverallsapp/github-action, which resolves the token and the absolute paths in the Clover report on its own, so tests/.coveralls.yml is no longer needed. Coverage is now uploaded even when tests crash under phpdbg. Being phpdbg-compatible is not a goal, but until now the failing step aborted the job before the upload ever ran. The job-level continue-on-error is gone, so genuine failures, including a rejected upload, are visible. | | | |
| by dg | only compiler-optimized functions in use-function imports | | | |
| by dg | cs | | | |
| by dg | Released version 2.6.1 | | | |
| by milo | PhpInterpreter: pass command to proc_open() as array - PHP escapes arguments itself - subshell call is bypassed on Linux too | | | |
| by dg | updated ncs.xml | | | |
| by dg | updated github actions | | | |
| by dg | fixed PHPStan errors | | | |
| by dg | throw exception in Test::getResult() when result not yet set | | | |
| by dg | improved PHPDoc descriptions | | | |
| by dg | improved phpDoc types | | | |
| by dg | fixed tests | | | |
| by dg | cs | | | |
| by dg | singleline declare statements | | | |
| by dg | Released version 2.6.0 | | | |
| by dg | made static analysis mandatory | | | |
| by dg | added PHPStan baseline & fixes | | | |
| by dg | centralized cursor hiding in CliTester | | | |
| by dg | ConsolePrinter: removed dependency on mbstring | | | |
| by dg | ConsolePrinter: refactoring, added modes | | | |