123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- <?php
- declare(strict_types=1);
- /*
- * This file is part of PHP CS Fixer.
- *
- * (c) Fabien Potencier <fabien@symfony.com>
- * Dariusz Rumiński <dariusz.ruminski@gmail.com>
- *
- * This source file is subject to the MIT license that is bundled
- * with this source code in the file LICENSE.
- */
- namespace PhpCsFixer\Tests\Fixer\LanguageConstruct;
- use PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException;
- use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
- /**
- * @internal
- *
- * @covers \PhpCsFixer\Fixer\LanguageConstruct\FunctionToConstantFixer
- *
- * @extends AbstractFixerTestCase<\PhpCsFixer\Fixer\LanguageConstruct\FunctionToConstantFixer>
- *
- * @phpstan-import-type _AutogeneratedInputConfiguration from \PhpCsFixer\Fixer\LanguageConstruct\FunctionToConstantFixer
- */
- final class FunctionToConstantFixerTest extends AbstractFixerTestCase
- {
- /**
- * @param _AutogeneratedInputConfiguration $config
- *
- * @dataProvider provideFixCases
- */
- public function testFix(string $expected, ?string $input = null, array $config = []): void
- {
- $this->fixer->configure($config);
- $this->doTest($expected, $input);
- }
- public static function provideFixCases(): iterable
- {
- yield 'Minimal case, alternative casing, alternative statement end.' => [
- '<?php echo PHP_VERSION?>',
- '<?php echo PHPversion()?>',
- ];
- yield 'With embedded comment.' => [
- '<?php echo PHP_VERSION/**/?>',
- '<?php echo phpversion(/**/)?>',
- ];
- yield 'With white space.' => [
- '<?php echo PHP_VERSION ;',
- '<?php echo phpversion ( ) ;',
- ];
- yield 'With multi line whitespace.' => [
- '<?php echo
- PHP_VERSION
- '.'
- '.'
- ;',
- '<?php echo
- phpversion
- (
- )
- ;',
- ];
- yield 'Global namespaced.' => [
- '<?php echo \PHP_VERSION;',
- '<?php echo \phpversion();',
- ];
- yield 'Wrong number of arguments.' => [
- '<?php phpversion($a);',
- ];
- yield 'Wrong namespace.' => [
- '<?php A\B\phpversion();',
- ];
- yield 'Class creating.' => [
- '<?php new phpversion();',
- ];
- yield 'Class static method call.' => [
- '<?php A::phpversion();',
- ];
- yield 'Class method call.' => [
- '<?php $a->phpversion();',
- ];
- yield 'Overridden function.' => [
- '<?php if (!function_exists("phpversion")){function phpversion(){}}?>',
- ];
- yield 'phpversion only' => [
- '<?php echo PHP_VERSION; echo php_sapi_name(); echo pi();',
- '<?php echo phpversion(); echo php_sapi_name(); echo pi();',
- ['functions' => ['phpversion']],
- ];
- yield 'php_sapi_name only' => [
- '<?php echo phpversion(); echo PHP_SAPI; echo pi();',
- '<?php echo phpversion(); echo php_sapi_name(); echo pi();',
- ['functions' => ['php_sapi_name']],
- ];
- yield 'php_sapi_name in conditional' => [
- '<?php if ("cli" === PHP_SAPI && $a){ echo 123;}',
- '<?php if ("cli" === php_sapi_name() && $a){ echo 123;}',
- ['functions' => ['php_sapi_name']],
- ];
- yield 'pi only' => [
- '<?php echo phpversion(); echo php_sapi_name(); echo M_PI;',
- '<?php echo phpversion(); echo php_sapi_name(); echo pi();',
- ['functions' => ['pi']],
- ];
- yield 'multi line pi' => [
- '<?php
- $a =
- $b
- || $c < M_PI
- ;',
- '<?php
- $a =
- $b
- || $c < pi()
- ;',
- ['functions' => ['pi']],
- ];
- yield 'phpversion and pi' => [
- '<?php echo PHP_VERSION; echo php_sapi_name(); echo M_PI;',
- '<?php echo phpversion(); echo php_sapi_name(); echo M_PI;',
- ['functions' => ['pi', 'phpversion']],
- ];
- yield 'diff argument count than native allows' => [
- '<?php
- echo phpversion(1);
- echo php_sapi_name(1,2);
- echo pi(1);
- ',
- ];
- yield 'get_class => T_CLASS' => [
- '<?php
- class A
- {
- public function echoClassName($notMe)
- {
- echo get_class($notMe);
- echo self::class/** 1 *//* 2 */;
- echo self::class;
- }
- }
- class B
- {
- use A;
- }
- ',
- '<?php
- class A
- {
- public function echoClassName($notMe)
- {
- echo get_class($notMe);
- echo get_class(/** 1 *//* 2 */);
- echo GET_Class();
- }
- }
- class B
- {
- use A;
- }
- ',
- ];
- yield 'get_class with leading backslash' => [
- '<?php self::class;',
- '<?php \get_class();',
- ];
- yield [
- '<?php class A { function B(){ echo static::class; }}',
- '<?php class A { function B(){ echo get_called_class(); }}',
- ['functions' => ['get_called_class']],
- ];
- yield [
- '<?php class A { function B(){
- echo#.
- #0
- static::class#1
- #2
- #3
- #4
- #5
- #6
- ;#7
- }}
- ',
- '<?php class A { function B(){
- echo#.
- #0
- get_called_class#1
- #2
- (#3
- #4
- )#5
- #6
- ;#7
- }}
- ',
- ['functions' => ['get_called_class']],
- ];
- yield 'get_called_class with leading backslash' => [
- '<?php class A { function B(){echo static::class; }}',
- '<?php class A { function B(){echo \get_called_class(); }}',
- ['functions' => ['get_called_class']],
- ];
- yield 'get_called_class overridden' => [
- '<?php echo get_called_class(1);',
- null,
- ['functions' => ['get_called_class']],
- ];
- yield [
- '<?php class Foo{ public function Bar(){ echo static::class ; }}',
- '<?php class Foo{ public function Bar(){ echo get_class( $This ); }}',
- ['functions' => ['get_class_this']],
- ];
- yield [
- '<?php class Foo{ public function Bar(){ echo static::class; get_class(1, 2); get_class($a); get_class($a, $b);}}',
- '<?php class Foo{ public function Bar(){ echo get_class($this); get_class(1, 2); get_class($a); get_class($a, $b);}}',
- ['functions' => ['get_class_this']],
- ];
- yield [
- '<?php class Foo{ public function Bar(){ echo static::class /* 0 */ /* 1 */ ;}}',
- '<?php class Foo{ public function Bar(){ echo \get_class( /* 0 */ $this /* 1 */ );}}',
- ['functions' => ['get_class_this']],
- ];
- yield [
- '<?php class Foo{ public function Bar(){ echo static::class; echo self::class; }}',
- '<?php class Foo{ public function Bar(){ echo \get_class((($this))); echo get_class(); }}',
- ['functions' => ['get_class_this', 'get_class']],
- ];
- yield [
- '<?php
- class Foo{ public function Bar(){ echo $reflection = new \ReflectionClass(get_class($this->extension)); }}
- class Foo{ public function Bar(){ echo $reflection = new \ReflectionClass(get_class($this() )); }}
- ',
- null,
- ['functions' => ['get_class_this']],
- ];
- yield [
- "<?php namespace Foo;\nfunction &PHPversion(){}",
- ];
- }
- /**
- * @param _AutogeneratedInputConfiguration $config
- *
- * @dataProvider provideInvalidConfigurationKeysCases
- */
- public function testInvalidConfigurationKeys(array $config, string $expectedExceptionMessage): void
- {
- $this->expectException(InvalidFixerConfigurationException::class);
- $this->expectExceptionMessage($expectedExceptionMessage);
- $this->fixer->configure($config);
- }
- public static function provideInvalidConfigurationKeysCases(): iterable
- {
- yield [
- ['functions' => ['a']],
- '[function_to_constant] Invalid configuration: The option "functions" with value array is invalid.',
- ];
- yield [
- ['functions' => [false => 1]],
- '[function_to_constant] Invalid configuration: The option "functions" with value array is expected to be of type "string[]", but one of the elements is of type "int".',
- ];
- yield [
- ['functions' => ['abc' => true]],
- '[function_to_constant] Invalid configuration: The option "functions" with value array is expected to be of type "string[]", but one of the elements is of type "bool".',
- ];
- }
- public function testInvalidConfigurationValue(): void
- {
- $this->expectException(InvalidFixerConfigurationException::class);
- $this->expectExceptionMessageMatches('#^\[function_to_constant\] Invalid configuration: The option "0" does not exist\. Defined options are: "functions"\.$#');
- $this->fixer->configure(['pi123']);
- }
- /**
- * @dataProvider provideFix81Cases
- *
- * @requires PHP 8.1
- */
- public function testFix81(string $expected, ?string $input = null): void
- {
- $this->doTest($expected, $input);
- }
- /**
- * @return iterable<string, array{string}>
- */
- public static function provideFix81Cases(): iterable
- {
- yield 'first callable class' => [
- '<?php $a = get_class(...);',
- ];
- }
- }
|