Skip to content

Commit 9c2438f

Browse files
committed
Fix ClassReflectionTest
1 parent 38b3bd9 commit 9c2438f

File tree

2 files changed

+353
-339
lines changed

2 files changed

+353
-339
lines changed
Lines changed: 353 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,353 @@
1+
<?php declare(strict_types = 1);
2+
3+
namespace PHPStan\Reflection;
4+
5+
use PHPStan\Testing\PHPStanTestCase;
6+
use PHPStan\Type\Generic\GenericObjectType;
7+
use PHPStan\Type\IntegerType;
8+
use PHPStan\Type\VerbosityLevel;
9+
use const PHP_VERSION_ID;
10+
11+
class ClassReflectionPropertyHooksTest extends PHPStanTestCase
12+
{
13+
protected function setUp(): void
14+
{
15+
if (PHP_VERSION_ID < 80400) {
16+
self::markTestSkipped('Test requires PHP 8.4');
17+
}
18+
}
19+
20+
public static function dataPropertyHooks(): iterable
21+
{
22+
$reflectionProvider = self::createReflectionProvider();
23+
24+
yield [
25+
$reflectionProvider->getClass('PropertyHooksTypes\\Foo'),
26+
'i',
27+
'set',
28+
['int'],
29+
'void',
30+
true,
31+
];
32+
33+
yield [
34+
$reflectionProvider->getClass('PropertyHooksTypes\\Foo'),
35+
'i',
36+
'get',
37+
[],
38+
'int',
39+
true,
40+
];
41+
42+
yield [
43+
$reflectionProvider->getClass('PropertyHooksTypes\\Foo'),
44+
'l',
45+
'get',
46+
[],
47+
'array<string>',
48+
true,
49+
];
50+
51+
yield [
52+
$reflectionProvider->getClass('PropertyHooksTypes\\Foo'),
53+
'n',
54+
'set',
55+
['array<string>|int'],
56+
'void',
57+
true,
58+
];
59+
60+
yield [
61+
$reflectionProvider->getClass('PropertyHooksTypes\\FooShort'),
62+
'i',
63+
'set',
64+
['int'],
65+
'void',
66+
false,
67+
];
68+
69+
yield [
70+
$reflectionProvider->getClass('PropertyHooksTypes\\FooShort'),
71+
'k',
72+
'set',
73+
['int|string'],
74+
'void',
75+
false,
76+
];
77+
78+
yield [
79+
$reflectionProvider->getClass('PropertyHooksTypes\\FooShort'),
80+
'l',
81+
'set',
82+
['array<string>'],
83+
'void',
84+
false,
85+
];
86+
87+
yield [
88+
$reflectionProvider->getClass('PropertyHooksTypes\\FooShort'),
89+
'm',
90+
'set',
91+
['array<string>'],
92+
'void',
93+
false,
94+
];
95+
96+
yield [
97+
$reflectionProvider->getClass('PropertyHooksTypes\\FooShort'),
98+
'n',
99+
'set',
100+
['array<string>|int'],
101+
'void',
102+
false,
103+
];
104+
105+
yield [
106+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructor'),
107+
'i',
108+
'set',
109+
['int'],
110+
'void',
111+
true,
112+
];
113+
114+
yield [
115+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructor'),
116+
'j',
117+
'set',
118+
['int'],
119+
'void',
120+
true,
121+
];
122+
123+
yield [
124+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructor'),
125+
'k',
126+
'set',
127+
['int|string'],
128+
'void',
129+
true,
130+
];
131+
132+
yield [
133+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructor'),
134+
'l',
135+
'set',
136+
['array<string>'],
137+
'void',
138+
true,
139+
];
140+
141+
yield [
142+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructor'),
143+
'l',
144+
'get',
145+
[],
146+
'array<string>',
147+
true,
148+
];
149+
150+
yield [
151+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructor'),
152+
'm',
153+
'set',
154+
['array<string>'],
155+
'void',
156+
true,
157+
];
158+
159+
yield [
160+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructor'),
161+
'n',
162+
'set',
163+
['array<string>|int'],
164+
'void',
165+
true,
166+
];
167+
168+
yield [
169+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructorWithParam'),
170+
'l',
171+
'set',
172+
['array<string>'],
173+
'void',
174+
true,
175+
];
176+
177+
yield [
178+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructorWithParam'),
179+
'l',
180+
'get',
181+
[],
182+
'array<string>',
183+
true,
184+
];
185+
186+
yield [
187+
$reflectionProvider->getClass('PropertyHooksTypes\\FooConstructorWithParam'),
188+
'm',
189+
'set',
190+
['array<string>'],
191+
'void',
192+
true,
193+
];
194+
195+
yield [
196+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenerics'),
197+
'm',
198+
'set',
199+
['array<T of stdClass (class PropertyHooksTypes\FooGenerics, parameter)>'],
200+
'void',
201+
true,
202+
];
203+
204+
yield [
205+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenerics'),
206+
'n',
207+
'set',
208+
['array<T of stdClass (class PropertyHooksTypes\FooGenerics, parameter)>|int'],
209+
'void',
210+
true,
211+
];
212+
213+
yield [
214+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenerics'),
215+
'm',
216+
'get',
217+
[],
218+
'array<T of stdClass (class PropertyHooksTypes\FooGenerics, parameter)>',
219+
true,
220+
];
221+
222+
yield [
223+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenerics'),
224+
'n',
225+
'get',
226+
[],
227+
'int',
228+
true,
229+
];
230+
231+
$specificFooGenerics = (new GenericObjectType('PropertyHooksTypes\\FooGenerics', [new IntegerType()]))->getClassReflection();
232+
233+
yield [
234+
$specificFooGenerics,
235+
'n',
236+
'set',
237+
['array<int>|int'],
238+
'void',
239+
true,
240+
];
241+
242+
yield [
243+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenerics'),
244+
'n',
245+
'get',
246+
[],
247+
'int',
248+
true,
249+
];
250+
251+
yield [
252+
$specificFooGenerics,
253+
'm',
254+
'set',
255+
['array<int>'],
256+
'void',
257+
true,
258+
];
259+
260+
yield [
261+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenerics'),
262+
'm',
263+
'get',
264+
[],
265+
'array<T of stdClass (class PropertyHooksTypes\FooGenerics, parameter)>',
266+
true,
267+
];
268+
269+
yield [
270+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenericsConstructor'),
271+
'l',
272+
'set',
273+
['array<T of stdClass (class PropertyHooksTypes\FooGenericsConstructor, parameter)>'],
274+
'void',
275+
true,
276+
];
277+
278+
yield [
279+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenericsConstructor'),
280+
'm',
281+
'set',
282+
['array<T of stdClass (class PropertyHooksTypes\FooGenericsConstructor, parameter)>'],
283+
'void',
284+
true,
285+
];
286+
287+
yield [
288+
$reflectionProvider->getClass('PropertyHooksTypes\\FooGenericsConstructor'),
289+
'n',
290+
'set',
291+
['array<T of stdClass (class PropertyHooksTypes\FooGenericsConstructor, parameter)>|int'],
292+
'void',
293+
true,
294+
];
295+
296+
$specificFooGenericsConstructor = (new GenericObjectType('PropertyHooksTypes\\FooGenericsConstructor', [new IntegerType()]))->getClassReflection();
297+
298+
yield [
299+
$specificFooGenericsConstructor,
300+
'n',
301+
'set',
302+
['array<int>|int'],
303+
'void',
304+
true,
305+
];
306+
307+
yield [
308+
$specificFooGenericsConstructor,
309+
'm',
310+
'set',
311+
['array<int>'],
312+
'void',
313+
true,
314+
];
315+
316+
yield [
317+
$specificFooGenericsConstructor,
318+
'm',
319+
'get',
320+
[],
321+
'array<int>',
322+
true,
323+
];
324+
}
325+
326+
/**
327+
* @dataProvider dataPropertyHooks
328+
* @param ExtendedPropertyReflection::HOOK_* $hookName
329+
* @param string[] $parameterTypes
330+
*/
331+
public function testPropertyHooks(
332+
ClassReflection $classReflection,
333+
string $propertyName,
334+
string $hookName,
335+
array $parameterTypes,
336+
string $returnType,
337+
bool $isVirtual,
338+
): void
339+
{
340+
$propertyReflection = $classReflection->getNativeProperty($propertyName);
341+
$this->assertSame($isVirtual, $propertyReflection->isVirtual()->yes());
342+
343+
$hookReflection = $propertyReflection->getHook($hookName);
344+
$hookVariant = $hookReflection->getOnlyVariant();
345+
$this->assertSame($returnType, $hookVariant->getReturnType()->describe(VerbosityLevel::precise()));
346+
$this->assertCount(count($parameterTypes), $hookVariant->getParameters());
347+
348+
foreach ($hookVariant->getParameters() as $i => $parameter) {
349+
$this->assertSame($parameterTypes[$i], $parameter->getType()->describe(VerbosityLevel::precise()));
350+
}
351+
}
352+
353+
}

0 commit comments

Comments
 (0)