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