packages/deriver/tests/Unit/Deriver/Providers/EntryPointProviderTest.php

1<?php
2
3declare (strict_types=1);
4
5namespace Tests\Unit\Deriver\Providers;
6
7use Deriver\Deriver\Evaluator\Call\Provider\DispatchDecision;
8use Deriver\Deriver\Evaluator\Call\Provider\DispatchProvider;
9use Deriver\Deriver\Evaluator\Call\Provider\DispatchRequest;
10use Deriver\Deriver\Evaluator\Call\Provider\DispatchTarget;
11use Deriver\Deriver\Evaluator\Request\EntryPoint;
12use Deriver\Deriver\Evaluator\Term;
13use Deriver\Deriver\Evaluator\TermKind;
14use Deriver\Deriver\Providers\DeclarationProvider;
15use Deriver\Deriver\Providers\EntryPointProvider;
16use Deriver\Deriver\Providers\EnvironmentProvider;
17use Deriver\Deriver\Sources\Source;
18use Deriver\Deriver\Sources\Sources;
19use Override;
20use PHPUnit\Framework\Attributes\CoversClass;
21use PHPUnit\Framework\Attributes\Small;
22use PHPUnit\Framework\Attributes\UsesClass;
23use PHPUnit\Framework\TestCase;
24
25/**
26 * @covers \Deriver\Deriver\Providers\EntryPointProvider
27 */
28#[CoversClass(EntryPointProvider::class)]
29#[UsesClass(EntryPoint::class)]
30#[Small]
31final class EntryPointProviderTest extends TestCase
32{
33    public function testEntriesKeepExplicitLifecycleSymbols(): void
34    {
35        self::assertSame('entry', (new class () implements DeclarationProvider, DispatchProvider, EnvironmentProvider, EntryPointProvider {
36            /**
37             * @return string Provider identity
38             */
39            #[Override]
40            public function id(): string
41            {
42                return 'example.container';
43            }
44            /**
45             * @return string Captured export version
46             */
47            #[Override]
48            public function version(): string
49            {
50                return '1';
51            }
52            /**
53             * @return Sources Explicit generated declaration and semantics
54             */
55            #[Override]
56            public function declarations(): Sources
57            {
58                return new Sources([new Source('generated/service.php', '<?php class GeneratedService{public function label(){return "service";}}')]);
59            }
60            /**
61             * @param DispatchRequest $request Evaluated call metadata
62             * @return DispatchDecision Exported binding, with explicit completeness
63             */
64            #[Override]
65            public function resolve(DispatchRequest $request): DispatchDecision
66            {
67                if ($request->method !== 'label' || ($request->receiver->attributes['type'] ?? '') !== 'Contract') {
68                    return new DispatchDecision();
69                }
70                return new DispatchDecision([new DispatchTarget('GeneratedService::label', new Term(TermKind::Object, 'container:shared-service', attributes: ['class' => 'GeneratedService']))], true, ['container:export-complete']);
71            }
72            /**
73             * @return array<string, Term> Captured settings
74             */
75            #[Override]
76            public function environment(): array
77            {
78                return ['APP_NAME' => Term::constant('captured')];
79            }
80            /**
81             * @return list<EntryPoint> Declared lifecycle entries
82             */
83            #[Override]
84            public function entries(): array
85            {
86                return [new EntryPoint('entry')];
87            }
88        })->entries()[0]->symbol);
89    }
90}
91