Author Commit message Committed SHA  
 
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

Last synchronization: 2026-10-12 00:02:26