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