packages/deriver/tests/Unit/Deriver/Evaluator/Enumeration/Finite/DeclarationsTest.php
1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Deriver\Evaluator\Enumeration\Finite;
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\Request\Budget;
12use Deriver\Deriver\Evaluator\Scope\Context;
13use Deriver\Deriver\Lowerer\Declaration\Index;
14use Deriver\Deriver\Parser\Parser;
15use Deriver\Deriver\Parser\ParserConfig;
16use Deriver\Deriver\Resolver\Resolver;
17use Deriver\Deriver\Sources\Source;
18use PHPUnit\Framework\Attributes\CoversNothing;
19use PHPUnit\Framework\TestCase;
20
21#[CoversNothing]
22final class DeclarationsTest extends TestCase
23{
24 public function testDomainRecognizesNullableEnumsWithoutOpeningAnyBody(): void
25 {
26 $source = 'enum State{case A;case B;}function subject():?State{return State::A;}';
27 $tree = (new Resolver())->resolve((new Parser(new ParserConfig('8.3')))->parse(new Source('a.php', '<?php ' . $source)));
28 $index = new DefinitionIndex(new Index('s', [$tree]));
29 $config = new EvaluatorConfig();
30 $engine = new Evaluator(new Context($index, $config, new Evaluators($config->target), new Budget()));
31 $domain = (new \Deriver\Deriver\Evaluator\Enumeration\Finite\Declarations())->domain($engine, 'null|State');
32 self::assertNotNull($domain);
33 self::assertSame(['scalar:N;' => true, 'enum:State::A' => true, 'enum:State::B' => true], $domain->remaining);
34 self::assertSame(0, $engine->context->constructedNodes);
35 self::assertNull((new \Deriver\Deriver\Evaluator\Enumeration\Finite\Declarations())->domain($engine, 'bool|int'));
36 }
37
38 public function testMembersLeavesOpenTypesUnbounded(): void
39 {
40 $source = 'function subject(){return 1;}';
41 $tree = (new Resolver())->resolve((new Parser(new ParserConfig('8.3')))->parse(new Source('a.php', '<?php ' . $source)));
42 $index = new DefinitionIndex(new Index('s', [$tree]));
43 $config = new EvaluatorConfig();
44 $engine = new Evaluator(new Context($index, $config, new Evaluators($config->target), new Budget()));
45 $domains = new \Deriver\Deriver\Evaluator\Enumeration\Finite\Declarations();
46 self::assertSame(['b:0' => true, 'b:1' => true], $domains->members($engine, 'bool'));
47 self::assertNull($domains->members($engine, 'int'));
48 self::assertNull($domains->members($engine, 'MissingEnum'));
49 }
50}
51