packages/deriver/tests/Unit/Deriver/Evaluator/Memory/PropertyHooksTest.php

1<?php
2
3declare(strict_types=1);
4
5namespace Tests\Unit\Deriver\Evaluator\Memory;
6
7use PHPUnit\Framework\Attributes\CoversNothing;
8use PHPUnit\Framework\TestCase;
9
10#[CoversNothing]
11final class PropertyHooksTest extends TestCase
12{
13    public function testResolveUsesAnInheritedGetter(): void
14    {
15        $source = new \Deriver\Deriver\Sources\Source('subject.php', '<?php class Base { public int $value { get => 17; } } class Child extends Base {} function subject() { return (new Child())->value; }');
16        $tree = (new \Deriver\Deriver\Resolver\Resolver())->resolve((new \Deriver\Deriver\Parser\Parser(new \Deriver\Deriver\Parser\ParserConfig('8.4')))->parse($source));
17        $index = new \Deriver\Deriver\Evaluator\Index\DefinitionIndex(new \Deriver\Deriver\Lowerer\Declaration\Index('test', [$tree]));
18        $profile = new \Deriver\Deriver\Evaluator\TargetProfile('8.4');
19        $engine = new \Deriver\Deriver\Evaluator\Evaluator(new \Deriver\Deriver\Evaluator\Scope\Context($index, new \Deriver\Deriver\Evaluator\EvaluatorConfig($profile), new \Deriver\Deriver\Evaluator\Call\Evaluators($profile), new \Deriver\Deriver\Evaluator\Request\Budget()));
20        $graph = $index->graph('subject');
21        self::assertNotNull($graph);
22        $value = $engine->returns(new \Deriver\Deriver\Evaluator\Scope\Frame($graph, 'subject'), 64);
23        $alternatives = iterator_to_array((new \Deriver\Deriver\Evaluator\Enumeration\Choices())->alternatives($value), false);
24        self::assertCount(1, $alternatives);
25        self::assertSame(17, $alternatives[0][0]->native());
26    }
27
28    public function testReadUsesTheBackingSlotInsideItsOwnGetter(): void
29    {
30        $source = new \Deriver\Deriver\Sources\Source('subject.php', '<?php class Box { public int $value = 8 { get => $this->value * 2; } } function subject() { return (new Box())->value; }');
31        $tree = (new \Deriver\Deriver\Resolver\Resolver())->resolve((new \Deriver\Deriver\Parser\Parser(new \Deriver\Deriver\Parser\ParserConfig('8.4')))->parse($source));
32        $index = new \Deriver\Deriver\Evaluator\Index\DefinitionIndex(new \Deriver\Deriver\Lowerer\Declaration\Index('test', [$tree]));
33        $profile = new \Deriver\Deriver\Evaluator\TargetProfile('8.4');
34        $engine = new \Deriver\Deriver\Evaluator\Evaluator(new \Deriver\Deriver\Evaluator\Scope\Context($index, new \Deriver\Deriver\Evaluator\EvaluatorConfig($profile), new \Deriver\Deriver\Evaluator\Call\Evaluators($profile), new \Deriver\Deriver\Evaluator\Request\Budget()));
35        $graph = $index->graph('subject');
36        self::assertNotNull($graph);
37        $value = $engine->returns(new \Deriver\Deriver\Evaluator\Scope\Frame($graph, 'subject'), 64);
38        $alternatives = iterator_to_array((new \Deriver\Deriver\Evaluator\Enumeration\Choices())->alternatives($value), false);
39        self::assertCount(1, $alternatives);
40        self::assertSame(16, $alternatives[0][0]->native());
41    }
42
43    public function testWritePassesTheAssignedValueToTheSetter(): void
44    {
45        $source = new \Deriver\Deriver\Sources\Source('subject.php', '<?php class Box { public int $value = 1 { set { $this->value = $value * 2; } } } function subject() { $box = new Box(); $box->value = 8; return $box->value; }');
46        $tree = (new \Deriver\Deriver\Resolver\Resolver())->resolve((new \Deriver\Deriver\Parser\Parser(new \Deriver\Deriver\Parser\ParserConfig('8.4')))->parse($source));
47        $index = new \Deriver\Deriver\Evaluator\Index\DefinitionIndex(new \Deriver\Deriver\Lowerer\Declaration\Index('test', [$tree]));
48        $profile = new \Deriver\Deriver\Evaluator\TargetProfile('8.4');
49        $engine = new \Deriver\Deriver\Evaluator\Evaluator(new \Deriver\Deriver\Evaluator\Scope\Context($index, new \Deriver\Deriver\Evaluator\EvaluatorConfig($profile), new \Deriver\Deriver\Evaluator\Call\Evaluators($profile), new \Deriver\Deriver\Evaluator\Request\Budget()));
50        $graph = $index->graph('subject');
51        self::assertNotNull($graph);
52        $value = $engine->returns(new \Deriver\Deriver\Evaluator\Scope\Frame($graph, 'subject'), 64);
53        $alternatives = iterator_to_array((new \Deriver\Deriver\Evaluator\Enumeration\Choices())->alternatives($value), false);
54        self::assertCount(1, $alternatives);
55        self::assertSame(16, $alternatives[0][0]->native());
56    }
57}
58