packages/deriver/tests/Unit/Deriver/Lowerer/Control/ScopeKindTest.php
1<?php
2
3declare (strict_types=1);
4
5namespace Tests\Unit\Deriver\Lowerer\Control;
6
7use Deriver\Deriver\Evaluator\TargetProfile;
8use Deriver\Deriver\Lowerer\Control\GotoLowering;
9use Deriver\Deriver\Lowerer\Control\ScopeKind;
10use Deriver\Deriver\Lowerer\Declaration\Index;
11use Deriver\Deriver\Lowerer\LoweringScope;
12use Deriver\Deriver\Parser\Node\File;
13use Deriver\Deriver\Parser\Parser;
14use Deriver\Deriver\Parser\ParserConfig;
15use Deriver\Deriver\Resolver\Resolver;
16use Deriver\Deriver\Sources\Path;
17use Deriver\Deriver\Sources\Source;
18use Deriver\Deriver\Sources\Sources;
19use PHPUnit\Framework\Attributes\CoversNothing;
20use PHPUnit\Framework\TestCase;
21
22#[CoversNothing]
23final class ScopeKindTest extends TestCase
24{
25 public function testJumpsCanLeaveATryBodyButCannotSkipAFinallyBody(): void
26 {
27 $source = '<?php function target(){return 1;}';
28 $snapshotId = 'test';
29 $input = new Sources([new Source('fixture.php', $source)]);
30 $profile = new TargetProfile();
31 $parser = new Parser(new ParserConfig($profile->version));
32 $trees = array_map(static fn (Source $source1): File => (new Resolver())->resolve($parser->parse(new Source(Path::normalize($source1->path), $source1->contents, $source1->declarationsOnly))), iterator_to_array($input, false));
33 $index = new Index($snapshotId, $trees);
34 $goto = new GotoLowering(new LoweringScope($index->builder('fixture.php'), $index, 'target'));
35 $try = ['key' => 'region:try', 'kind' => ScopeKind::Try, 'iterator' => '', 'depth' => 0];
36 $finally = ['key' => 'region:finally', 'kind' => ScopeKind::Finally, 'iterator' => '', 'depth' => 0];
37 self::assertSame([$try], $goto->exited([$try], []));
38 self::assertNull($goto->exited([$finally], []));
39 }
40}
41