packages/deriver/tests/Unit/Deriver/Evaluator/Invocation/Path/ReachabilityTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Deriver\Evaluator\Invocation\Path;
6
7use Deriver\Deriver\Evaluator\Call\Evaluators;
8use Deriver\Deriver\Evaluator\Evaluator;
9use Deriver\Deriver\Evaluator\EvaluatorConfig;
10use Deriver\Deriver\Evaluator\Index\DefinitionIndex;
11use Deriver\Deriver\Evaluator\Invocation\Path\Callers;
12use Deriver\Deriver\Evaluator\Invocation\Path\Reachability;
13use Deriver\Deriver\Evaluator\Request\Budget;
14use Deriver\Deriver\Evaluator\Request\CallPath;
15use Deriver\Deriver\Evaluator\Scope\Context;
16use Deriver\Deriver\Lowerer\Declaration\Index;
17use Deriver\Deriver\Parser\Parser;
18use Deriver\Deriver\Parser\ParserConfig;
19use Deriver\Deriver\Resolver\Resolver;
20use Deriver\Deriver\Sources\Source;
21use PHPUnit\Framework\Attributes\CoversNothing;
22use PHPUnit\Framework\TestCase;
23
24#[CoversNothing]
25final class ReachabilityTest extends TestCase
26{
27 public function testAllowsRejectsOnlyUnreachableStructuralCycles(): void
28 {
29 $source = 'function foo($x){return $x;}function recur($x){recur($x+1);foo($x);}function bar(){recur(1);}function entry(){return 7;}';
30 $tree = (new Resolver())->resolve((new Parser(new ParserConfig('8.3')))->parse(new Source('fixture.php', '<?php ' . $source)));
31 $index = new DefinitionIndex(new Index('fixture', [$tree]));
32 $settings = new EvaluatorConfig();
33 $engine = new Evaluator(new Context($index, $settings, new Evaluators($settings->target), new Budget()));
34 $graph = $index->graph('foo');
35 self::assertNotNull($graph);
36 $callers = new Callers($index);
37 self::assertFalse((new Reachability($callers, new CallPath(['entry','...']), $engine->context))->allows($graph, 1));
38 self::assertTrue((new Reachability($callers, new CallPath(['bar','...']), $engine->context))->allows($graph, 1));
39 }
40
41}
42