* @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