Chris@4: Chris@4: * @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600) Chris@4: * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence Chris@4: */ Chris@4: Chris@4: namespace PHP_CodeSniffer\Tests\Standards; Chris@4: Chris@4: use PHP_CodeSniffer\Util\Standards; Chris@4: use PHP_CodeSniffer\Autoload; Chris@4: use PHPUnit\TextUI\TestRunner; Chris@4: use PHPUnit\Framework\TestSuite; Chris@4: Chris@4: class AllSniffs Chris@4: { Chris@4: Chris@4: Chris@4: /** Chris@4: * Prepare the test runner. Chris@4: * Chris@4: * @return void Chris@4: */ Chris@4: public static function main() Chris@4: { Chris@4: TestRunner::run(self::suite()); Chris@4: Chris@4: }//end main() Chris@4: Chris@4: Chris@4: /** Chris@4: * Add all sniff unit tests into a test suite. Chris@4: * Chris@4: * Sniff unit tests are found by recursing through the 'Tests' directory Chris@4: * of each installed coding standard. Chris@4: * Chris@4: * @return \PHPUnit\Framework\TestSuite Chris@4: */ Chris@4: public static function suite() Chris@4: { Chris@4: $GLOBALS['PHP_CODESNIFFER_SNIFF_CODES'] = []; Chris@4: $GLOBALS['PHP_CODESNIFFER_FIXABLE_CODES'] = []; Chris@4: $GLOBALS['PHP_CODESNIFFER_SNIFF_CASE_FILES'] = []; Chris@4: Chris@4: $suite = new TestSuite('PHP CodeSniffer Standards'); Chris@4: Chris@4: $isInstalled = !is_file(__DIR__.'/../../autoload.php'); Chris@4: Chris@4: // Optionally allow for ignoring the tests for one or more standards. Chris@4: $ignoreTestsForStandards = getenv('PHPCS_IGNORE_TESTS'); Chris@4: if ($ignoreTestsForStandards === false) { Chris@4: $ignoreTestsForStandards = []; Chris@4: } else { Chris@4: $ignoreTestsForStandards = explode(',', $ignoreTestsForStandards); Chris@4: } Chris@4: Chris@4: $installedStandards = self::getInstalledStandardDetails(); Chris@4: Chris@4: foreach ($installedStandards as $standard => $details) { Chris@4: Autoload::addSearchPath($details['path'], $details['namespace']); Chris@4: Chris@4: // If the test is running PEAR installed, the built-in standards Chris@4: // are split into different directories; one for the sniffs and Chris@4: // a different file system location for tests. Chris@4: if ($isInstalled === true && is_dir(dirname($details['path']).DIRECTORY_SEPARATOR.'Generic') === true) { Chris@4: $testPath = realpath(__DIR__.'/../../src/Standards/'.$standard); Chris@4: } else { Chris@4: $testPath = $details['path']; Chris@4: } Chris@4: Chris@5: if (in_array($standard, $ignoreTestsForStandards, true) === true) { Chris@4: continue; Chris@4: } Chris@4: Chris@4: $testsDir = $testPath.DIRECTORY_SEPARATOR.'Tests'.DIRECTORY_SEPARATOR; Chris@4: if (is_dir($testsDir) === false) { Chris@4: // No tests for this standard. Chris@4: continue; Chris@4: } Chris@4: Chris@4: $di = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($testsDir)); Chris@4: Chris@4: foreach ($di as $file) { Chris@4: // Skip hidden files. Chris@4: if (substr($file->getFilename(), 0, 1) === '.') { Chris@4: continue; Chris@4: } Chris@4: Chris@4: // Tests must have the extension 'php'. Chris@4: $parts = explode('.', $file); Chris@4: $ext = array_pop($parts); Chris@4: if ($ext !== 'php') { Chris@4: continue; Chris@4: } Chris@4: Chris@4: $className = Autoload::loadFile($file->getPathname()); Chris@4: $GLOBALS['PHP_CODESNIFFER_STANDARD_DIRS'][$className] = $details['path']; Chris@4: $GLOBALS['PHP_CODESNIFFER_TEST_DIRS'][$className] = $testsDir; Chris@4: $suite->addTestSuite($className); Chris@4: } Chris@4: }//end foreach Chris@4: Chris@4: return $suite; Chris@4: Chris@4: }//end suite() Chris@4: Chris@4: Chris@4: /** Chris@4: * Get the details of all coding standards installed. Chris@4: * Chris@4: * @return array Chris@4: * @see Standards::getInstalledStandardDetails() Chris@4: */ Chris@4: protected static function getInstalledStandardDetails() Chris@4: { Chris@4: return Standards::getInstalledStandardDetails(true); Chris@4: Chris@4: }//end getInstalledStandardDetails() Chris@4: Chris@4: Chris@4: }//end class