FunctionToConstantFixerTest.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <?php
  2. /*
  3. * This file is part of PHP CS Fixer.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  7. *
  8. * This source file is subject to the MIT license that is bundled
  9. * with this source code in the file LICENSE.
  10. */
  11. namespace PhpCsFixer\Tests\Fixer\LanguageConstruct;
  12. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  13. /**
  14. * @author SpacePossum
  15. *
  16. * @internal
  17. *
  18. * @covers \PhpCsFixer\Fixer\LanguageConstruct\FunctionToConstantFixer
  19. */
  20. final class FunctionToConstantFixerTest extends AbstractFixerTestCase
  21. {
  22. /**
  23. * @param string $expected
  24. * @param null|string $input
  25. *
  26. * @dataProvider provideTestCases
  27. */
  28. public function testFix($expected, $input = null, array $config = [])
  29. {
  30. $this->fixer->configure($config);
  31. $this->doTest($expected, $input);
  32. }
  33. public function provideTestCases()
  34. {
  35. return [
  36. 'Minimal case, alternative casing, alternative statement end.' => [
  37. '<?php echo PHP_VERSION?>',
  38. '<?php echo PHPversion()?>',
  39. ],
  40. 'With embedded comment.' => [
  41. '<?php echo PHP_VERSION/**/?>',
  42. '<?php echo phpversion(/**/)?>',
  43. ],
  44. 'With white space.' => [
  45. '<?php echo PHP_VERSION ;',
  46. '<?php echo phpversion ( ) ;',
  47. ],
  48. 'With multi line whitespace.' => [
  49. '<?php echo
  50. PHP_VERSION
  51. '.'
  52. '.'
  53. ;',
  54. '<?php echo
  55. phpversion
  56. (
  57. )
  58. ;',
  59. ],
  60. 'Global namespaced.' => [
  61. '<?php echo \PHP_VERSION;',
  62. '<?php echo \phpversion();',
  63. ],
  64. 'Wrong number of arguments.' => [
  65. '<?php phpversion($a);',
  66. ],
  67. 'Wrong namespace.' => [
  68. '<?php A\B\phpversion();',
  69. ],
  70. 'Class creating.' => [
  71. '<?php new phpversion();',
  72. ],
  73. 'Class static method call.' => [
  74. '<?php A::phpversion();',
  75. ],
  76. 'Class method call.' => [
  77. '<?php $a->phpversion();',
  78. ],
  79. 'Overridden function.' => [
  80. '<?php if (!function_exists("phpversion")){function phpversion(){}}?>',
  81. ],
  82. 'phpversion only' => [
  83. '<?php echo PHP_VERSION; echo php_sapi_name(); echo pi();',
  84. '<?php echo phpversion(); echo php_sapi_name(); echo pi();',
  85. ['functions' => ['phpversion']],
  86. ],
  87. 'php_sapi_name only' => [
  88. '<?php echo phpversion(); echo PHP_SAPI; echo pi();',
  89. '<?php echo phpversion(); echo php_sapi_name(); echo pi();',
  90. ['functions' => ['php_sapi_name']],
  91. ],
  92. 'php_sapi_name in conditional' => [
  93. '<?php if ("cli" === PHP_SAPI && $a){ echo 123;}',
  94. '<?php if ("cli" === php_sapi_name() && $a){ echo 123;}',
  95. ['functions' => ['php_sapi_name']],
  96. ],
  97. 'pi only' => [
  98. '<?php echo phpversion(); echo php_sapi_name(); echo M_PI;',
  99. '<?php echo phpversion(); echo php_sapi_name(); echo pi();',
  100. ['functions' => ['pi']],
  101. ],
  102. 'multi line pi' => [
  103. '<?php
  104. $a =
  105. $b
  106. || $c < M_PI
  107. ;',
  108. '<?php
  109. $a =
  110. $b
  111. || $c < pi()
  112. ;',
  113. ['functions' => ['pi']],
  114. ],
  115. 'phpversion and pi' => [
  116. '<?php echo PHP_VERSION; echo php_sapi_name(); echo M_PI;',
  117. '<?php echo phpversion(); echo php_sapi_name(); echo M_PI;',
  118. ['functions' => ['pi', 'phpversion']],
  119. ],
  120. 'diff argument count than native allows' => [
  121. '<?php
  122. echo phpversion(1);
  123. echo php_sapi_name(1,2);
  124. echo pi(1);
  125. ',
  126. ],
  127. 'get_class => T_CLASS' => [
  128. '<?php
  129. class A
  130. {
  131. public function echoClassName($notMe)
  132. {
  133. echo get_class($notMe);
  134. echo __CLASS__/** 1 *//* 2 */;
  135. echo __CLASS__;
  136. }
  137. }
  138. trait A
  139. {
  140. public function A() {
  141. echo get_called_class(); // not in the default
  142. var_dump(__CLASS__);
  143. }
  144. }
  145. class B
  146. {
  147. use A;
  148. }
  149. ',
  150. '<?php
  151. class A
  152. {
  153. public function echoClassName($notMe)
  154. {
  155. echo get_class($notMe);
  156. echo get_class(/** 1 *//* 2 */);
  157. echo GET_Class();
  158. }
  159. }
  160. trait A
  161. {
  162. public function A() {
  163. echo get_called_class(); // not in the default
  164. var_dump(get_class());
  165. }
  166. }
  167. class B
  168. {
  169. use A;
  170. }
  171. ',
  172. ],
  173. 'get_class with leading backslash' => [
  174. '<?php __CLASS__;',
  175. '<?php \get_class();',
  176. ],
  177. [
  178. '<?php class A { function B(){ echo static::class; }}',
  179. '<?php class A { function B(){ echo get_called_class(); }}',
  180. ['functions' => ['get_called_class']],
  181. ],
  182. [
  183. '<?php class A { function B(){
  184. echo#.
  185. #0
  186. static::class#1
  187. #2
  188. #3
  189. #4
  190. #5
  191. #6
  192. ;#7
  193. }}
  194. ',
  195. '<?php class A { function B(){
  196. echo#.
  197. #0
  198. get_called_class#1
  199. #2
  200. (#3
  201. #4
  202. )#5
  203. #6
  204. ;#7
  205. }}
  206. ',
  207. ['functions' => ['get_called_class']],
  208. ],
  209. 'get_called_class with leading backslash' => [
  210. '<?php class A { function B(){echo static::class; }}',
  211. '<?php class A { function B(){echo \get_called_class(); }}',
  212. ['functions' => ['get_called_class']],
  213. ],
  214. 'get_called_class overridden' => [
  215. '<?php echo get_called_class(1);',
  216. null,
  217. ['functions' => ['get_called_class']],
  218. ],
  219. [
  220. '<?php class Foo{ public function Bar(){ echo static::class ; }}',
  221. '<?php class Foo{ public function Bar(){ echo get_class( $This ); }}',
  222. ['functions' => ['get_class_this']],
  223. ],
  224. [
  225. '<?php class Foo{ public function Bar(){ echo static::class; get_class(1, 2); get_class($a); get_class($a, $b);}}',
  226. '<?php class Foo{ public function Bar(){ echo get_class($this); get_class(1, 2); get_class($a); get_class($a, $b);}}',
  227. ['functions' => ['get_class_this']],
  228. ],
  229. [
  230. '<?php class Foo{ public function Bar(){ echo static::class /* 0 */ /* 1 */ ;}}',
  231. '<?php class Foo{ public function Bar(){ echo \get_class( /* 0 */ $this /* 1 */ );}}',
  232. ['functions' => ['get_class_this']],
  233. ],
  234. [
  235. '<?php class Foo{ public function Bar(){ echo static::class; echo __CLASS__; }}',
  236. '<?php class Foo{ public function Bar(){ echo \get_class((($this))); echo get_class(); }}',
  237. ['functions' => ['get_class_this', 'get_class']],
  238. ],
  239. [
  240. '<?php
  241. class Foo{ public function Bar(){ echo $reflection = new \ReflectionClass(get_class($this->extension)); }}
  242. class Foo{ public function Bar(){ echo $reflection = new \ReflectionClass(get_class($this() )); }}
  243. ',
  244. null,
  245. ['functions' => ['get_class_this']],
  246. ],
  247. ];
  248. }
  249. /**
  250. * @dataProvider provideInvalidConfigurationKeysCases
  251. */
  252. public function testInvalidConfigurationKeys(array $config)
  253. {
  254. $this->expectException(\PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException::class);
  255. $this->expectExceptionMessageRegExp('#^\[function_to_constant\] Invalid configuration: The option "functions" with value array is invalid\.$#');
  256. $this->fixer->configure($config);
  257. }
  258. public function provideInvalidConfigurationKeysCases()
  259. {
  260. return [
  261. [['functions' => ['a']]],
  262. [['functions' => [false => 1]]],
  263. [['functions' => ['abc' => true]]],
  264. ];
  265. }
  266. public function testInvalidConfigurationValue()
  267. {
  268. $this->expectException(\PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException::class);
  269. $this->expectExceptionMessageRegExp('#^\[function_to_constant\] Invalid configuration: The option "0" does not exist\. Defined options are: "functions"\.$#');
  270. $this->fixer->configure(['pi123']);
  271. }
  272. /**
  273. * @param string $expected
  274. * @param null|string $input
  275. *
  276. * @requires PHP 7.0
  277. * @dataProvider provideFix70Cases
  278. */
  279. public function testFix70($expected, $input = null)
  280. {
  281. $this->doTest($expected, $input);
  282. }
  283. public function provideFix70Cases()
  284. {
  285. return [
  286. [
  287. '<?php function &PHPversion(){} ?>',
  288. ],
  289. ];
  290. }
  291. }