* @copyright 2018-2019 Juliette Reinders Folmer. All rights reserved. * @license https://github.com/squizlabs/PHP_CodeSniffer/blob/master/licence.txt BSD Licence */ namespace PHP_CodeSniffer\Tests\Core; use PHP_CodeSniffer\Config; use PHP_CodeSniffer\Ruleset; use PHP_CodeSniffer\Files\DummyFile; use PHPUnit\Framework\TestCase; abstract class AbstractMethodUnitTest extends TestCase { /** * The file extension of the test case file (without leading dot). * * This allows child classes to overrule the default `inc` with, for instance, * `js` or `css` when applicable. * * @var string */ protected static $fileExtension = 'inc'; /** * The \PHP_CodeSniffer\Files\File object containing the parsed contents of the test case file. * * @var \PHP_CodeSniffer\Files\File */ protected static $phpcsFile; /** * Initialize & tokenize \PHP_CodeSniffer\Files\File with code from the test case file. * * The test case file for a unit test class has to be in the same directory * directory and use the same file name as the test class, using the .inc extension. * * @return void */ public static function setUpBeforeClass() { $config = new Config(); $config->standards = ['PSR1']; $ruleset = new Ruleset($config); // Default to a file with the same name as the test class. Extension is property based. $relativeCN = str_replace(__NAMESPACE__, '', get_called_class()); $relativePath = str_replace('\\', DIRECTORY_SEPARATOR, $relativeCN); $pathToTestFile = realpath(__DIR__).$relativePath.'.'.static::$fileExtension; // Make sure the file gets parsed correctly based on the file type. $contents = 'phpcs_input_file: '.$pathToTestFile.PHP_EOL; $contents .= file_get_contents($pathToTestFile); self::$phpcsFile = new DummyFile($contents, $ruleset, $config); self::$phpcsFile->process(); }//end setUpBeforeClass() /** * Clean up after finished test. * * @return void */ public static function tearDownAfterClass() { self::$phpcsFile = null; }//end tearDownAfterClass() /** * Get the token pointer for a target token based on a specific comment found on the line before. * * Note: the test delimiter comment MUST start with "/* test" to allow this function to * distinguish between comments used *in* a test and test delimiters. * * @param string $commentString The delimiter comment to look for. * @param int|string|array $tokenType The type of token(s) to look for. * @param string $tokenContent Optional. The token content for the target token. * * @return int */ public function getTargetToken($commentString, $tokenType, $tokenContent=null) { $start = (self::$phpcsFile->numTokens - 1); $comment = self::$phpcsFile->findPrevious( T_COMMENT, $start, null, false, $commentString ); $tokens = self::$phpcsFile->getTokens(); $end = ($start + 1); // Limit the token finding to between this and the next delimiter comment. for ($i = ($comment + 1); $i < $end; $i++) { if ($tokens[$i]['code'] !== T_COMMENT) { continue; } if (stripos($tokens[$i]['content'], '/* test') === 0) { $end = $i; break; } } $target = self::$phpcsFile->findNext( $tokenType, ($comment + 1), $end, false, $tokenContent ); if ($target === false) { $msg = 'Failed to find test target token for comment string: '.$commentString; if ($tokenContent !== null) { $msg .= ' With token content: '.$tokenContent; } $this->assertFalse(true, $msg); } return $target; }//end getTargetToken() }//end class