510 lines
13 KiB
PHP
510 lines
13 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Tests the conversion of context sensitive keywords to T_STRING.
|
||
|
*
|
||
|
* @author Jaroslav Hanslík <kukulich@kukulich.cz>
|
||
|
* @copyright 2020 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\Tokenizer;
|
||
|
|
||
|
use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest;
|
||
|
use PHP_CodeSniffer\Util\Tokens;
|
||
|
|
||
|
class ContextSensitiveKeywordsTest extends AbstractMethodUnitTest
|
||
|
{
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test that context sensitive keyword is tokenized as string when it should be string.
|
||
|
*
|
||
|
* @param string $testMarker The comment which prefaces the target token in the test file.
|
||
|
*
|
||
|
* @dataProvider dataStrings
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testStrings($testMarker)
|
||
|
{
|
||
|
$tokens = self::$phpcsFile->getTokens();
|
||
|
|
||
|
$token = $this->getTargetToken($testMarker, (Tokens::$contextSensitiveKeywords + [T_STRING]));
|
||
|
|
||
|
$this->assertSame(T_STRING, $tokens[$token]['code']);
|
||
|
$this->assertSame('T_STRING', $tokens[$token]['type']);
|
||
|
|
||
|
}//end testStrings()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testStrings()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataStrings()
|
||
|
{
|
||
|
return [
|
||
|
['/* testAbstract */'],
|
||
|
['/* testArray */'],
|
||
|
['/* testAs */'],
|
||
|
['/* testBreak */'],
|
||
|
['/* testCallable */'],
|
||
|
['/* testCase */'],
|
||
|
['/* testCatch */'],
|
||
|
['/* testClass */'],
|
||
|
['/* testClone */'],
|
||
|
['/* testConst */'],
|
||
|
['/* testContinue */'],
|
||
|
['/* testDeclare */'],
|
||
|
['/* testDefault */'],
|
||
|
['/* testDo */'],
|
||
|
['/* testEcho */'],
|
||
|
['/* testElse */'],
|
||
|
['/* testElseIf */'],
|
||
|
['/* testEmpty */'],
|
||
|
['/* testEndDeclare */'],
|
||
|
['/* testEndFor */'],
|
||
|
['/* testEndForeach */'],
|
||
|
['/* testEndIf */'],
|
||
|
['/* testEndSwitch */'],
|
||
|
['/* testEndWhile */'],
|
||
|
['/* testEnum */'],
|
||
|
['/* testEval */'],
|
||
|
['/* testExit */'],
|
||
|
['/* testExtends */'],
|
||
|
['/* testFinal */'],
|
||
|
['/* testFinally */'],
|
||
|
['/* testFn */'],
|
||
|
['/* testFor */'],
|
||
|
['/* testForeach */'],
|
||
|
['/* testFunction */'],
|
||
|
['/* testGlobal */'],
|
||
|
['/* testGoto */'],
|
||
|
['/* testIf */'],
|
||
|
['/* testImplements */'],
|
||
|
['/* testInclude */'],
|
||
|
['/* testIncludeOnce */'],
|
||
|
['/* testInstanceOf */'],
|
||
|
['/* testInsteadOf */'],
|
||
|
['/* testInterface */'],
|
||
|
['/* testIsset */'],
|
||
|
['/* testList */'],
|
||
|
['/* testMatch */'],
|
||
|
['/* testNamespace */'],
|
||
|
['/* testNew */'],
|
||
|
['/* testParent */'],
|
||
|
['/* testPrint */'],
|
||
|
['/* testPrivate */'],
|
||
|
['/* testProtected */'],
|
||
|
['/* testPublic */'],
|
||
|
['/* testReadonly */'],
|
||
|
['/* testRequire */'],
|
||
|
['/* testRequireOnce */'],
|
||
|
['/* testReturn */'],
|
||
|
['/* testSelf */'],
|
||
|
['/* testStatic */'],
|
||
|
['/* testSwitch */'],
|
||
|
['/* testThrows */'],
|
||
|
['/* testTrait */'],
|
||
|
['/* testTry */'],
|
||
|
['/* testUnset */'],
|
||
|
['/* testUse */'],
|
||
|
['/* testVar */'],
|
||
|
['/* testWhile */'],
|
||
|
['/* testYield */'],
|
||
|
['/* testYieldFrom */'],
|
||
|
['/* testAnd */'],
|
||
|
['/* testOr */'],
|
||
|
['/* testXor */'],
|
||
|
|
||
|
['/* testKeywordAfterNamespaceShouldBeString */'],
|
||
|
['/* testNamespaceNameIsString1 */'],
|
||
|
['/* testNamespaceNameIsString2 */'],
|
||
|
['/* testNamespaceNameIsString3 */'],
|
||
|
|
||
|
['/* testKeywordAfterFunctionShouldBeString */'],
|
||
|
['/* testKeywordAfterFunctionByRefShouldBeString */'],
|
||
|
];
|
||
|
|
||
|
}//end dataStrings()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Test that context sensitive keyword is tokenized as keyword when it should be keyword.
|
||
|
*
|
||
|
* @param string $testMarker The comment which prefaces the target token in the test file.
|
||
|
* @param string $expectedTokenType The expected token type.
|
||
|
*
|
||
|
* @dataProvider dataKeywords
|
||
|
* @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function testKeywords($testMarker, $expectedTokenType)
|
||
|
{
|
||
|
$tokens = self::$phpcsFile->getTokens();
|
||
|
|
||
|
$token = $this->getTargetToken($testMarker, (Tokens::$contextSensitiveKeywords + [T_ANON_CLASS, T_MATCH_DEFAULT, T_PARENT, T_SELF, T_STRING]));
|
||
|
|
||
|
$this->assertSame(constant($expectedTokenType), $tokens[$token]['code']);
|
||
|
$this->assertSame($expectedTokenType, $tokens[$token]['type']);
|
||
|
|
||
|
}//end testKeywords()
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Data provider.
|
||
|
*
|
||
|
* @see testKeywords()
|
||
|
*
|
||
|
* @return array
|
||
|
*/
|
||
|
public function dataKeywords()
|
||
|
{
|
||
|
return [
|
||
|
[
|
||
|
'/* testNamespaceIsKeyword */',
|
||
|
'T_NAMESPACE',
|
||
|
],
|
||
|
[
|
||
|
'/* testAbstractIsKeyword */',
|
||
|
'T_ABSTRACT',
|
||
|
],
|
||
|
[
|
||
|
'/* testClassIsKeyword */',
|
||
|
'T_CLASS',
|
||
|
],
|
||
|
[
|
||
|
'/* testExtendsIsKeyword */',
|
||
|
'T_EXTENDS',
|
||
|
],
|
||
|
[
|
||
|
'/* testImplementsIsKeyword */',
|
||
|
'T_IMPLEMENTS',
|
||
|
],
|
||
|
[
|
||
|
'/* testUseIsKeyword */',
|
||
|
'T_USE',
|
||
|
],
|
||
|
[
|
||
|
'/* testInsteadOfIsKeyword */',
|
||
|
'T_INSTEADOF',
|
||
|
],
|
||
|
[
|
||
|
'/* testAsIsKeyword */',
|
||
|
'T_AS',
|
||
|
],
|
||
|
[
|
||
|
'/* testConstIsKeyword */',
|
||
|
'T_CONST',
|
||
|
],
|
||
|
[
|
||
|
'/* testPrivateIsKeyword */',
|
||
|
'T_PRIVATE',
|
||
|
],
|
||
|
[
|
||
|
'/* testProtectedIsKeyword */',
|
||
|
'T_PROTECTED',
|
||
|
],
|
||
|
[
|
||
|
'/* testPublicIsKeyword */',
|
||
|
'T_PUBLIC',
|
||
|
],
|
||
|
[
|
||
|
'/* testVarIsKeyword */',
|
||
|
'T_VAR',
|
||
|
],
|
||
|
[
|
||
|
'/* testStaticIsKeyword */',
|
||
|
'T_STATIC',
|
||
|
],
|
||
|
[
|
||
|
'/* testReadonlyIsKeyword */',
|
||
|
'T_READONLY',
|
||
|
],
|
||
|
[
|
||
|
'/* testFinalIsKeyword */',
|
||
|
'T_FINAL',
|
||
|
],
|
||
|
[
|
||
|
'/* testFunctionIsKeyword */',
|
||
|
'T_FUNCTION',
|
||
|
],
|
||
|
[
|
||
|
'/* testCallableIsKeyword */',
|
||
|
'T_CALLABLE',
|
||
|
],
|
||
|
[
|
||
|
'/* testSelfIsKeyword */',
|
||
|
'T_SELF',
|
||
|
],
|
||
|
[
|
||
|
'/* testParentIsKeyword */',
|
||
|
'T_PARENT',
|
||
|
],
|
||
|
[
|
||
|
'/* testReturnIsKeyword */',
|
||
|
'T_RETURN',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testInterfaceIsKeyword */',
|
||
|
'T_INTERFACE',
|
||
|
],
|
||
|
[
|
||
|
'/* testTraitIsKeyword */',
|
||
|
'T_TRAIT',
|
||
|
],
|
||
|
[
|
||
|
'/* testEnumIsKeyword */',
|
||
|
'T_ENUM',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testNewIsKeyword */',
|
||
|
'T_NEW',
|
||
|
],
|
||
|
[
|
||
|
'/* testInstanceOfIsKeyword */',
|
||
|
'T_INSTANCEOF',
|
||
|
],
|
||
|
[
|
||
|
'/* testCloneIsKeyword */',
|
||
|
'T_CLONE',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testIfIsKeyword */',
|
||
|
'T_IF',
|
||
|
],
|
||
|
[
|
||
|
'/* testEmptyIsKeyword */',
|
||
|
'T_EMPTY',
|
||
|
],
|
||
|
[
|
||
|
'/* testElseIfIsKeyword */',
|
||
|
'T_ELSEIF',
|
||
|
],
|
||
|
[
|
||
|
'/* testElseIsKeyword */',
|
||
|
'T_ELSE',
|
||
|
],
|
||
|
[
|
||
|
'/* testEndIfIsKeyword */',
|
||
|
'T_ENDIF',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testForIsKeyword */',
|
||
|
'T_FOR',
|
||
|
],
|
||
|
[
|
||
|
'/* testEndForIsKeyword */',
|
||
|
'T_ENDFOR',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testForeachIsKeyword */',
|
||
|
'T_FOREACH',
|
||
|
],
|
||
|
[
|
||
|
'/* testEndForeachIsKeyword */',
|
||
|
'T_ENDFOREACH',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testSwitchIsKeyword */',
|
||
|
'T_SWITCH',
|
||
|
],
|
||
|
[
|
||
|
'/* testCaseIsKeyword */',
|
||
|
'T_CASE',
|
||
|
],
|
||
|
[
|
||
|
'/* testDefaultIsKeyword */',
|
||
|
'T_DEFAULT',
|
||
|
],
|
||
|
[
|
||
|
'/* testEndSwitchIsKeyword */',
|
||
|
'T_ENDSWITCH',
|
||
|
],
|
||
|
[
|
||
|
'/* testBreakIsKeyword */',
|
||
|
'T_BREAK',
|
||
|
],
|
||
|
[
|
||
|
'/* testContinueIsKeyword */',
|
||
|
'T_CONTINUE',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testDoIsKeyword */',
|
||
|
'T_DO',
|
||
|
],
|
||
|
[
|
||
|
'/* testWhileIsKeyword */',
|
||
|
'T_WHILE',
|
||
|
],
|
||
|
[
|
||
|
'/* testEndWhileIsKeyword */',
|
||
|
'T_ENDWHILE',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testTryIsKeyword */',
|
||
|
'T_TRY',
|
||
|
],
|
||
|
[
|
||
|
'/* testThrowIsKeyword */',
|
||
|
'T_THROW',
|
||
|
],
|
||
|
[
|
||
|
'/* testCatchIsKeyword */',
|
||
|
'T_CATCH',
|
||
|
],
|
||
|
[
|
||
|
'/* testFinallyIsKeyword */',
|
||
|
'T_FINALLY',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testGlobalIsKeyword */',
|
||
|
'T_GLOBAL',
|
||
|
],
|
||
|
[
|
||
|
'/* testEchoIsKeyword */',
|
||
|
'T_ECHO',
|
||
|
],
|
||
|
[
|
||
|
'/* testPrintIsKeyword */',
|
||
|
'T_PRINT',
|
||
|
],
|
||
|
[
|
||
|
'/* testDieIsKeyword */',
|
||
|
'T_EXIT',
|
||
|
],
|
||
|
[
|
||
|
'/* testEvalIsKeyword */',
|
||
|
'T_EVAL',
|
||
|
],
|
||
|
[
|
||
|
'/* testExitIsKeyword */',
|
||
|
'T_EXIT',
|
||
|
],
|
||
|
[
|
||
|
'/* testIssetIsKeyword */',
|
||
|
'T_ISSET',
|
||
|
],
|
||
|
[
|
||
|
'/* testUnsetIsKeyword */',
|
||
|
'T_UNSET',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testIncludeIsKeyword */',
|
||
|
'T_INCLUDE',
|
||
|
],
|
||
|
[
|
||
|
'/* testIncludeOnceIsKeyword */',
|
||
|
'T_INCLUDE_ONCE',
|
||
|
],
|
||
|
[
|
||
|
'/* testRequireIsKeyword */',
|
||
|
'T_REQUIRE',
|
||
|
],
|
||
|
[
|
||
|
'/* testRequireOnceIsKeyword */',
|
||
|
'T_REQUIRE_ONCE',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testListIsKeyword */',
|
||
|
'T_LIST',
|
||
|
],
|
||
|
[
|
||
|
'/* testGotoIsKeyword */',
|
||
|
'T_GOTO',
|
||
|
],
|
||
|
[
|
||
|
'/* testMatchIsKeyword */',
|
||
|
'T_MATCH',
|
||
|
],
|
||
|
[
|
||
|
'/* testMatchDefaultIsKeyword */',
|
||
|
'T_MATCH_DEFAULT',
|
||
|
],
|
||
|
[
|
||
|
'/* testFnIsKeyword */',
|
||
|
'T_FN',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testYieldIsKeyword */',
|
||
|
'T_YIELD',
|
||
|
],
|
||
|
[
|
||
|
'/* testYieldFromIsKeyword */',
|
||
|
'T_YIELD_FROM',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testDeclareIsKeyword */',
|
||
|
'T_DECLARE',
|
||
|
],
|
||
|
[
|
||
|
'/* testEndDeclareIsKeyword */',
|
||
|
'T_ENDDECLARE',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testAndIsKeyword */',
|
||
|
'T_LOGICAL_AND',
|
||
|
],
|
||
|
[
|
||
|
'/* testOrIsKeyword */',
|
||
|
'T_LOGICAL_OR',
|
||
|
],
|
||
|
[
|
||
|
'/* testXorIsKeyword */',
|
||
|
'T_LOGICAL_XOR',
|
||
|
],
|
||
|
|
||
|
[
|
||
|
'/* testAnonymousClassIsKeyword */',
|
||
|
'T_ANON_CLASS',
|
||
|
],
|
||
|
[
|
||
|
'/* testExtendsInAnonymousClassIsKeyword */',
|
||
|
'T_EXTENDS',
|
||
|
],
|
||
|
[
|
||
|
'/* testImplementsInAnonymousClassIsKeyword */',
|
||
|
'T_IMPLEMENTS',
|
||
|
],
|
||
|
[
|
||
|
'/* testClassInstantiationParentIsKeyword */',
|
||
|
'T_PARENT',
|
||
|
],
|
||
|
[
|
||
|
'/* testClassInstantiationSelfIsKeyword */',
|
||
|
'T_SELF',
|
||
|
],
|
||
|
[
|
||
|
'/* testClassInstantiationStaticIsKeyword */',
|
||
|
'T_STATIC',
|
||
|
],
|
||
|
[
|
||
|
'/* testNamespaceInNameIsKeyword */',
|
||
|
'T_NAMESPACE',
|
||
|
],
|
||
|
];
|
||
|
|
||
|
}//end dataKeywords()
|
||
|
|
||
|
|
||
|
}//end class
|