11
11
use Magento \Framework \Component \ComponentRegistrar ;
12
12
use Magento \Framework \App \Utility \Files ;
13
13
14
+ /**
15
+ * @SuppressWarnings(PHPMD.ExcessiveClassComplexity)
16
+ */
14
17
class ClassesTest extends \PHPUnit \Framework \TestCase
15
18
{
19
+ /**
20
+ * @var ComponentRegistrar
21
+ */
22
+ private $ componentRegistrar ;
23
+
16
24
/**
17
25
* List of already found classes to avoid checking them over and over again
18
26
*
19
27
* @var array
20
28
*/
21
- protected static $ _existingClasses = [];
29
+ private $ existingClasses = [];
22
30
23
- protected static $ _keywordsBlacklist = ["String " , "Array " , "Boolean " , "Element " ];
31
+ /**
32
+ * @var array
33
+ */
34
+ private static $ keywordsBlacklist = ["String " , "Array " , "Boolean " , "Element " ];
24
35
25
- protected static $ _namespaceBlacklist = null ;
36
+ /**
37
+ * @var array|null
38
+ */
39
+ private $ referenceBlackList = null ;
26
40
27
- protected static $ _referenceBlackList = null ;
41
+ /**
42
+ * Set Up
43
+ */
44
+ protected function setUp ()
45
+ {
46
+ $ this ->componentRegistrar = new ComponentRegistrar ();
47
+ }
28
48
29
49
public function testPhpFiles ()
30
50
{
@@ -69,9 +89,9 @@ function ($file) {
69
89
$ classes
70
90
);
71
91
72
- $ this ->_collectResourceHelpersPhp ($ contents , $ classes );
92
+ $ this ->collectResourceHelpersPhp ($ contents , $ classes );
73
93
74
- $ this ->_assertClassesExist ($ classes , $ file );
94
+ $ this ->assertClassesExist ($ classes , $ file );
75
95
},
76
96
Files::init ()->getPhpFiles (
77
97
Files::INCLUDE_APP_CODE
@@ -90,7 +110,7 @@ function ($file) {
90
110
* @param string $contents
91
111
* @param array &$classes
92
112
*/
93
- protected function _collectResourceHelpersPhp ($ contents , &$ classes )
113
+ private function collectResourceHelpersPhp ($ contents , &$ classes )
94
114
{
95
115
$ regex = '/(?:\:\:|\->)getResourceHelper\(\s* \'([a-z\d \\\\]+) \'\s*\)/ix ' ;
96
116
$ matches = Classes::getAllMatches ($ contents , $ regex );
@@ -108,7 +128,7 @@ public function testConfigFiles()
108
128
*/
109
129
function ($ path ) {
110
130
$ classes = Classes::collectClassesInConfig (simplexml_load_file ($ path ));
111
- $ this ->_assertClassesExist ($ classes , $ path );
131
+ $ this ->assertClassesExist ($ classes , $ path );
112
132
},
113
133
Files::init ()->getMainConfigFiles ()
114
134
);
@@ -145,7 +165,7 @@ function ($path) {
145
165
}
146
166
$ classes = array_merge ($ classes , Classes::collectLayoutClasses ($ xml ));
147
167
148
- $ this ->_assertClassesExist (array_unique ($ classes ), $ path );
168
+ $ this ->assertClassesExist (array_unique ($ classes ), $ path );
149
169
},
150
170
Files::init ()->getLayoutFiles ()
151
171
);
@@ -161,7 +181,7 @@ function ($path) {
161
181
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
162
182
* @SuppressWarnings(PHPMD.UnusedLocalVariable)
163
183
*/
164
- protected function _assertClassesExist ($ classes , $ path )
184
+ private function assertClassesExist ($ classes , $ path )
165
185
{
166
186
if (!$ classes ) {
167
187
return ;
@@ -177,7 +197,7 @@ protected function _assertClassesExist($classes, $path)
177
197
} else {
178
198
$ this ->assertTrue (
179
199
isset (
180
- self :: $ _existingClasses [$ class ]
200
+ $ this -> existingClasses [$ class ]
181
201
) || Files::init ()->classFileExists (
182
202
$ class
183
203
) || Classes::isVirtual (
@@ -187,7 +207,7 @@ protected function _assertClassesExist($classes, $path)
187
207
)
188
208
);
189
209
}
190
- self :: $ _existingClasses [$ class ] = 1 ;
210
+ $ this -> existingClasses [$ class ] = 1 ;
191
211
} catch (\PHPUnit \Framework \AssertionFailedError $ e ) {
192
212
$ badClasses [] = '\\' . $ class ;
193
213
}
@@ -230,7 +250,7 @@ function ($file) {
230
250
231
251
$ classParts = explode (' ' , $ classNameMatch [0 ]);
232
252
$ className = array_pop ($ classParts );
233
- $ this ->_assertClassNamespace ($ file , $ relativePath , $ contents , $ className );
253
+ $ this ->assertClassNamespace ($ file , $ relativePath , $ contents , $ className );
234
254
},
235
255
Files::init ()->getPhpFiles ()
236
256
);
@@ -245,7 +265,7 @@ function ($file) {
245
265
* @param string $contents
246
266
* @param string $className
247
267
*/
248
- protected function _assertClassNamespace ($ file , $ relativePath , $ contents , $ className )
268
+ private function assertClassNamespace ($ file , $ relativePath , $ contents , $ className )
249
269
{
250
270
$ namespacePattern = '/(Magento|Zend)\/[a-zA-Z]+[^\.]+/ ' ;
251
271
$ formalPattern = '/^namespace\s[a-zA-Z]+( \\\\[a-zA-Z0-9]+)*/m ' ;
@@ -349,7 +369,7 @@ function ($file) {
349
369
$ vendorClasses = array_filter ($ vendorClasses , 'strlen ' );
350
370
$ vendorClasses = $ this ->referenceBlacklistFilter ($ vendorClasses );
351
371
if (!empty ($ vendorClasses )) {
352
- $ this ->_assertClassesExist ($ vendorClasses , $ file );
372
+ $ this ->assertClassesExist ($ vendorClasses , $ file );
353
373
}
354
374
355
375
if (!empty ($ result3 ['exception ' ]) && $ result3 ['exception ' ][0 ] != "" ) {
@@ -368,7 +388,7 @@ function ($file) {
368
388
369
389
$ badClasses = $ this ->referenceBlacklistFilter ($ badClasses );
370
390
$ badClasses = $ this ->removeSpecialCases ($ badClasses , $ file , $ contents , $ namespacePath );
371
- $ this ->_assertClassReferences ($ badClasses , $ file );
391
+ $ this ->assertClassReferences ($ badClasses , $ file );
372
392
},
373
393
Files::init ()->getPhpFiles ()
374
394
);
@@ -380,7 +400,7 @@ function ($file) {
380
400
* @param $aliasClasses
381
401
* @param $badClasses
382
402
*/
383
- protected function handleAliasClasses ($ aliasClasses , $ badClasses )
403
+ private function handleAliasClasses ($ aliasClasses , $ badClasses )
384
404
{
385
405
foreach ($ aliasClasses as $ aliasClass ) {
386
406
foreach ($ badClasses as $ badClass ) {
@@ -397,24 +417,33 @@ protected function handleAliasClasses($aliasClasses, $badClasses)
397
417
* @param $classes
398
418
* @return array
399
419
*/
400
- protected function referenceBlacklistFilter ($ classes )
420
+ private function referenceBlacklistFilter ($ classes )
401
421
{
402
422
// exceptions made for the files from the blacklist
403
- self :: _setReferenceBlacklist ();
423
+ $ classes = $ this -> getReferenceBlacklist ();
404
424
foreach ($ classes as $ class ) {
405
- if (in_array ($ class , self :: $ _referenceBlackList )) {
425
+ if (in_array ($ class , $ this -> referenceBlackList )) {
406
426
unset($ classes [array_search ($ class , $ classes )]);
407
427
}
408
428
}
409
429
return $ classes ;
410
430
}
411
431
412
- protected function _setReferenceBlacklist ()
432
+ /**
433
+ * Returns array of class names from black list.
434
+ *
435
+ * @return array
436
+ */
437
+ private function getReferenceBlacklist ()
413
438
{
414
- if (!isset (self ::$ _referenceBlackList )) {
415
- $ blackList = file (__DIR__ . '/_files/blacklist/reference.txt ' , FILE_IGNORE_NEW_LINES );
416
- self ::$ _referenceBlackList = $ blackList ;
439
+ if (!isset ($ this ->referenceBlackList )) {
440
+ $ this ->referenceBlackList = file (
441
+ __DIR__ . '/_files/blacklist/reference.txt ' ,
442
+ FILE_IGNORE_NEW_LINES
443
+ );
417
444
}
445
+
446
+ return $ this ->referenceBlackList ;
418
447
}
419
448
420
449
/**
@@ -426,18 +455,21 @@ protected function _setReferenceBlacklist()
426
455
* @param string $namespacePath
427
456
* @return array
428
457
*/
429
- protected function removeSpecialCases ($ badClasses , $ file , $ contents , $ namespacePath )
458
+ private function removeSpecialCases ($ badClasses , $ file , $ contents , $ namespacePath )
430
459
{
431
460
foreach ($ badClasses as $ badClass ) {
432
461
// Remove valid usages of Magento modules from the list
433
462
// for example: 'Magento_Sales::actions_edit'
434
- if (preg_match ('/Magento_[A-Z0-9][a-z0-9]*/ ' , $ badClass )) {
435
- unset($ badClasses [array_search ($ badClass , $ badClasses )]);
436
- continue ;
463
+ if (preg_match ('/^[A-Z][a-z]+_[A-Z0-9][a-z0-9]+$/ ' , $ badClass )) {
464
+ $ moduleDir = $ this ->componentRegistrar ->getPath (ComponentRegistrar::MODULE , $ badClass );
465
+ if ($ moduleDir !== null ) {
466
+ unset($ badClasses [array_search ($ badClass , $ badClasses )]);
467
+ continue ;
468
+ }
437
469
}
438
470
439
471
// Remove usage of key words such as "Array", "String", and "Boolean"
440
- if (in_array ($ badClass , self ::$ _keywordsBlacklist )) {
472
+ if (in_array ($ badClass , self ::$ keywordsBlacklist )) {
441
473
unset($ badClasses [array_search ($ badClass , $ badClasses )]);
442
474
continue ;
443
475
}
@@ -482,12 +514,11 @@ protected function removeSpecialCases($badClasses, $file, $contents, $namespaceP
482
514
*/
483
515
private function removeSpecialCasesNonFullyQualifiedClassNames ($ namespacePath , &$ badClasses , $ badClass )
484
516
{
485
- $ componentRegistrar = new ComponentRegistrar ();
486
517
$ namespaceParts = explode ('/ ' , $ namespacePath );
487
518
$ moduleDir = null ;
488
519
if (isset ($ namespaceParts [1 ])) {
489
520
$ moduleName = array_shift ($ namespaceParts ) . '_ ' . array_shift ($ namespaceParts );
490
- $ moduleDir = $ componentRegistrar ->getPath (ComponentRegistrar::MODULE , $ moduleName );
521
+ $ moduleDir = $ this -> componentRegistrar ->getPath (ComponentRegistrar::MODULE , $ moduleName );
491
522
}
492
523
if ($ moduleDir ) {
493
524
$ fullPath = $ moduleDir . '/ ' . implode ('/ ' , $ namespaceParts ) . '/ ' .
@@ -505,7 +536,7 @@ private function removeSpecialCasesNonFullyQualifiedClassNames($namespacePath, &
505
536
unset($ badClasses [array_search ($ badClass , $ badClasses )]);
506
537
return true ;
507
538
} else {
508
- return $ this ->removeSpecialCasesForAllOthers ($ componentRegistrar , $ namespacePath , $ badClass , $ badClasses );
539
+ return $ this ->removeSpecialCasesForAllOthers ($ namespacePath , $ badClass , $ badClasses );
509
540
}
510
541
}
511
542
@@ -516,11 +547,10 @@ private function removeSpecialCasesNonFullyQualifiedClassNames($namespacePath, &
516
547
* @param string $badClass
517
548
* @return null|string
518
549
*/
519
- protected function getLibraryDirByPath ($ namespacePath , $ badClass )
550
+ private function getLibraryDirByPath ($ namespacePath , $ badClass )
520
551
{
521
552
$ libraryDir = null ;
522
553
$ fullPath = null ;
523
- $ componentRegistrar = new ComponentRegistrar ();
524
554
$ namespaceParts = explode ('/ ' , $ namespacePath );
525
555
if (isset ($ namespaceParts [1 ]) && $ namespaceParts [1 ]) {
526
556
$ vendor = array_shift ($ namespaceParts );
@@ -529,17 +559,26 @@ protected function getLibraryDirByPath($namespacePath, $badClass)
529
559
$ subLib = $ namespaceParts [0 ];
530
560
$ subLib = strtolower (preg_replace ('/(.)([A-Z])/ ' , "$1-$2 " , $ subLib ));
531
561
$ libraryName = $ vendor . '/ ' . $ lib . '- ' . $ subLib ;
532
- $ libraryDir = $ componentRegistrar ->getPath (ComponentRegistrar::LIBRARY , strtolower ($ libraryName ));
562
+ $ libraryDir = $ this ->componentRegistrar ->getPath (
563
+ ComponentRegistrar::LIBRARY ,
564
+ strtolower ($ libraryName )
565
+ );
533
566
if ($ libraryDir ) {
534
567
array_shift ($ namespaceParts );
535
568
} else {
536
569
$ libraryName = $ vendor . '/ ' . $ lib ;
537
- $ libraryDir = $ componentRegistrar ->getPath (ComponentRegistrar::LIBRARY , strtolower ($ libraryName ));
570
+ $ libraryDir = $ this ->componentRegistrar ->getPath (
571
+ ComponentRegistrar::LIBRARY ,
572
+ strtolower ($ libraryName )
573
+ );
538
574
}
539
575
} else {
540
576
$ lib = strtolower (preg_replace ('/(.)([A-Z])/ ' , "$1-$2 " , $ lib ));
541
577
$ libraryName = $ vendor . '/ ' . $ lib ;
542
- $ libraryDir = $ componentRegistrar ->getPath (ComponentRegistrar::LIBRARY , strtolower ($ libraryName ));
578
+ $ libraryDir = $ this ->componentRegistrar ->getPath (
579
+ ComponentRegistrar::LIBRARY ,
580
+ strtolower ($ libraryName )
581
+ );
543
582
}
544
583
}
545
584
if ($ libraryDir ) {
@@ -550,13 +589,12 @@ protected function getLibraryDirByPath($namespacePath, $badClass)
550
589
}
551
590
552
591
/**
553
- * @param ComponentRegistrar $componentRegistrar
554
592
* @param string $namespacePath
555
593
* @param string $badClass
556
594
* @param array $badClasses
557
595
* @return bool
558
596
*/
559
- private function removeSpecialCasesForAllOthers ($ componentRegistrar , $ namespacePath , $ badClass , &$ badClasses )
597
+ private function removeSpecialCasesForAllOthers ($ namespacePath , $ badClass , &$ badClasses )
560
598
{
561
599
// Remove usage of classes that do NOT using fully-qualified class names (possibly under same namespace)
562
600
$ directories = [
@@ -571,7 +609,7 @@ private function removeSpecialCasesForAllOthers($componentRegistrar, $namespaceP
571
609
BP . '/dev/tests/static/testsuite/ ' ,
572
610
BP . '/setup/src/ ' ,
573
611
];
574
- $ libraryPaths = $ componentRegistrar ->getPaths (ComponentRegistrar::LIBRARY );
612
+ $ libraryPaths = $ this -> componentRegistrar ->getPaths (ComponentRegistrar::LIBRARY );
575
613
$ directories = array_merge ($ directories , $ libraryPaths );
576
614
// Full list of directories where there may be namespace classes
577
615
foreach ($ directories as $ directory ) {
@@ -590,7 +628,7 @@ private function removeSpecialCasesForAllOthers($componentRegistrar, $namespaceP
590
628
* @param array $badClasses
591
629
* @param string $file
592
630
*/
593
- protected function _assertClassReferences ($ badClasses , $ file )
631
+ private function assertClassReferences ($ badClasses , $ file )
594
632
{
595
633
if (empty ($ badClasses )) {
596
634
return ;
0 commit comments