/** * Tests the extending classes Sniff class. * * @return void * @throws PHPUnit_Framework_Error */ protected final function runTest() { // Skip this test if we can't run in this environment. if ($this->shouldSkipTest() === true) { $this->markTestSkipped(); } // The basis for determining file locations. $basename = substr(get_class($this), 0, -8); // The name of the coding standard we are testing. $standardName = substr($basename, 0, strpos($basename, '_')); // The class name of the sniff we are testing. $sniffClass = str_replace('_Tests_', '_Sniffs_', $basename) . 'Sniff'; if (is_file(dirname(__FILE__) . '/../../CodeSniffer.php') === true) { // We have not been installed. $standardsDir = realpath(dirname(__FILE__) . '/../../CodeSniffer/Standards'); $testFileBase = $standardsDir . '/' . str_replace('_', '/', $basename) . 'UnitTest.'; } else { // The name of the dummy file we are testing. $testFileBase = dirname(__FILE__) . '/' . str_replace('_', '/', $basename) . 'UnitTest.'; } // Get a list of all test files to check. These will have the same base // name but different extensions. We ignore the .php file as it is the // class. $testFiles = array(); $dir = substr($testFileBase, 0, strrpos($testFileBase, '/')); $di = new DirectoryIterator($dir); foreach ($di as $file) { $path = $file->getPathname(); if (substr($path, 0, strlen($testFileBase)) === $testFileBase) { if ($path !== $testFileBase . 'php') { $testFiles[] = $path; } } } // Get them in order. This is particularly important for multi-file sniffs. sort($testFiles); $failureMessages = array(); $multiFileSniff = false; foreach ($testFiles as $testFile) { try { self::$phpcs->process($testFile, $standardName, array($sniffClass)); } catch (Exception $e) { $this->fail('An unexpected exception has been caught: ' . $e->getMessage()); } // After processing a file, check if the sniff was actually // a multi-file sniff (i.e., had no indivdual file sniffs). // If it is, we can skip checking of the other files and // do a single multi-file check. $sniffs = self::$phpcs->getTokenSniffs(); if (empty($sniffs['file']) === true) { $multiFileSniff = true; break; } $files = self::$phpcs->getFiles(); $file = array_pop($files); $failures = $this->generateFailureMessages($file, $testFile); $failureMessages = array_merge($failureMessages, $failures); } //end foreach if ($multiFileSniff === true) { try { self::$phpcs->process($testFiles, $standardName, array($sniffClass)); } catch (Exception $e) { $this->fail('An unexpected exception has been caught: ' . $e->getMessage()); } $files = self::$phpcs->getFiles(); foreach ($files as $file) { $failures = $this->generateFailureMessages($file); $failureMessages = array_merge($failureMessages, $failures); } } if (empty($failureMessages) === false) { $this->fail(implode(PHP_EOL, $failureMessages)); } }
/** * Rebuilds the list of listeners to ensure their state is cleared. * * @return void */ public function refreshTokenListeners() { $this->phpcs->populateTokenListeners(); $this->_listeners = $this->phpcs->getTokenSniffs(); }
/** * @see sfTask */ protected function execute($arguments = array(), $options = array()) { // Call realpath() before constructing PHP_CodeSniffer because the // constructor changes our current working directory. An argument handler // which sanitized user input would be nice: // http://trac.symfony-project.com/ticket/3486 $arguments['path'] = realpath($arguments['path']); $phpcs = new PHP_CodeSniffer(); $finder = new SvnFinder(); foreach ($finder->in($arguments['path']) as $path) { $config = $this->getConfigForPath($path); if (!isset($config['code']['standard']) && !isset($config['preamble']) && !isset($config['props'])) { continue; } // HACK: It is not easy to modify a file's token listeners after it is // constructed, so construct a populated file if the code standard is // defined, and an empty file otherwise if (isset($config['code']['standard'])) { // HACK: PHP_CodeSniffer_File now expects an array of // PHP_CodeSniffer_Sniff instances, which // PHP_CodeSniffer::getTokenListeners() does not return $processPhpcs = new PHP_CodeSniffer(); $processPhpcs->process(array(), $config['code']['standard']); $listeners = $processPhpcs->getTokenSniffs(); $phpcsFile = new PHP_CodeSniffer_File($path, $listeners['file'], $phpcs->allowedFileExtensions); $phpcsFile->start(); } else { $phpcsFile = new PHP_CodeSniffer_File($path, array(), $phpcs->allowedFileExtensions); } if (isset($config['preamble'])) { } if (isset($config['props'])) { $props = $this->getPropsFromPath($path); foreach ($props + $config['props'] as $key => $value) { if (isset($props[$key]) && !isset($config['props'][$key])) { $phpcsFile->addError('SVN property "' . $key . '" = "' . $props[$key] . '" found but not expected', 0); continue; } if (!isset($props[$key]) && isset($config['props'][$key])) { $phpcsFile->addError('SVN property "' . $key . '" = "' . $config['props'][$key] . '" expected but not found', 0); continue; } if ($props[$key] != $config['props'][$key]) { $phpcsFile->addError('SVN property "' . $key . '" = "' . $props[$key] . '" expected to match "' . $config['props'][$key] . '"', 0); } } } $phpcs->addFile($phpcsFile); } $phpcs->printErrorReport(); }