* fix: key Tia worker partials per process to survive batch recycling
* test(tia): refresh visual snapshots for the worker token test
---------
Co-authored-by: Punyapal Shah <53343069+MrPunyapal@users.noreply.github.com>
When phpunit.xml has <coverage> and <source> sections, PHPUnit
auto-initializes its code coverage driver which takes over
xdebug's coverage APIs. TIA's recorder then gets empty data
from xdebug_get_code_coverage(), resulting in zero recorded
edges and no graph being saved.
Inject --no-coverage into the arguments when TIA enters its
own recording mode (not piggybacking on an explicit coverage
report). This tells PHPUnit to ignore XML-configured coverage
reports, leaving xdebug free for TIA's per-test recording.
Having <coverage> and <source> in phpunit.xml is standard for
any project that generates coverage reports. Without this fix,
users must manually pass --no-coverage alongside --tia, which
is an unnecessary footgun.
* feat: allow configuring the TIA directory
* refactor: simplify TIA directory resolution
* fix: bootstrap TIA state after configuration
* chore: apply Rector to TIA storage test
* fix: stabilize checks on pull requests
* fix: align TIA fixture branch resolution
* fix: preserve success snapshot formatting
* fix: order TIA storage snapshot
* chore: keep TIA directory changes scoped
PHP coerces numeric-string array keys to ints, so collecting table names in
$tables[$name] and returning array_keys() can yield ints. That breaks the
declared list<string> and throws a TypeError in Recorder::linkTable(string).
Standard SQL like substring(x FROM 1 FOR 10) is enough to trigger it, since
the numeric operand matches the FROM pattern.
Closes#1793
Co-authored-by: Danny de Wit <d.dewit@fenceweb.com>
The result cache was keyed `Class::method` on both sides, so every row of a
`->with()` test shared one entry and the last writer won. On replay that single
status was handed to every row.
`TestMethod::id()` already appends `#dataSetName`, and `TestCase` reaches the
same value object through `valueObjectForEvents()`, so both sides can use it.