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