mirror of
https://github.com/pestphp/pest.git
synced 2026-04-21 06:27:28 +02:00
feat(tia): continues to work on poc
This commit is contained in:
@ -101,18 +101,29 @@ final class Graph
|
|||||||
*/
|
*/
|
||||||
public function affected(array $changedFiles): array
|
public function affected(array $changedFiles): array
|
||||||
{
|
{
|
||||||
// 1. Coverage-edge lookup (PHP → PHP).
|
// Normalise all changed paths once.
|
||||||
$changedIds = [];
|
$normalised = [];
|
||||||
|
|
||||||
foreach ($changedFiles as $file) {
|
foreach ($changedFiles as $file) {
|
||||||
$rel = $this->relative($file);
|
$rel = $this->relative($file);
|
||||||
|
|
||||||
if ($rel === null) {
|
if ($rel !== null) {
|
||||||
continue;
|
$normalised[] = $rel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 1. Coverage-edge lookup (PHP → PHP).
|
||||||
|
$changedIds = [];
|
||||||
|
$unknownSourceDirs = [];
|
||||||
|
|
||||||
|
foreach ($normalised as $rel) {
|
||||||
if (isset($this->fileIds[$rel])) {
|
if (isset($this->fileIds[$rel])) {
|
||||||
$changedIds[$this->fileIds[$rel]] = true;
|
$changedIds[$this->fileIds[$rel]] = true;
|
||||||
|
} elseif (str_ends_with($rel, '.php') && ! str_starts_with($rel, 'tests/')) {
|
||||||
|
// Source PHP file unknown to the graph — might be a new file
|
||||||
|
// that only exists on this branch (graph inherited from main).
|
||||||
|
// Track its directory for the sibling heuristic (step 3).
|
||||||
|
$unknownSourceDirs[dirname($rel)] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -131,15 +142,6 @@ final class Graph
|
|||||||
// 2. Watch-pattern lookup (non-PHP assets → test directories).
|
// 2. Watch-pattern lookup (non-PHP assets → test directories).
|
||||||
/** @var WatchPatterns $watchPatterns */
|
/** @var WatchPatterns $watchPatterns */
|
||||||
$watchPatterns = Container::getInstance()->get(WatchPatterns::class);
|
$watchPatterns = Container::getInstance()->get(WatchPatterns::class);
|
||||||
$normalised = [];
|
|
||||||
|
|
||||||
foreach ($changedFiles as $file) {
|
|
||||||
$rel = $this->relative($file);
|
|
||||||
|
|
||||||
if ($rel !== null) {
|
|
||||||
$normalised[] = $rel;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$dirs = $watchPatterns->matchedDirectories($this->projectRoot, $normalised);
|
$dirs = $watchPatterns->matchedDirectories($this->projectRoot, $normalised);
|
||||||
$allTestFiles = array_keys($this->edges);
|
$allTestFiles = array_keys($this->edges);
|
||||||
@ -148,6 +150,43 @@ final class Graph
|
|||||||
$affectedSet[$testFile] = true;
|
$affectedSet[$testFile] = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3. Sibling heuristic for unknown source files.
|
||||||
|
//
|
||||||
|
// When a PHP source file is unknown to the graph (no test depends on
|
||||||
|
// it), it is either genuinely untested OR it was added on a branch
|
||||||
|
// whose graph was inherited from another branch (e.g. main). In the
|
||||||
|
// latter case the graph simply never saw the file.
|
||||||
|
//
|
||||||
|
// To avoid silent misses: find tests that already cover ANY file in
|
||||||
|
// the same directory. If `app/Models/OrderItem.php` is unknown but
|
||||||
|
// `app/Models/Order.php` is covered by `OrderTest`, run `OrderTest`
|
||||||
|
// — it likely exercises sibling files in the same module.
|
||||||
|
//
|
||||||
|
// This over-runs slightly (sibling may be unrelated) but never
|
||||||
|
// under-runs. And once the test executes, its coverage captures the
|
||||||
|
// new file → graph self-heals for next run.
|
||||||
|
if ($unknownSourceDirs !== []) {
|
||||||
|
foreach ($this->edges as $testFile => $ids) {
|
||||||
|
if (isset($affectedSet[$testFile])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($ids as $id) {
|
||||||
|
if (! isset($this->files[$id])) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$depDir = dirname($this->files[$id]);
|
||||||
|
|
||||||
|
if (isset($unknownSourceDirs[$depDir])) {
|
||||||
|
$affectedSet[$testFile] = true;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return array_keys($affectedSet);
|
return array_keys($affectedSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user