Skip to content

Commit

Permalink
Tests/GetMethodPropertiesTest: add extra tests
Browse files Browse the repository at this point in the history
This adds some extra tests which were already in use in PHPCSUtils.
  • Loading branch information
jrfnl committed Jan 2, 2024
1 parent 4a759e3 commit 5971a5f
Show file tree
Hide file tree
Showing 2 changed files with 247 additions and 1 deletion.
33 changes: 32 additions & 1 deletion tests/Core/File/GetMethodPropertiesTest.inc
Original file line number Diff line number Diff line change
Expand Up @@ -34,16 +34,23 @@ class MyClass {
/* testMessyNullableReturnMethod */
public function myFunction() /* comment
*/ :
/* comment */ ? //comment
/* comment */ ? // phpcs:ignore Stnd.Cat.Sniff -- For reasons.
array {}

/* testReturnNamespace */
function myFunction(): \MyNamespace\MyClass {}

/* testReturnMultilineNamespace */
// Parse error in PHP 8.0.
function myFunction(): \MyNamespace /** comment *\/ comment */
\MyClass /* comment */
\Foo {}

/* testReturnUnqualifiedName */
private function myFunction(): ?MyClass {}

/* testReturnPartiallyQualifiedName */
function myFunction(): Sub\Level\MyClass {}
}

abstract class MyClass
Expand Down Expand Up @@ -157,3 +164,27 @@ function pseudoTypeTrue(): ?true {}
/* testPHP82PseudoTypeFalseAndTrue */
// Intentional fatal error - Type contains both true and false, bool should be used instead, but that's not the concern of the method.
function pseudoTypeFalseAndTrue(): true|false {}

/* testNotAFunction */
return true;

/* testPhpcsIssue1264 */
function foo() : array {
echo $foo;
}

/* testArrowFunctionArrayReturnValue */
$fn = fn(): array => [a($a, $b)];

/* testArrowFunctionReturnByRef */
fn&(?string $a) : ?string => $b;

/* testFunctionCallFnPHPCS353-354 */
$value = $obj->fn(true);

/* testFunctionDeclarationNestedInTernaryPHPCS2975 */
return (!$a ? [ new class { public function b(): c {} } ] : []);

/* testArrowFunctionLiveCoding */
// Intentional parse error. This has to be the last test in the file.
$fn = fn
215 changes: 215 additions & 0 deletions tests/Core/File/GetMethodPropertiesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,59 @@ class GetMethodPropertiesTest extends AbstractMethodUnitTest
{


/**
* Test receiving an expected exception when a non function token is passed.
*
* @param string $commentString The comment which preceeds the test.
* @param string|int|array<int|string> $targetTokenType The token type to search for after $commentString.
*
* @dataProvider dataNotAFunctionException
*
* @return void
*/
public function testNotAFunctionException($commentString, $targetTokenType)
{
$this->expectRunTimeException('$stackPtr must be of type T_FUNCTION or T_CLOSURE or T_FN');

$next = $this->getTargetToken($commentString, $targetTokenType);
self::$phpcsFile->getMethodProperties($next);

}//end testNotAFunctionException()


/**
* Data Provider.
*
* @see testNotAFunctionException() For the array format.
*
* @return array<string, array<string, string|int|array<int|string>>>
*/
public static function dataNotAFunctionException()
{
return [
'return' => [
'commentString' => '/* testNotAFunction */',
'targetTokenType' => T_RETURN,
],
'function-call-fn-phpcs-3.5.3-3.5.4' => [
'commentString' => '/* testFunctionCallFnPHPCS353-354 */',
'targetTokenType' => [
T_FN,
T_STRING,
],
],
'fn-live-coding' => [
'commentString' => '/* testArrowFunctionLiveCoding */',
'targetTokenType' => [
T_FN,
T_STRING,
],
],
];

}//end dataNotAFunctionException()


/**
* Test a basic function.
*
Expand Down Expand Up @@ -328,6 +381,58 @@ public function testReturnMultilineNamespace()
}//end testReturnMultilineNamespace()


/**
* Test a method with an unqualified named return type.
*
* @return void
*/
public function testReturnUnqualifiedName()
{
// Offsets are relative to the T_FUNCTION token.
$expected = [
'scope' => 'private',
'scope_specified' => true,
'return_type' => '?MyClass',
'return_type_token' => 8,
'return_type_end_token' => 8,
'nullable_return_type' => true,
'is_abstract' => false,
'is_final' => false,
'is_static' => false,
'has_body' => true,
];

$this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected);

}//end testReturnUnqualifiedName()


/**
* Test a method with a partially qualified namespaced return type.
*
* @return void
*/
public function testReturnPartiallyQualifiedName()
{
// Offsets are relative to the T_FUNCTION token.
$expected = [
'scope' => 'public',
'scope_specified' => false,
'return_type' => 'Sub\Level\MyClass',
'return_type_token' => 7,
'return_type_end_token' => 11,
'nullable_return_type' => false,
'is_abstract' => false,
'is_final' => false,
'is_static' => false,
'has_body' => true,
];

$this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected);

}//end testReturnPartiallyQualifiedName()


/**
* Test a basic abstract method.
*
Expand Down Expand Up @@ -1056,6 +1161,116 @@ public function testPHP82PseudoTypeFalseAndTrue()
}//end testPHP82PseudoTypeFalseAndTrue()


/**
* Test for incorrect tokenization of array return type declarations in PHPCS < 2.8.0.
*
* @link https://github.com/squizlabs/PHP_CodeSniffer/pull/1264
*
* @return void
*/
public function testPhpcsIssue1264()
{
// Offsets are relative to the T_FUNCTION token.
$expected = [
'scope' => 'public',
'scope_specified' => false,
'return_type' => 'array',
'return_type_token' => 8,
'return_type_end_token' => 8,
'nullable_return_type' => false,
'is_abstract' => false,
'is_final' => false,
'is_static' => false,
'has_body' => true,
];

$this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected);

}//end testPhpcsIssue1264()


/**
* Test handling of incorrect tokenization of array return type declarations for arrow functions
* in a very specific code sample in PHPCS < 3.5.4.
*
* @link https://github.com/squizlabs/PHP_CodeSniffer/issues/2773
*
* @return void
*/
public function testArrowFunctionArrayReturnValue()
{
// Offsets are relative to the T_FN token.
$expected = [
'scope' => 'public',
'scope_specified' => false,
'return_type' => 'array',
'return_type_token' => 5,
'return_type_end_token' => 5,
'nullable_return_type' => false,
'is_abstract' => false,
'is_final' => false,
'is_static' => false,
'has_body' => true,
];

$this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected);

}//end testArrowFunctionArrayReturnValue()


/**
* Test handling of an arrow function returning by reference.
*
* @return void
*/
public function testArrowFunctionReturnByRef()
{
// Offsets are relative to the T_FN token.
$expected = [
'scope' => 'public',
'scope_specified' => false,
'return_type' => '?string',
'return_type_token' => 12,
'return_type_end_token' => 12,
'nullable_return_type' => true,
'is_abstract' => false,
'is_final' => false,
'is_static' => false,
'has_body' => true,
];

$this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected);

}//end testArrowFunctionReturnByRef()


/**
* Test handling of function declaration nested in a ternary, where the colon for the
* return type was incorrectly tokenized as T_INLINE_ELSE prior to PHPCS 3.5.7.
*
* @return void
*/
public function testFunctionDeclarationNestedInTernaryPHPCS2975()
{
// Offsets are relative to the T_FN token.
$expected = [
'scope' => 'public',
'scope_specified' => true,
'return_type' => 'c',
'return_type_token' => 7,
'return_type_end_token' => 7,
'nullable_return_type' => false,
'is_abstract' => false,
'is_final' => false,
'is_static' => false,
'has_body' => true,
];

$this->getMethodPropertiesTestHelper('/* '.__FUNCTION__.' */', $expected);

}//end testFunctionDeclarationNestedInTernaryPHPCS2975()


/**
* Test helper.
*
Expand Down

0 comments on commit 5971a5f

Please sign in to comment.