11
11
12
12
namespace Symfony \Bridge \PhpUnit \Tests \DeprecationErrorHandler ;
13
13
14
+ use Composer \Autoload \ClassLoader ;
14
15
use PHPUnit \Framework \TestCase ;
15
16
use Symfony \Bridge \PhpUnit \DeprecationErrorHandler ;
16
17
use Symfony \Bridge \PhpUnit \DeprecationErrorHandler \Deprecation ;
17
18
use Symfony \Bridge \PhpUnit \Legacy \SymfonyTestsListenerForV5 ;
18
19
19
20
class DeprecationTest extends TestCase
20
21
{
22
+ public static function setUpBeforeClass (): void
23
+ {
24
+ $ vendorDir = self ::getVendorDir ();
25
+
26
+ mkdir ($ vendorDir .'/myfakevendor/myfakepackage1 ' , 0777 , true );
27
+ mkdir ($ vendorDir .'/myfakevendor/myfakepackage2 ' );
28
+ touch ($ vendorDir .'/myfakevendor/myfakepackage1/MyFakeFile1.php ' );
29
+ touch ($ vendorDir .'/myfakevendor/myfakepackage1/MyFakeFile2.php ' );
30
+ touch ($ vendorDir .'/myfakevendor/myfakepackage2/MyFakeFile.php ' );
31
+ }
32
+
33
+ private static function getVendorDir (): string
34
+ {
35
+ $ reflection = new \ReflectionClass (ClassLoader::class);
36
+
37
+ return \dirname ($ reflection ->getFileName (), 2 );
38
+ }
39
+
21
40
public function testItCanDetermineTheClassWhereTheDeprecationHappened ()
22
41
{
23
42
$ deprecation = new Deprecation ('💩 ' , $ this ->debugBacktrace (), __FILE__ );
@@ -170,6 +189,62 @@ public function testIsSelf(bool $expectedIsSelf, string $message, string $traceC
170
189
$ this ->assertEquals ($ expectedIsSelf , $ deprecation ->getType () === Deprecation::TYPE_SELF );
171
190
}
172
191
192
+ public function providerIsIndirectUsesRightTrace (): array
193
+ {
194
+ $ vendorDir = self ::getVendorDir ();
195
+
196
+ return [
197
+ 'no_file_in_stack ' => [false , '' , [['function ' => 'myfunc1 ' ], ['function ' => 'myfunc2 ' ]]],
198
+ 'files_in_stack_from_various_packages ' => [
199
+ true ,
200
+ '' ,
201
+ [
202
+ ['function ' => 'myfunc1 ' , 'file ' => $ vendorDir .'/myfakevendor/myfakepackage1/MyFakeFile1.php ' ],
203
+ ['function ' => 'myfunc2 ' , 'file ' => $ vendorDir .'/myfakevendor/myfakepackage2/MyFakeFile.php ' ],
204
+ ],
205
+ ],
206
+ 'serialized_stack_files_from_same_package ' => [
207
+ false ,
208
+ serialize ([
209
+ 'deprecation ' => 'My deprecation message ' ,
210
+ 'class ' => 'MyClass ' ,
211
+ 'method ' => 'myMethod ' ,
212
+ 'files_stack ' => [
213
+ $ vendorDir .'/myfakevendor/myfakepackage1/MyFakeFile1.php ' ,
214
+ $ vendorDir .'/myfakevendor/myfakepackage1/MyFakeFile2.php ' ,
215
+ ],
216
+ ]),
217
+ [['function ' => 'myfunc1 ' ], ['class ' => SymfonyTestsListenerForV5::class, 'method ' => 'mymethod ' ]],
218
+ ],
219
+ 'serialized_stack_files_from_various_packages ' => [
220
+ true ,
221
+ serialize ([
222
+ 'deprecation ' => 'My deprecation message ' ,
223
+ 'class ' => 'MyClass ' ,
224
+ 'method ' => 'myMethod ' ,
225
+ 'files_stack ' => [
226
+ $ vendorDir .'/myfakevendor/myfakepackage1/MyFakeFile1.php ' ,
227
+ $ vendorDir .'/myfakevendor/myfakepackage2/MyFakeFile.php ' ,
228
+ ],
229
+ ]),
230
+ [['function ' => 'myfunc1 ' ], ['class ' => SymfonyTestsListenerForV5::class, 'method ' => 'mymethod ' ]],
231
+ ],
232
+ ];
233
+ }
234
+
235
+ /**
236
+ * @dataProvider providerIsIndirectUsesRightTrace
237
+ */
238
+ public function testIsIndirectUsesRightTrace (bool $ expectedIsIndirect , string $ message , array $ trace ): void
239
+ {
240
+ $ deprecation = new Deprecation (
241
+ $ message ,
242
+ $ trace ,
243
+ self ::getVendorDir ().'/myfakevendor/myfakepackage2/MyFakeFile.php '
244
+ );
245
+ $ this ->assertEquals ($ expectedIsIndirect , $ deprecation ->getType () === Deprecation::TYPE_INDIRECT );
246
+ }
247
+
173
248
/**
174
249
* This method is here to simulate the extra level from the piece of code
175
250
* triggering an error to the error handler.
@@ -178,4 +253,22 @@ public function debugBacktrace(): array
178
253
{
179
254
return debug_backtrace ();
180
255
}
256
+
257
+ private static function removeDir ($ dir ): void
258
+ {
259
+ $ files = glob ($ dir .'/* ' );
260
+ foreach ($ files as $ file ) {
261
+ if (is_file ($ file )) {
262
+ unlink ($ file );
263
+ } else {
264
+ self ::removeDir ($ file );
265
+ }
266
+ }
267
+ rmdir ($ dir );
268
+ }
269
+
270
+ public static function tearDownAfterClass (): void
271
+ {
272
+ self ::removeDir (self ::getVendorDir ().'/myfakevendor ' );
273
+ }
181
274
}
0 commit comments