1+ <?php
2+
3+ declare (strict_types=1 );
4+
5+ /**
6+ * Function with broad return type, but specific inline @var on return statement
7+ */
8+ function testInlineVarOnReturnArray (): array
9+ {
10+ /** @var list<string> */
11+ return [1 , 2 , 3 ];
12+ }
13+
14+ /**
15+ * Valid inline @var on return statement
16+ */
17+ function testValidInlineVarOnReturn (): array
18+ {
19+ /** @var list<string> */
20+ return ['apple ' , 'banana ' , 'cherry ' ];
21+ }
22+
23+ /**
24+ * Named @var tag on return statement
25+ */
26+ function testNamedInlineVarOnReturn (int $ id ): int
27+ {
28+ /** @var positive-int $id */
29+ return $ id ;
30+ }
31+
32+ /**
33+ * Inline @var array shape on return inside a closure
34+ */
35+ function testInlineVarOnReturnInClosure (): array
36+ {
37+ $ closure = function (): array {
38+ /** @var array{id: positive-int, name: non-empty-string} */
39+ return ['id ' => -10 , 'name ' => 'Alice ' ];
40+ };
41+
42+ return $ closure ();
43+ }
44+
45+ describe ('Inline @var Validation on Direct Return Statements ' , function () {
46+ test ('validates and accepts valid return expression with inline @var ' , function () {
47+ expect (testValidInlineVarOnReturn ())->toBe (['apple ' , 'banana ' , 'cherry ' ]);
48+ });
49+
50+ test ('throws TypeError when direct return expression violates unnamed inline @var contract ' , function () {
51+ expect (fn () => testInlineVarOnReturnArray ())
52+ ->toThrow (TypeError::class, 'must be of type string ' );
53+ });
54+
55+ test ('throws TypeError when direct return expression violates named inline @var contract ' , function () {
56+ expect (fn () => testNamedInlineVarOnReturn (-5 ))
57+ ->toThrow (TypeError::class, 'positive-int ' );
58+ });
59+
60+ test ('throws TypeError when closure return expression violates inline @var array shape ' , function () {
61+ expect (fn () => testInlineVarOnReturnInClosure ())
62+ ->toThrow (TypeError::class, 'positive-int ' );
63+ });
64+ });
0 commit comments