1248 lines
45 KiB
PHP
1248 lines
45 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Tests for PHP_CodeSniffer error suppression tags.
|
||
|
*
|
||
|
* @author Greg Sherwood <gsherwood@squiz.net>
|
||
|
* @copyright 2006-2015 Squiz Pty Ltd (ABN 77 084 670 600)
|
||
|
* @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;
|
||
|
|
||
|
class ErrorSuppressionTest extends TestCase
|
||
|
{
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test suppressing a single error.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the code.
|
||
|
* @param string $after Annotation to place after the code.
|
||
|
* @param int $expectedErrors Optional. Number of errors expected.
|
||
|
* Defaults to 0.
|
||
|
*
|
||
|
* @dataProvider dataSuppressError
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testSuppressError($before, $after, $expectedErrors=0)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = ['Generic.PHP.LowerCaseConstant'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = '<?php '.PHP_EOL.$before.'$var = FALSE;'.PHP_EOL.$after;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedErrors, $file->getErrorCount());
|
||
|
$this->assertCount($expectedErrors, $file->getErrors());
|
||
|
|
||
|
}//end testSuppressError()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testSuppressError()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataSuppressError()
|
||
|
{
|
||
|
return [
|
||
|
'no suppression' => [
|
||
|
'before' => '',
|
||
|
'after' => '',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
|
||
|
// Inline slash comments.
|
||
|
'disable/enable: slash comment' => [
|
||
|
'before' => '// phpcs:disable'.PHP_EOL,
|
||
|
'after' => '// phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: multi-line slash comment, tab indented' => [
|
||
|
'before' => "\t".'// For reasons'.PHP_EOL."\t".'// phpcs:disable'.PHP_EOL."\t",
|
||
|
'after' => "\t".'// phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: slash comment, with @' => [
|
||
|
'before' => '// @phpcs:disable'.PHP_EOL,
|
||
|
'after' => '// @phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: slash comment, mixed case' => [
|
||
|
'before' => '// PHPCS:Disable'.PHP_EOL,
|
||
|
'after' => '// pHPcs:enabLE',
|
||
|
],
|
||
|
|
||
|
// Inline hash comments.
|
||
|
'disable/enable: hash comment' => [
|
||
|
'before' => '# phpcs:disable'.PHP_EOL,
|
||
|
'after' => '# phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: multi-line hash comment, tab indented' => [
|
||
|
'before' => "\t".'# For reasons'.PHP_EOL."\t".'# phpcs:disable'.PHP_EOL."\t",
|
||
|
'after' => "\t".'# phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: hash comment, with @' => [
|
||
|
'before' => '# @phpcs:disable'.PHP_EOL,
|
||
|
'after' => '# @phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: hash comment, mixed case' => [
|
||
|
'before' => '# PHPCS:Disable'.PHP_EOL,
|
||
|
'after' => '# pHPcs:enabLE',
|
||
|
],
|
||
|
|
||
|
// Inline star (block) comments.
|
||
|
'disable/enable: star comment' => [
|
||
|
'before' => '/* phpcs:disable */'.PHP_EOL,
|
||
|
'after' => '/* phpcs:enable */',
|
||
|
],
|
||
|
'disable/enable: multi-line star comment' => [
|
||
|
'before' => '/*'.PHP_EOL.' phpcs:disable'.PHP_EOL.' */'.PHP_EOL,
|
||
|
'after' => '/*'.PHP_EOL.' phpcs:enable'.PHP_EOL.' */',
|
||
|
],
|
||
|
'disable/enable: multi-line star comment, each line starred' => [
|
||
|
'before' => '/*'.PHP_EOL.' * phpcs:disable'.PHP_EOL.' */'.PHP_EOL,
|
||
|
'after' => '/*'.PHP_EOL.' * phpcs:enable'.PHP_EOL.' */',
|
||
|
],
|
||
|
'disable/enable: multi-line star comment, each line starred, tab indented' => [
|
||
|
'before' => "\t".'/*'.PHP_EOL."\t".' * phpcs:disable'.PHP_EOL."\t".' */'.PHP_EOL."\t",
|
||
|
'after' => "\t".'/*'.PHP_EOL.' * phpcs:enable'.PHP_EOL.' */',
|
||
|
],
|
||
|
|
||
|
// Docblock comments.
|
||
|
'disable/enable: single line docblock comment' => [
|
||
|
'before' => '/** phpcs:disable */'.PHP_EOL,
|
||
|
'after' => '/** phpcs:enable */',
|
||
|
],
|
||
|
|
||
|
// Deprecated syntax.
|
||
|
'old style: slash comment' => [
|
||
|
'before' => '// @codingStandardsIgnoreStart'.PHP_EOL,
|
||
|
'after' => '// @codingStandardsIgnoreEnd',
|
||
|
],
|
||
|
'old style: star comment' => [
|
||
|
'before' => '/* @codingStandardsIgnoreStart */'.PHP_EOL,
|
||
|
'after' => '/* @codingStandardsIgnoreEnd */',
|
||
|
],
|
||
|
'old style: multi-line star comment' => [
|
||
|
'before' => '/*'.PHP_EOL.' @codingStandardsIgnoreStart'.PHP_EOL.' */'.PHP_EOL,
|
||
|
'after' => '/*'.PHP_EOL.' @codingStandardsIgnoreEnd'.PHP_EOL.' */',
|
||
|
],
|
||
|
'old style: single line docblock comment' => [
|
||
|
'before' => '/** @codingStandardsIgnoreStart */'.PHP_EOL,
|
||
|
'after' => '/** @codingStandardsIgnoreEnd */',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataSuppressError()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test suppressing 1 out of 2 errors.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the code.
|
||
|
* @param string $between Annotation to place between the code.
|
||
|
* @param int $expectedErrors Optional. Number of errors expected.
|
||
|
* Defaults to 1.
|
||
|
*
|
||
|
* @dataProvider dataSuppressSomeErrors
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testSuppressSomeErrors($before, $between, $expectedErrors=1)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = ['Generic.PHP.LowerCaseConstant'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
$before
|
||
|
\$var = FALSE;
|
||
|
$between
|
||
|
\$var = TRUE;
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedErrors, $file->getErrorCount());
|
||
|
$this->assertCount($expectedErrors, $file->getErrors());
|
||
|
|
||
|
}//end testSuppressSomeErrors()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testSuppressSomeErrors()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataSuppressSomeErrors()
|
||
|
{
|
||
|
return [
|
||
|
'no suppression' => [
|
||
|
'before' => '',
|
||
|
'between' => '',
|
||
|
'expectedErrors' => 2,
|
||
|
],
|
||
|
|
||
|
// With suppression.
|
||
|
'disable/enable: slash comment' => [
|
||
|
'before' => '// phpcs:disable',
|
||
|
'between' => '// phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: slash comment, with @' => [
|
||
|
'before' => '// @phpcs:disable',
|
||
|
'between' => '// @phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: hash comment' => [
|
||
|
'before' => '# phpcs:disable',
|
||
|
'between' => '# phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: hash comment, with @' => [
|
||
|
'before' => '# @phpcs:disable',
|
||
|
'between' => '# @phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: single line docblock comment' => [
|
||
|
'before' => '/** phpcs:disable */',
|
||
|
'between' => '/** phpcs:enable */',
|
||
|
],
|
||
|
|
||
|
// Deprecated syntax.
|
||
|
'old style: slash comment' => [
|
||
|
'before' => '// @codingStandardsIgnoreStart',
|
||
|
'between' => '// @codingStandardsIgnoreEnd',
|
||
|
],
|
||
|
'old style: single line docblock comment' => [
|
||
|
'before' => '/** @codingStandardsIgnoreStart */',
|
||
|
'between' => '/** @codingStandardsIgnoreEnd */',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataSuppressSomeErrors()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test suppressing a single warning.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the code.
|
||
|
* @param string $after Annotation to place after the code.
|
||
|
* @param int $expectedWarnings Optional. Number of warnings expected.
|
||
|
* Defaults to 0.
|
||
|
*
|
||
|
* @dataProvider dataSuppressWarning
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testSuppressWarning($before, $after, $expectedWarnings=0)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = ['Generic.Commenting.Todo'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
$before
|
||
|
//TODO: write some code.
|
||
|
$after
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedWarnings, $file->getWarningCount());
|
||
|
$this->assertCount($expectedWarnings, $file->getWarnings());
|
||
|
|
||
|
}//end testSuppressWarning()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testSuppressWarning()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataSuppressWarning()
|
||
|
{
|
||
|
return [
|
||
|
'no suppression' => [
|
||
|
'before' => '',
|
||
|
'after' => '',
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
|
||
|
// With suppression.
|
||
|
'disable/enable: slash comment' => [
|
||
|
'before' => '// phpcs:disable',
|
||
|
'after' => '// phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: slash comment, with @' => [
|
||
|
'before' => '// @phpcs:disable',
|
||
|
'after' => '// @phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: single line docblock comment' => [
|
||
|
'before' => '/** phpcs:disable */',
|
||
|
'after' => '/** phpcs:enable */',
|
||
|
],
|
||
|
|
||
|
// Deprecated syntax.
|
||
|
'old style: slash comment' => [
|
||
|
'before' => '// @codingStandardsIgnoreStart',
|
||
|
'after' => '// @codingStandardsIgnoreEnd',
|
||
|
],
|
||
|
'old style: single line docblock comment' => [
|
||
|
'before' => '/** @codingStandardsIgnoreStart */',
|
||
|
'after' => '/** @codingStandardsIgnoreEnd */',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataSuppressWarning()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test suppressing a single error using a single line ignore.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the code.
|
||
|
* @param string $after Optional. Annotation to place after the code.
|
||
|
* Defaults to an empty string.
|
||
|
* @param int $expectedErrors Optional. Number of errors expected.
|
||
|
* Defaults to 1.
|
||
|
*
|
||
|
* @dataProvider dataSuppressLine
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testSuppressLine($before, $after='', $expectedErrors=1)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = ['Generic.PHP.LowerCaseConstant'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
$before
|
||
|
\$var = FALSE;$after
|
||
|
\$var = FALSE;
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedErrors, $file->getErrorCount());
|
||
|
$this->assertCount($expectedErrors, $file->getErrors());
|
||
|
|
||
|
}//end testSuppressLine()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testSuppressLine()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataSuppressLine()
|
||
|
{
|
||
|
return [
|
||
|
'no suppression' => [
|
||
|
'before' => '',
|
||
|
'after' => '',
|
||
|
'expectedErrors' => 2,
|
||
|
],
|
||
|
|
||
|
// With suppression on line before.
|
||
|
'ignore: line before, slash comment' => ['before' => '// phpcs:ignore'],
|
||
|
'ignore: line before, slash comment, with @' => ['before' => '// @phpcs:ignore'],
|
||
|
'ignore: line before, hash comment' => ['before' => '# phpcs:ignore'],
|
||
|
'ignore: line before, hash comment, with @' => ['before' => '# @phpcs:ignore'],
|
||
|
'ignore: line before, star comment' => ['before' => '/* phpcs:ignore */'],
|
||
|
'ignore: line before, star comment, with @' => ['before' => '/* @phpcs:ignore */'],
|
||
|
|
||
|
// With suppression as trailing comment on code line.
|
||
|
'ignore: end of line, slash comment' => [
|
||
|
'before' => '',
|
||
|
'after' => ' // phpcs:ignore',
|
||
|
],
|
||
|
'ignore: end of line, slash comment, with @' => [
|
||
|
'before' => '',
|
||
|
'after' => ' // @phpcs:ignore',
|
||
|
],
|
||
|
'ignore: end of line, hash comment' => [
|
||
|
'before' => '',
|
||
|
'after' => ' # phpcs:ignore',
|
||
|
],
|
||
|
'ignore: end of line, hash comment, with @' => [
|
||
|
'before' => '',
|
||
|
'after' => ' # @phpcs:ignore',
|
||
|
],
|
||
|
|
||
|
// Deprecated syntax.
|
||
|
'old style: line before, slash comment' => ['before' => '// @codingStandardsIgnoreLine'],
|
||
|
'old style: end of line, slash comment' => [
|
||
|
'before' => '',
|
||
|
'after' => ' // @codingStandardsIgnoreLine',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataSuppressLine()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test suppressing a single error using a single line ignore in the middle of a line.
|
||
|
*
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testSuppressLineMidLine()
|
||
|
{
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = ['Generic.PHP.LowerCaseConstant'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
|
||
|
$content = '<?php '.PHP_EOL.'$var = FALSE; /* @phpcs:ignore */ $var = FALSE;';
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame(0, $file->getErrorCount());
|
||
|
$this->assertCount(0, $file->getErrors());
|
||
|
|
||
|
}//end testSuppressLineMidLine()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test suppressing a single error using a single line ignore within a docblock.
|
||
|
*
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testSuppressLineWithinDocblock()
|
||
|
{
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = ['Generic.Files.LineLength'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
|
||
|
// Process with @ suppression on line before inside docblock.
|
||
|
$comment = str_repeat('a ', 50);
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
/**
|
||
|
* Comment here
|
||
|
* @phpcs:ignore
|
||
|
* $comment
|
||
|
*/
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame(0, $file->getErrorCount());
|
||
|
$this->assertCount(0, $file->getErrors());
|
||
|
|
||
|
}//end testSuppressLineWithinDocblock()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test that using a single line ignore does not interfere with other suppressions.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the code.
|
||
|
* @param string $after Annotation to place after the code.
|
||
|
*
|
||
|
* @dataProvider dataNestedSuppressLine
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testNestedSuppressLine($before, $after)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = ['Generic.PHP.LowerCaseConstant'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
$before
|
||
|
\$var = FALSE;
|
||
|
\$var = TRUE;
|
||
|
$after
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame(0, $file->getErrorCount());
|
||
|
$this->assertCount(0, $file->getErrors());
|
||
|
|
||
|
}//end testNestedSuppressLine()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testNestedSuppressLine()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataNestedSuppressLine()
|
||
|
{
|
||
|
return [
|
||
|
// Process with disable/enable suppression and no single line suppression.
|
||
|
'disable/enable: slash comment, no single line suppression' => [
|
||
|
'before' => '// phpcs:disable',
|
||
|
'after' => '// phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: slash comment, with @, no single line suppression' => [
|
||
|
'before' => '// @phpcs:disable',
|
||
|
'after' => '// @phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: hash comment, no single line suppression' => [
|
||
|
'before' => '# phpcs:disable',
|
||
|
'after' => '# phpcs:enable',
|
||
|
],
|
||
|
'old style: slash comment, no single line suppression' => [
|
||
|
'before' => '// @codingStandardsIgnoreStart',
|
||
|
'after' => '// @codingStandardsIgnoreEnd',
|
||
|
],
|
||
|
|
||
|
// Process with line suppression nested within disable/enable suppression.
|
||
|
'disable/enable: slash comment, next line nested single line suppression' => [
|
||
|
'before' => '// phpcs:disable'.PHP_EOL.'// phpcs:ignore',
|
||
|
'after' => '// phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: slash comment, with @, next line nested single line suppression' => [
|
||
|
'before' => '// @phpcs:disable'.PHP_EOL.'// @phpcs:ignore',
|
||
|
'after' => '// @phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: hash comment, next line nested single line suppression' => [
|
||
|
'before' => '# @phpcs:disable'.PHP_EOL.'# @phpcs:ignore',
|
||
|
'after' => '# @phpcs:enable',
|
||
|
],
|
||
|
'old style: slash comment, next line nested single line suppression' => [
|
||
|
'before' => '// @codingStandardsIgnoreStart'.PHP_EOL.'// @codingStandardsIgnoreLine',
|
||
|
'after' => '// @codingStandardsIgnoreEnd',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataNestedSuppressLine()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test suppressing a scope opener.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the scope opener.
|
||
|
* @param string $after Annotation to place after the scope opener.
|
||
|
* @param int $expectedErrors Optional. Number of errors expected.
|
||
|
* Defaults to 0.
|
||
|
*
|
||
|
* @dataProvider dataSuppressScope
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testSuppressScope($before, $after, $expectedErrors=0)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['PEAR'];
|
||
|
$config->sniffs = ['PEAR.Functions.FunctionDeclaration'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = '<?php '.PHP_EOL.$before.'$var = FALSE;'.$after.PHP_EOL.'$var = FALSE;';
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
class MyClass() {
|
||
|
$before
|
||
|
function myFunction() {
|
||
|
$after
|
||
|
\$this->foo();
|
||
|
}
|
||
|
}
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedErrors, $file->getErrorCount());
|
||
|
$this->assertCount($expectedErrors, $file->getErrors());
|
||
|
|
||
|
}//end testSuppressScope()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testSuppressScope()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataSuppressScope()
|
||
|
{
|
||
|
return [
|
||
|
'no suppression' => [
|
||
|
'before' => '',
|
||
|
'after' => '',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
|
||
|
// Process with suppression.
|
||
|
'disable/enable: slash comment' => [
|
||
|
'before' => '//phpcs:disable',
|
||
|
'after' => '//phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: slash comment, with @' => [
|
||
|
'before' => '//@phpcs:disable',
|
||
|
'after' => '//@phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: hash comment' => [
|
||
|
'before' => '#phpcs:disable',
|
||
|
'after' => '#phpcs:enable',
|
||
|
],
|
||
|
'disable/enable: single line docblock comment' => [
|
||
|
'before' => '/** phpcs:disable */',
|
||
|
'after' => '/** phpcs:enable */',
|
||
|
],
|
||
|
'disable/enable: single line docblock comment, with @' => [
|
||
|
'before' => '/** @phpcs:disable */',
|
||
|
'after' => '/** @phpcs:enable */',
|
||
|
],
|
||
|
|
||
|
// Deprecated syntax.
|
||
|
'old style: start/end, slash comment' => [
|
||
|
'before' => '//@codingStandardsIgnoreStart',
|
||
|
'after' => '//@codingStandardsIgnoreEnd',
|
||
|
],
|
||
|
'old style: start/end, single line docblock comment' => [
|
||
|
'before' => '/** @codingStandardsIgnoreStart */',
|
||
|
'after' => '/** @codingStandardsIgnoreEnd */',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataSuppressScope()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test suppressing a whole file.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the code.
|
||
|
* @param string $after Optional. Annotation to place after the code.
|
||
|
* Defaults to an empty string.
|
||
|
* @param int $expectedWarnings Optional. Number of warnings expected.
|
||
|
* Defaults to 0.
|
||
|
*
|
||
|
* @dataProvider dataSuppressFile
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testSuppressFile($before, $after='', $expectedWarnings=0)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = ['Generic.Commenting.Todo'];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
$before
|
||
|
class MyClass {}
|
||
|
\$foo = new MyClass();
|
||
|
//TODO: write some code
|
||
|
$after
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedWarnings, $file->getWarningCount());
|
||
|
$this->assertCount($expectedWarnings, $file->getWarnings());
|
||
|
|
||
|
}//end testSuppressFile()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testSuppressFile()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataSuppressFile()
|
||
|
{
|
||
|
return [
|
||
|
'no suppression' => [
|
||
|
'before' => '',
|
||
|
'after' => '',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
|
||
|
// Process with suppression.
|
||
|
'ignoreFile: start of file, slash comment' => ['before' => '// phpcs:ignoreFile'],
|
||
|
'ignoreFile: start of file, slash comment, with @' => ['before' => '// @phpcs:ignoreFile'],
|
||
|
'ignoreFile: start of file, slash comment, mixed case' => ['before' => '// PHPCS:Ignorefile'],
|
||
|
'ignoreFile: start of file, hash comment' => ['before' => '# phpcs:ignoreFile'],
|
||
|
'ignoreFile: start of file, hash comment, with @' => ['before' => '# @phpcs:ignoreFile'],
|
||
|
'ignoreFile: start of file, single-line star comment' => ['before' => '/* phpcs:ignoreFile */'],
|
||
|
'ignoreFile: start of file, multi-line star comment' => [
|
||
|
'before' => '/*'.PHP_EOL.' phpcs:ignoreFile'.PHP_EOL.' */',
|
||
|
],
|
||
|
'ignoreFile: start of file, single-line docblock comment' => ['before' => '/** phpcs:ignoreFile */'],
|
||
|
|
||
|
// Process late comment.
|
||
|
'ignoreFile: late comment, slash comment' => [
|
||
|
'before' => '',
|
||
|
'after' => '// phpcs:ignoreFile',
|
||
|
],
|
||
|
|
||
|
// Deprecated syntax.
|
||
|
'old style: start of file, slash comment' => ['before' => '// @codingStandardsIgnoreFile'],
|
||
|
'old style: start of file, single-line star comment' => ['before' => '/* @codingStandardsIgnoreFile */'],
|
||
|
'old style: start of file, multi-line star comment' => [
|
||
|
'before' => '/*'.PHP_EOL.' @codingStandardsIgnoreFile'.PHP_EOL.' */',
|
||
|
],
|
||
|
'old style: start of file, single-line docblock comment' => ['before' => '/** @codingStandardsIgnoreFile */'],
|
||
|
|
||
|
// Deprecated syntax, late comment.
|
||
|
'old style: late comment, slash comment' => [
|
||
|
'before' => '',
|
||
|
'after' => '// @codingStandardsIgnoreFile',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataSuppressFile()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test disabling specific sniffs.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the code.
|
||
|
* @param int $expectedErrors Optional. Number of errors expected.
|
||
|
* Defaults to 0.
|
||
|
* @param int $expectedWarnings Optional. Number of warnings expected.
|
||
|
* Defaults to 0.
|
||
|
*
|
||
|
* @dataProvider dataDisableSelected
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testDisableSelected($before, $expectedErrors=0, $expectedWarnings=0)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = [
|
||
|
'Generic.PHP.LowerCaseConstant',
|
||
|
'Generic.Commenting.Todo',
|
||
|
];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
$before
|
||
|
\$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedErrors, $file->getErrorCount());
|
||
|
$this->assertCount($expectedErrors, $file->getErrors());
|
||
|
|
||
|
$this->assertSame($expectedWarnings, $file->getWarningCount());
|
||
|
$this->assertCount($expectedWarnings, $file->getWarnings());
|
||
|
|
||
|
}//end testDisableSelected()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testDisableSelected()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataDisableSelected()
|
||
|
{
|
||
|
return [
|
||
|
// Single sniff.
|
||
|
'disable: single sniff' => [
|
||
|
'before' => '// phpcs:disable Generic.Commenting.Todo',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
'disable: single sniff with reason' => [
|
||
|
'before' => '# phpcs:disable Generic.Commenting.Todo -- for reasons',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
'disable: single sniff, docblock' => [
|
||
|
'before' => '/**'.PHP_EOL.' * phpcs:disable Generic.Commenting.Todo'.PHP_EOL.' */ ',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
'disable: single sniff, docblock, with @' => [
|
||
|
'before' => '/**'.PHP_EOL.' * @phpcs:disable Generic.Commenting.Todo'.PHP_EOL.' */ ',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
|
||
|
// Multiple sniffs.
|
||
|
'disable: multiple sniffs in one comment' => ['before' => '// phpcs:disable Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant'],
|
||
|
'disable: multiple sniff in multiple comments' => [
|
||
|
'before' => '// phpcs:disable Generic.Commenting.Todo'.PHP_EOL.'// phpcs:disable Generic.PHP.LowerCaseConstant',
|
||
|
],
|
||
|
|
||
|
// Selectiveness variations.
|
||
|
'disable: complete category' => [
|
||
|
'before' => '// phpcs:disable Generic.Commenting',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
'disable: whole standard' => ['before' => '// phpcs:disable Generic'],
|
||
|
'disable: single errorcode' => [
|
||
|
'before' => '# @phpcs:disable Generic.Commenting.Todo.TaskFound',
|
||
|
'expectedErrors' => 1,
|
||
|
],
|
||
|
'disable: single errorcode and a category' => ['before' => '// phpcs:disable Generic.PHP.LowerCaseConstant.Found,Generic.Commenting'],
|
||
|
|
||
|
// Wrong category/sniff/code.
|
||
|
'disable: wrong error code and category' => [
|
||
|
'before' => '/**'.PHP_EOL.' * phpcs:disable Generic.PHP.LowerCaseConstant.Upper,Generic.Comments'.PHP_EOL.' */ ',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: wrong category, docblock' => [
|
||
|
'before' => '/**'.PHP_EOL.' * phpcs:disable Generic.Files'.PHP_EOL.' */ ',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: wrong category, docblock, with @' => [
|
||
|
'before' => '/**'.PHP_EOL.' * @phpcs:disable Generic.Files'.PHP_EOL.' */ ',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataDisableSelected()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test re-enabling specific sniffs that have been disabled.
|
||
|
*
|
||
|
* @param string $code Code pattern to check.
|
||
|
* @param int $expectedErrors Number of errors expected.
|
||
|
* @param int $expectedWarnings Number of warnings expected.
|
||
|
*
|
||
|
* @dataProvider dataEnableSelected
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testEnableSelected($code, $expectedErrors, $expectedWarnings)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = [
|
||
|
'Generic.PHP.LowerCaseConstant',
|
||
|
'Generic.Commenting.Todo',
|
||
|
];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = '<?php '.$code;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedErrors, $file->getErrorCount());
|
||
|
$this->assertCount($expectedErrors, $file->getErrors());
|
||
|
|
||
|
$this->assertSame($expectedWarnings, $file->getWarningCount());
|
||
|
$this->assertCount($expectedWarnings, $file->getWarnings());
|
||
|
|
||
|
}//end testEnableSelected()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testEnableSelected()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataEnableSelected()
|
||
|
{
|
||
|
return [
|
||
|
'disable/enable: a single sniff' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic.Commenting.Todo
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting.Todo
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable/enable: multiple sniffs' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant
|
||
|
//TODO: write some code
|
||
|
$var = FALSE;',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: multiple sniffs; enable: one' => [
|
||
|
'code' => '
|
||
|
# phpcs:disable Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
# phpcs:enable Generic.Commenting.Todo
|
||
|
//TODO: write some code
|
||
|
$var = FALSE;',
|
||
|
'expectedErrors' => 0,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable/enable: complete category' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic.Commenting
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable/enable: whole standard' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 0,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: whole standard; enable: category from the standard' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 0,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: a category; enable: the whole standard containing the category' => [
|
||
|
'code' => '
|
||
|
# phpcs:disable Generic.Commenting
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
# phpcs:enable Generic
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: single sniff; enable: the category containing the sniff' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic.Commenting.Todo
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: whole standard; enable: single sniff from the standard' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting.Todo
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 0,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: whole standard; enable: single sniff from the standard; disable: that same sniff; enable: everything' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting.Todo
|
||
|
//TODO: write some code
|
||
|
// phpcs:disable Generic.Commenting.Todo
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 0,
|
||
|
'expectedWarnings' => 2,
|
||
|
],
|
||
|
'disable: whole standard; enable: single sniff from the standard; enable: other sniff from the standard' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting.Todo
|
||
|
//TODO: write some code
|
||
|
$var = FALSE;
|
||
|
// phpcs:enable Generic.PHP.LowerCaseConstant
|
||
|
//TODO: write some code
|
||
|
$var = FALSE;',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 2,
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataEnableSelected()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test ignoring specific sniffs.
|
||
|
*
|
||
|
* @param string $before Annotation to place before the code.
|
||
|
* @param int $expectedErrors Number of errors expected.
|
||
|
* @param int $expectedWarnings Number of warnings expected.
|
||
|
*
|
||
|
* @dataProvider dataIgnoreSelected
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testIgnoreSelected($before, $expectedErrors, $expectedWarnings)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = [
|
||
|
'Generic.PHP.LowerCaseConstant',
|
||
|
'Generic.Commenting.Todo',
|
||
|
];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = <<<EOD
|
||
|
<?php
|
||
|
$before
|
||
|
\$var = FALSE; //TODO: write some code
|
||
|
\$var = FALSE; //TODO: write some code
|
||
|
EOD;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedErrors, $file->getErrorCount());
|
||
|
$this->assertCount($expectedErrors, $file->getErrors());
|
||
|
|
||
|
$this->assertSame($expectedWarnings, $file->getWarningCount());
|
||
|
$this->assertCount($expectedWarnings, $file->getWarnings());
|
||
|
|
||
|
}//end testIgnoreSelected()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testIgnoreSelected()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataIgnoreSelected()
|
||
|
{
|
||
|
return [
|
||
|
'no suppression' => [
|
||
|
'before' => '',
|
||
|
'expectedErrors' => 2,
|
||
|
'expectedWarnings' => 2,
|
||
|
],
|
||
|
|
||
|
// With suppression.
|
||
|
'ignore: single sniff' => [
|
||
|
'before' => '// phpcs:ignore Generic.Commenting.Todo',
|
||
|
'expectedErrors' => 2,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'ignore: multiple sniffs' => [
|
||
|
'before' => '// phpcs:ignore Generic.Commenting.Todo,Generic.PHP.LowerCaseConstant',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: single sniff; ignore: single sniff' => [
|
||
|
'before' => '// phpcs:disable Generic.Commenting.Todo'.PHP_EOL.'// phpcs:ignore Generic.PHP.LowerCaseConstant',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 0,
|
||
|
],
|
||
|
'ignore: category of sniffs' => [
|
||
|
'before' => '# phpcs:ignore Generic.Commenting',
|
||
|
'expectedErrors' => 2,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'ignore: whole standard' => [
|
||
|
'before' => '// phpcs:ignore Generic',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataIgnoreSelected()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test ignoring specific sniffs.
|
||
|
*
|
||
|
* @param string $code Code pattern to check.
|
||
|
* @param int $expectedErrors Number of errors expected.
|
||
|
* @param int $expectedWarnings Number of warnings expected.
|
||
|
*
|
||
|
* @dataProvider dataCommenting
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\Tokenizer::createPositionMap
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testCommenting($code, $expectedErrors, $expectedWarnings)
|
||
|
{
|
||
|
static $config, $ruleset;
|
||
|
|
||
|
if (isset($config, $ruleset) === false) {
|
||
|
$config = new Config();
|
||
|
$config->standards = ['Generic'];
|
||
|
$config->sniffs = [
|
||
|
'Generic.PHP.LowerCaseConstant',
|
||
|
'Generic.Commenting.Todo',
|
||
|
];
|
||
|
|
||
|
$ruleset = new Ruleset($config);
|
||
|
}
|
||
|
|
||
|
$content = '<?php '.$code;
|
||
|
$file = new DummyFile($content, $ruleset, $config);
|
||
|
$file->process();
|
||
|
|
||
|
$this->assertSame($expectedErrors, $file->getErrorCount());
|
||
|
$this->assertCount($expectedErrors, $file->getErrors());
|
||
|
|
||
|
$this->assertSame($expectedWarnings, $file->getWarningCount());
|
||
|
$this->assertCount($expectedWarnings, $file->getWarnings());
|
||
|
|
||
|
}//end testCommenting()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testCommenting()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataCommenting()
|
||
|
{
|
||
|
return [
|
||
|
'ignore: single sniff' => [
|
||
|
'code' => '
|
||
|
// phpcs:ignore Generic.Commenting.Todo -- Because reasons
|
||
|
$var = FALSE; //TODO: write some code
|
||
|
$var = FALSE; //TODO: write some code',
|
||
|
'expectedErrors' => 2,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: single sniff; enable: same sniff - test whitespace handling around reason delimiter' => [
|
||
|
'code' => '
|
||
|
// phpcs:disable Generic.Commenting.Todo --Because reasons
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code
|
||
|
// phpcs:enable Generic.Commenting.Todo -- Because reasons
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'disable: single sniff, multi-line comment' => [
|
||
|
'code' => '
|
||
|
/*
|
||
|
Disable some checks
|
||
|
phpcs:disable Generic.Commenting.Todo
|
||
|
*/
|
||
|
$var = FALSE;
|
||
|
//TODO: write some code',
|
||
|
'expectedErrors' => 1,
|
||
|
'expectedWarnings' => 0,
|
||
|
],
|
||
|
'ignore: single sniff, multi-line slash comment' => [
|
||
|
'code' => '
|
||
|
// Turn off a check for the next line of code.
|
||
|
// phpcs:ignore Generic.Commenting.Todo
|
||
|
$var = FALSE; //TODO: write some code
|
||
|
$var = FALSE; //TODO: write some code',
|
||
|
'expectedErrors' => 2,
|
||
|
'expectedWarnings' => 1,
|
||
|
],
|
||
|
'enable before disable, sniff not in standard' => [
|
||
|
'code' => '
|
||
|
// phpcs:enable Generic.PHP.NoSilencedErrors -- Because reasons
|
||
|
$var = @delete( $filename );
|
||
|
',
|
||
|
'expectedErrors' => 0,
|
||
|
'expectedWarnings' => 0,
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataCommenting()
|
||
|
|
||
|
|
||
|
}//end class
|