<?php
/**
* Tests for the \PHP_CodeSniffer\Files\File:getMethodParameters method.
*
* @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\File;
use PHP_CodeSniffer\Tests\Core\AbstractMethodUnitTest;
class GetMethodParametersTest extends AbstractMethodUnitTest
{
/**
* Verify pass-by-reference parsing.
*
* @return void
*/
public function testPassByReference()
{
$expected = [];
$expected[0] = [
'name' => '$var',
'content' => '&$var',
'pass_by_reference' => true,
'variable_length' => false,
'type_hint' => '',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testPassByReference()
/**
* Verify array hint parsing.
*
* @return void
*/
public function testArrayHint()
{
$expected = [];
$expected[0] = [
'name' => '$var',
'content' => 'array $var',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => 'array',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testArrayHint()
/**
* Verify type hint parsing.
*
* @return void
*/
public function testTypeHint()
{
$expected = [];
$expected[0] = [
'name' => '$var1',
'content' => 'foo $var1',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => 'foo',
'nullable_type' => false,
];
$expected[1] = [
'name' => '$var2',
'content' => 'bar $var2',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => 'bar',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testTypeHint()
/**
* Verify self type hint parsing.
*
* @return void
*/
public function testSelfTypeHint()
{
$expected = [];
$expected[0] = [
'name' => '$var',
'content' => 'self $var',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => 'self',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testSelfTypeHint()
/**
* Verify nullable type hint parsing.
*
* @return void
*/
public function testNullableTypeHint()
{
$expected = [];
$expected[0] = [
'name' => '$var1',
'content' => '?int $var1',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '?int',
'nullable_type' => true,
];
$expected[1] = [
'name' => '$var2',
'content' => '?\bar $var2',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '?\bar',
'nullable_type' => true,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testNullableTypeHint()
/**
* Verify variable.
*
* @return void
*/
public function testVariable()
{
$expected = [];
$expected[0] = [
'name' => '$var',
'content' => '$var',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testVariable()
/**
* Verify default value parsing with a single function param.
*
* @return void
*/
public function testSingleDefaultValue()
{
$expected = [];
$expected[0] = [
'name' => '$var1',
'content' => '$var1=self::CONSTANT',
'default' => 'self::CONSTANT',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testSingleDefaultValue()
/**
* Verify default value parsing.
*
* @return void
*/
public function testDefaultValues()
{
$expected = [];
$expected[0] = [
'name' => '$var1',
'content' => '$var1=1',
'default' => '1',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '',
'nullable_type' => false,
];
$expected[1] = [
'name' => '$var2',
'content' => "\$var2='value'",
'default' => "'value'",
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testDefaultValues()
/**
* Verify "bitwise and" in default value !== pass-by-reference.
*
* @return void
*/
public function testBitwiseAndConstantExpressionDefaultValue()
{
$expected = [];
$expected[0] = [
'name' => '$a',
'content' => '$a = 10 & 20',
'default' => '10 & 20',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testBitwiseAndConstantExpressionDefaultValue()
/**
* Verify that arrow functions are supported.
*
* @return void
*/
public function testArrowFunction()
{
$expected = [];
$expected[0] = [
'name' => '$a',
'content' => 'int $a',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => 'int',
'nullable_type' => false,
];
$expected[1] = [
'name' => '$b',
'content' => '...$b',
'pass_by_reference' => false,
'variable_length' => true,
'type_hint' => '',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testArrowFunction()
/**
* Verify recognition of PHP8 mixed type declaration.
*
* @return void
*/
public function testPHP8MixedTypeHint()
{
$expected = [];
$expected[0] = [
'name' => '$var1',
'content' => 'mixed &...$var1',
'pass_by_reference' => true,
'variable_length' => true,
'type_hint' => 'mixed',
'nullable_type' => false,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testPHP8MixedTypeHint()
/**
* Verify recognition of PHP8 mixed type declaration with nullability.
*
* @return void
*/
public function testPHP8MixedTypeHintNullable()
{
$expected = [];
$expected[0] = [
'name' => '$var1',
'content' => '?Mixed $var1',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '?Mixed',
'nullable_type' => true,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testPHP8MixedTypeHintNullable()
/**
* Verify recognition of type declarations using the namespace operator.
*
* @return void
*/
public function testNamespaceOperatorTypeHint()
{
$expected = [];
$expected[0] = [
'name' => '$var1',
'content' => '?namespace\Name $var1',
'pass_by_reference' => false,
'variable_length' => false,
'type_hint' => '?namespace\Name',
'nullable_type' => true,
];
$this->getMethodParametersTestHelper('/* '.__FUNCTION__.' */', $expected);
}//end testNamespaceOperatorTypeHint()
/**
* Test helper.
*
* @param string $commentString The comment which preceeds the test.
* @param array $expected The expected function output.
*
* @return void
*/
private function getMethodParametersTestHelper($commentString, $expected)
{
$function = $this->getTargetToken($commentString, [T_FUNCTION, T_FN]);
$found = self::$phpcsFile->getMethodParameters($function);
$this->assertArraySubset($expected, $found, true);
}//end getMethodParametersTestHelper()
}//end class