Chris@17
|
1 <?php
|
Chris@17
|
2 /**
|
Chris@17
|
3 * A test class for testing all sniffs for installed standards.
|
Chris@17
|
4 *
|
Chris@17
|
5 * @author Greg Sherwood <gsherwood@squiz.net>
|
Chris@17
|
6 * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
|
Chris@17
|
7 * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
|
Chris@17
|
8 */
|
Chris@17
|
9
|
Chris@17
|
10 namespace PHP_CodeSniffer\Tests\Standards;
|
Chris@17
|
11
|
Chris@17
|
12 use PHP_CodeSniffer\Util\Standards;
|
Chris@17
|
13 use PHP_CodeSniffer\Autoload;
|
Chris@17
|
14 use PHPUnit\TextUI\TestRunner;
|
Chris@17
|
15 use PHPUnit\Framework\TestSuite;
|
Chris@17
|
16
|
Chris@17
|
17 class AllSniffs
|
Chris@17
|
18 {
|
Chris@17
|
19
|
Chris@17
|
20
|
Chris@17
|
21 /**
|
Chris@17
|
22 * Prepare the test runner.
|
Chris@17
|
23 *
|
Chris@17
|
24 * @return void
|
Chris@17
|
25 */
|
Chris@17
|
26 public static function main()
|
Chris@17
|
27 {
|
Chris@17
|
28 TestRunner::run(self::suite());
|
Chris@17
|
29
|
Chris@17
|
30 }//end main()
|
Chris@17
|
31
|
Chris@17
|
32
|
Chris@17
|
33 /**
|
Chris@17
|
34 * Add all sniff unit tests into a test suite.
|
Chris@17
|
35 *
|
Chris@17
|
36 * Sniff unit tests are found by recursing through the 'Tests' directory
|
Chris@17
|
37 * of each installed coding standard.
|
Chris@17
|
38 *
|
Chris@17
|
39 * @return \PHPUnit\Framework\TestSuite
|
Chris@17
|
40 */
|
Chris@17
|
41 public static function suite()
|
Chris@17
|
42 {
|
Chris@17
|
43 $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'] = [];
|
Chris@17
|
44 $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'] = [];
|
Chris@17
|
45 $GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES'] = [];
|
Chris@17
|
46
|
Chris@17
|
47 $suite = new TestSuite('PHP CodeSniffer Standards');
|
Chris@17
|
48
|
Chris@17
|
49 $isInstalled = !is_file(__DIR__.'/../../autoload.php');
|
Chris@17
|
50
|
Chris@17
|
51 // Optionally allow for ignoring the tests for one or more standards.
|
Chris@17
|
52 $ignoreTestsForStandards = getenv('PHPCS_IGNORE_TESTS');
|
Chris@17
|
53 if ($ignoreTestsForStandards === false) {
|
Chris@17
|
54 $ignoreTestsForStandards = [];
|
Chris@17
|
55 } else {
|
Chris@17
|
56 $ignoreTestsForStandards = explode(',', $ignoreTestsForStandards);
|
Chris@17
|
57 }
|
Chris@17
|
58
|
Chris@17
|
59 $installedStandards = self::getInstalledStandardDetails();
|
Chris@17
|
60
|
Chris@17
|
61 foreach ($installedStandards as $standard => $details) {
|
Chris@17
|
62 Autoload::addSearchPath($details['path'], $details['namespace']);
|
Chris@17
|
63
|
Chris@17
|
64 // If the test is running PEAR installed, the built-in standards
|
Chris@17
|
65 // are split into different directories; one for the sniffs and
|
Chris@17
|
66 // a different file system location for tests.
|
Chris@17
|
67 if ($isInstalled === true && is_dir(dirname($details['path']).DIRECTORY_SEPARATOR.'Generic') === true) {
|
Chris@17
|
68 $testPath = realpath(__DIR__.'/../../src/Standards/'.$standard);
|
Chris@17
|
69 } else {
|
Chris@17
|
70 $testPath = $details['path'];
|
Chris@17
|
71 }
|
Chris@17
|
72
|
Chris@18
|
73 if (in_array($standard, $ignoreTestsForStandards, true) === true) {
|
Chris@17
|
74 continue;
|
Chris@17
|
75 }
|
Chris@17
|
76
|
Chris@17
|
77 $testsDir = $testPath.DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR;
|
Chris@17
|
78 if (is_dir($testsDir) === false) {
|
Chris@17
|
79 // No tests for this standard.
|
Chris@17
|
80 continue;
|
Chris@17
|
81 }
|
Chris@17
|
82
|
Chris@17
|
83 $di = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($testsDir));
|
Chris@17
|
84
|
Chris@17
|
85 foreach ($di as $file) {
|
Chris@17
|
86 // Skip hidden files.
|
Chris@17
|
87 if (substr($file->getFilename(), 0, 1) === '.') {
|
Chris@17
|
88 continue;
|
Chris@17
|
89 }
|
Chris@17
|
90
|
Chris@17
|
91 // Tests must have the extension 'php'.
|
Chris@17
|
92 $parts = explode('.', $file);
|
Chris@17
|
93 $ext = array_pop($parts);
|
Chris@17
|
94 if ($ext !== 'php') {
|
Chris@17
|
95 continue;
|
Chris@17
|
96 }
|
Chris@17
|
97
|
Chris@17
|
98 $className = Autoload::loadFile($file->getPathname());
|
Chris@17
|
99 $GLOBALS['PHP_CODESNIFFER_STANDARD_DIRS'][$className] = $details['path'];
|
Chris@17
|
100 $GLOBALS['PHP_CODESNIFFER_TEST_DIRS'][$className] = $testsDir;
|
Chris@17
|
101 $suite->addTestSuite($className);
|
Chris@17
|
102 }
|
Chris@17
|
103 }//end foreach
|
Chris@17
|
104
|
Chris@17
|
105 return $suite;
|
Chris@17
|
106
|
Chris@17
|
107 }//end suite()
|
Chris@17
|
108
|
Chris@17
|
109
|
Chris@17
|
110 /**
|
Chris@17
|
111 * Get the details of all coding standards installed.
|
Chris@17
|
112 *
|
Chris@17
|
113 * @return array
|
Chris@17
|
114 * @see Standards::getInstalledStandardDetails()
|
Chris@17
|
115 */
|
Chris@17
|
116 protected static function getInstalledStandardDetails()
|
Chris@17
|
117 {
|
Chris@17
|
118 return Standards::getInstalledStandardDetails(true);
|
Chris@17
|
119
|
Chris@17
|
120 }//end getInstalledStandardDetails()
|
Chris@17
|
121
|
Chris@17
|
122
|
Chris@17
|
123 }//end class
|