NoAliasFunctionsFixerTest.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <?php
  2. declare(strict_types=1);
  3. /*
  4. * This file is part of PHP CS Fixer.
  5. *
  6. * (c) Fabien Potencier <fabien@symfony.com>
  7. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  8. *
  9. * This source file is subject to the MIT license that is bundled
  10. * with this source code in the file LICENSE.
  11. */
  12. namespace PhpCsFixer\Tests\Fixer\Alias;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author Vladimir Reznichenko <kalessil@gmail.com>
  16. * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
  17. *
  18. * @internal
  19. *
  20. * @covers \PhpCsFixer\Fixer\Alias\NoAliasFunctionsFixer
  21. */
  22. final class NoAliasFunctionsFixerTest extends AbstractFixerTestCase
  23. {
  24. /**
  25. * @dataProvider provideFixCases
  26. */
  27. public function testFix(string $expected, ?string $input = null): void
  28. {
  29. $this->doTest($expected, $input);
  30. }
  31. public static function provideFixCases(): iterable
  32. {
  33. $defaultSets = [
  34. '@internal',
  35. '@IMAP',
  36. '@pg',
  37. ];
  38. foreach (self::provideAllCases() as $set => $cases) {
  39. if (\in_array($set, $defaultSets, true)) {
  40. yield from $cases;
  41. } else {
  42. foreach ($cases as $case) {
  43. yield [$case[0]];
  44. }
  45. }
  46. }
  47. // static case to fix - in case previous generation is broken
  48. yield [
  49. '<?php is_int($a);',
  50. '<?php is_integer($a);',
  51. ];
  52. yield [
  53. '<?php socket_set_option($a, $b, $c, $d);',
  54. '<?php socket_setopt($a, $b, $c, $d);',
  55. ];
  56. yield 'dns -> mxrr' => [
  57. '<?php getmxrr();',
  58. '<?php dns_get_mx();',
  59. ];
  60. yield [
  61. '<?php $b=is_int(count(implode($b,$a)));',
  62. '<?php $b=is_integer(sizeof(join($b,$a)));',
  63. ];
  64. yield [
  65. '<?php
  66. interface JoinInterface
  67. {
  68. public function &join();
  69. }
  70. abstract class A
  71. {
  72. abstract public function join($a);
  73. public function is_integer($a)
  74. {
  75. $fputs = "is_double(\$a);\n"; // key_exists($b, $c);
  76. echo $fputs."\$is_writable";
  77. \B::close();
  78. Scope\is_long();
  79. namespace\is_long();
  80. $a->pos();
  81. new join();
  82. new \join();
  83. new ScopeB\join(mt_rand(0, 100));
  84. }
  85. }',
  86. ];
  87. }
  88. /**
  89. * @param array<string, string[]> $configuration
  90. *
  91. * @dataProvider provideFixWithConfigurationCases
  92. */
  93. public function testFixWithConfiguration(string $expected, ?string $input, array $configuration): void
  94. {
  95. $this->fixer->configure($configuration);
  96. $this->doTest($expected, $input);
  97. }
  98. public static function provideFixWithConfigurationCases(): iterable
  99. {
  100. yield '@internal' => [
  101. '<?php
  102. $a = rtrim($b);
  103. $a = imap_header($imap_stream, 1);
  104. mbereg_search_getregs();
  105. ',
  106. '<?php
  107. $a = chop($b);
  108. $a = imap_header($imap_stream, 1);
  109. mbereg_search_getregs();
  110. ',
  111. ['sets' => ['@internal']],
  112. ];
  113. yield '@IMAP' => [
  114. '<?php
  115. $a = chop($b);
  116. $a = imap_headerinfo($imap_stream, 1);
  117. mb_ereg_search_getregs();
  118. ',
  119. '<?php
  120. $a = chop($b);
  121. $a = imap_header($imap_stream, 1);
  122. mb_ereg_search_getregs();
  123. ',
  124. ['sets' => ['@IMAP']],
  125. ];
  126. yield '@mbreg' => [
  127. '<?php
  128. $a = chop($b);
  129. $a = imap_header($imap_stream, 1);
  130. mb_ereg_search_getregs();
  131. mktime();
  132. ',
  133. '<?php
  134. $a = chop($b);
  135. $a = imap_header($imap_stream, 1);
  136. mbereg_search_getregs();
  137. mktime();
  138. ',
  139. ['sets' => ['@mbreg']],
  140. ];
  141. yield '@all' => [
  142. '<?php
  143. $a = rtrim($b);
  144. $a = imap_headerinfo($imap_stream, 1);
  145. mb_ereg_search_getregs();
  146. time();
  147. time();
  148. $foo = exif_read_data($filename, $sections_needed, $sub_arrays, $read_thumbnail);
  149. mktime($a);
  150. echo gmmktime(1, 2, 3, 4, 5, 6);
  151. ',
  152. '<?php
  153. $a = chop($b);
  154. $a = imap_header($imap_stream, 1);
  155. mbereg_search_getregs();
  156. mktime();
  157. gmmktime();
  158. $foo = read_exif_data($filename, $sections_needed, $sub_arrays, $read_thumbnail);
  159. mktime($a);
  160. echo gmmktime(1, 2, 3, 4, 5, 6);
  161. ',
  162. ['sets' => ['@all']],
  163. ];
  164. yield '@IMAP, @mbreg' => [
  165. '<?php
  166. $a = chop($b);
  167. $a = imap_headerinfo($imap_stream, 1);
  168. mb_ereg_search_getregs();
  169. ',
  170. '<?php
  171. $a = chop($b);
  172. $a = imap_header($imap_stream, 1);
  173. mbereg_search_getregs();
  174. ',
  175. ['sets' => ['@IMAP', '@mbreg']],
  176. ];
  177. yield '@time' => [
  178. '<?php
  179. time();
  180. time();
  181. MKTIME($A);
  182. ECHO GMMKTIME(1, 2, 3, 4, 5, 6);
  183. ',
  184. '<?php
  185. MKTIME();
  186. GMMKTIME();
  187. MKTIME($A);
  188. ECHO GMMKTIME(1, 2, 3, 4, 5, 6);
  189. ',
  190. ['sets' => ['@time']],
  191. ];
  192. yield '@exif' => [
  193. '<?php
  194. $foo = exif_read_data($filename, $sections_needed, $sub_arrays, $read_thumbnail);
  195. ',
  196. '<?php
  197. $foo = read_exif_data($filename, $sections_needed, $sub_arrays, $read_thumbnail);
  198. ',
  199. ['sets' => ['@exif']],
  200. ];
  201. foreach (self::provideAllCases() as $set => $cases) {
  202. foreach ($cases as $case) {
  203. yield [
  204. $case[0],
  205. $case[1] ?? null,
  206. ['sets' => [$set]],
  207. ];
  208. }
  209. }
  210. }
  211. /**
  212. * @dataProvider provideFix81Cases
  213. *
  214. * @requires PHP 8.1
  215. */
  216. public function testFix81(string $expected, ?string $input = null): void
  217. {
  218. $this->doTest($expected, $input);
  219. }
  220. public static function provideFix81Cases(): iterable
  221. {
  222. yield 'simple 8.1' => [
  223. '<?php $a = is_double(...);',
  224. ];
  225. }
  226. private static function provideAllCases(): iterable
  227. {
  228. $reflectionConstant = new \ReflectionClassConstant(\PhpCsFixer\Fixer\Alias\NoAliasFunctionsFixer::class, 'SETS');
  229. /** @var array<string, string[]> $allAliases */
  230. $allAliases = $reflectionConstant->getValue();
  231. $sets = $allAliases;
  232. unset($sets['@time']); // Tested manually
  233. $sets = array_keys($sets);
  234. foreach ($sets as $set) {
  235. $aliases = $allAliases[$set];
  236. $cases = [];
  237. foreach ($aliases as $alias => $master) {
  238. // valid cases
  239. $cases[] = ["<?php \$smth->{$alias}(\$a);"];
  240. $cases[] = ["<?php {$alias}Smth(\$a);"];
  241. $cases[] = ["<?php smth_{$alias}(\$a);"];
  242. $cases[] = ["<?php new {$alias}(\$a);"];
  243. $cases[] = ["<?php new Smth\\{$alias}(\$a);"];
  244. $cases[] = ["<?php Smth\\{$alias}(\$a);"];
  245. $cases[] = ["<?php namespace\\{$alias}(\$a);"];
  246. $cases[] = ["<?php Smth::{$alias}(\$a);"];
  247. $cases[] = ["<?php new {$alias}\\smth(\$a);"];
  248. $cases[] = ["<?php {$alias}::smth(\$a);"];
  249. $cases[] = ["<?php {$alias}\\smth(\$a);"];
  250. $cases[] = ['<?php "SELECT ... '.$alias.'(\$a) ...";'];
  251. $cases[] = ['<?php "SELECT ... '.strtoupper($alias).'($a) ...";'];
  252. $cases[] = ["<?php 'test'.'{$alias}' . 'in concatenation';"];
  253. $cases[] = ['<?php "test" . "'.$alias.'"."in concatenation";'];
  254. $cases[] = [
  255. '<?php
  256. class '.ucfirst($alias).'ing
  257. {
  258. const '.$alias.' = 1;
  259. public function '.$alias.'($'.$alias.')
  260. {
  261. if (defined("'.$alias.'") || $'.$alias.' instanceof '.$alias.') {
  262. echo '.$alias.';
  263. }
  264. }
  265. }
  266. class '.$alias.' extends '.ucfirst($alias).'ing{
  267. const '.$alias.' = "'.$alias.'";
  268. }
  269. ',
  270. ];
  271. // cases to be fixed
  272. $cases[] = [
  273. "<?php {$master}(\$a);",
  274. "<?php {$alias}(\$a);",
  275. ];
  276. $cases[] = [
  277. "<?php \\{$master}(\$a);",
  278. "<?php \\{$alias}(\$a);",
  279. ];
  280. $cases[] = [
  281. "<?php {$master}
  282. (\$a);",
  283. "<?php {$alias}
  284. (\$a);",
  285. ];
  286. $cases[] = [
  287. "<?php /* foo */ {$master} /** bar */ (\$a);",
  288. "<?php /* foo */ {$alias} /** bar */ (\$a);",
  289. ];
  290. $cases[] = [
  291. "<?php a({$master}());",
  292. "<?php a({$alias}());",
  293. ];
  294. $cases[] = [
  295. "<?php a(\\{$master}());",
  296. "<?php a(\\{$alias}());",
  297. ];
  298. }
  299. yield $set => $cases;
  300. }
  301. }
  302. }