1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150
|
<?php
/**
* Tests converting enum "case" to T_ENUM_CASE.
*
* @author Jaroslav HanslĂk <kukulich@kukulich.cz>
* @copyright 2021 Squiz Pty Ltd (ABN 77 084 670 600)
* @license https://github.com/PHPCSStandards/PHP_CodeSniffer/blob/master/licence.txt BSD Licence
*/
namespace PHP_CodeSniffer\Tests\Core\Tokenizers\PHP;
use PHP_CodeSniffer\Tests\Core\Tokenizers\AbstractTokenizerTestCase;
final class EnumCaseTest extends AbstractTokenizerTestCase
{
/**
* Test that the enum "case" is converted to T_ENUM_CASE.
*
* @param string $testMarker The comment which prefaces the target token in the test file.
*
* @dataProvider dataEnumCases
* @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize
*
* @return void
*/
public function testEnumCases($testMarker)
{
$tokens = $this->phpcsFile->getTokens();
$enumCase = $this->getTargetToken($testMarker, [T_ENUM_CASE, T_CASE]);
$tokenArray = $tokens[$enumCase];
$this->assertSame(T_ENUM_CASE, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_ENUM_CASE (code)');
$this->assertSame('T_ENUM_CASE', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_ENUM_CASE (type)');
}//end testEnumCases()
/**
* Data provider.
*
* @see testEnumCases()
*
* @return array<string, array<string>>
*/
public static function dataEnumCases()
{
return [
'enum case, no value' => ['/* testPureEnumCase */'],
'enum case, integer value' => ['/* testBackingIntegerEnumCase */'],
'enum case, string value' => ['/* testBackingStringEnumCase */'],
'enum case, integer value in more complex enum' => ['/* testEnumCaseInComplexEnum */'],
'enum case, keyword in mixed case' => ['/* testEnumCaseIsCaseInsensitive */'],
'enum case, after switch statement' => ['/* testEnumCaseAfterSwitch */'],
'enum case, after switch statement using alternative syntax' => ['/* testEnumCaseAfterSwitchWithEndSwitch */'],
];
}//end dataEnumCases()
/**
* Test that "case" that is not enum case is still tokenized as `T_CASE`.
*
* @param string $testMarker The comment which prefaces the target token in the test file.
*
* @dataProvider dataNotEnumCases
* @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize
*
* @return void
*/
public function testNotEnumCases($testMarker)
{
$tokens = $this->phpcsFile->getTokens();
$case = $this->getTargetToken($testMarker, [T_ENUM_CASE, T_CASE]);
$tokenArray = $tokens[$case];
$this->assertSame(T_CASE, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_CASE (code)');
$this->assertSame('T_CASE', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_CASE (type)');
}//end testNotEnumCases()
/**
* Data provider.
*
* @see testNotEnumCases()
*
* @return array<string, array<string>>
*/
public static function dataNotEnumCases()
{
return [
'switch case with constant, semicolon condition end' => ['/* testCaseWithSemicolonIsNotEnumCase */'],
'switch case with constant, colon condition end' => ['/* testCaseWithConstantIsNotEnumCase */'],
'switch case with constant, comparison' => ['/* testCaseWithConstantAndIdenticalIsNotEnumCase */'],
'switch case with constant, assignment' => ['/* testCaseWithAssigmentToConstantIsNotEnumCase */'],
'switch case with constant, keyword in mixed case' => ['/* testIsNotEnumCaseIsCaseInsensitive */'],
'switch case, body in curlies declares enum' => ['/* testCaseInSwitchWhenCreatingEnumInSwitch1 */'],
'switch case, body after semicolon declares enum' => ['/* testCaseInSwitchWhenCreatingEnumInSwitch2 */'],
];
}//end dataNotEnumCases()
/**
* Test that "case" that is not enum case is still tokenized as `T_CASE`.
*
* @param string $testMarker The comment which prefaces the target token in the test file.
*
* @dataProvider dataKeywordAsEnumCaseNameShouldBeString
* @covers PHP_CodeSniffer\Tokenizers\PHP::tokenize
*
* @return void
*/
public function testKeywordAsEnumCaseNameShouldBeString($testMarker)
{
$tokens = $this->phpcsFile->getTokens();
$enumCaseName = $this->getTargetToken($testMarker, [T_STRING, T_INTERFACE, T_TRAIT, T_ENUM, T_FUNCTION, T_FALSE, T_DEFAULT, T_ARRAY]);
$tokenArray = $tokens[$enumCaseName];
$this->assertSame(T_STRING, $tokenArray['code'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (code)');
$this->assertSame('T_STRING', $tokenArray['type'], 'Token tokenized as '.$tokenArray['type'].', not T_STRING (type)');
}//end testKeywordAsEnumCaseNameShouldBeString()
/**
* Data provider.
*
* @see testKeywordAsEnumCaseNameShouldBeString()
*
* @return array<string, array<string>>
*/
public static function dataKeywordAsEnumCaseNameShouldBeString()
{
return [
'"interface" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString1 */'],
'"trait" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString2 */'],
'"enum" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString3 */'],
'"function" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString4 */'],
'"false" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString5 */'],
'"default" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString6 */'],
'"array" as case name' => ['/* testKeywordAsEnumCaseNameShouldBeString7 */'],
];
}//end dataKeywordAsEnumCaseNameShouldBeString()
}//end class
|