StaticLambdaFixerTest.php 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  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\FunctionNotation;
  12. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  13. /**
  14. * @author SpacePossum
  15. *
  16. * @internal
  17. *
  18. * @covers \PhpCsFixer\Fixer\FunctionNotation\StaticLambdaFixer
  19. */
  20. final class StaticLambdaFixerTest extends AbstractFixerTestCase
  21. {
  22. /**
  23. * @param string $expected
  24. * @param string $input
  25. *
  26. * @dataProvider provideFixCases
  27. */
  28. public function testFix($expected, $input)
  29. {
  30. $this->doTest($expected, $input);
  31. }
  32. public function provideFixCases()
  33. {
  34. return [
  35. 'sample' => [
  36. "<?php\n\$a = static function () use (\$b)\n{ echo \$b;\n};",
  37. "<?php\n\$a = function () use (\$b)\n{ echo \$b;\n};",
  38. ],
  39. 'minimal double fix case' => [
  40. '<?php $a=static function(){};$b=static function(){};',
  41. '<?php $a=function(){};$b=function(){};',
  42. ],
  43. [
  44. '<?php $a /**/ = /**/ static function(){};',
  45. '<?php $a /**/ = /**/ function(){};',
  46. ],
  47. [
  48. '<?php $a /**/ = /**/ static function(){};',
  49. '<?php $a /**/ = /**/ function(){};',
  50. ],
  51. [
  52. '<?php $a /**/ = /**/static function(){};',
  53. '<?php $a /**/ = /**/function(){};',
  54. ],
  55. ];
  56. }
  57. /**
  58. * @param string $expected
  59. *
  60. * @dataProvider provideDoNotFixCases
  61. */
  62. public function testDoNotFix($expected)
  63. {
  64. $this->doTest($expected);
  65. }
  66. public function provideDoNotFixCases()
  67. {
  68. return [
  69. [
  70. '<?php
  71. class A
  72. {
  73. public function B()
  74. {
  75. $a = function () {
  76. $b = \'this\';
  77. var_dump($$b);
  78. };
  79. $a();
  80. }
  81. }
  82. ',
  83. ],
  84. [
  85. '<?php
  86. class B
  87. {
  88. public function C()
  89. {
  90. $a = function () {
  91. var_dump($THIS);
  92. };
  93. $a();
  94. }
  95. }
  96. ',
  97. ],
  98. [
  99. '<?php
  100. class D
  101. {
  102. public function E()
  103. {
  104. $a = function () {
  105. $c = include __DIR__.\'/return_this.php\';
  106. var_dump($c);
  107. };
  108. $a();
  109. }
  110. }
  111. ',
  112. ],
  113. [
  114. '<?php
  115. class F
  116. {
  117. public function G()
  118. {
  119. $a = function () {
  120. $d = include_once __DIR__.\'/return_this.php\';
  121. var_dump($d);
  122. };
  123. $a();
  124. }
  125. }
  126. ',
  127. ],
  128. [
  129. '<?php
  130. class H
  131. {
  132. public function I()
  133. {
  134. $a = function () {
  135. $e = require_once __DIR__.\'/return_this.php\';
  136. var_dump($e);
  137. };
  138. $a();
  139. }
  140. }
  141. ',
  142. ],
  143. [
  144. '<?php
  145. class J
  146. {
  147. public function K()
  148. {
  149. $a = function () {
  150. $f = require __DIR__.\'/return_this.php\';
  151. var_dump($f);
  152. };
  153. $a();
  154. }
  155. }
  156. ',
  157. ],
  158. [
  159. '<?php
  160. class L
  161. {
  162. public function M()
  163. {
  164. $a = function () {
  165. $g = \'this\';
  166. $h = ${$g};
  167. var_dump($h);
  168. };
  169. $a();
  170. }
  171. }
  172. ',
  173. ],
  174. [
  175. '<?php
  176. class N
  177. {
  178. public function O()
  179. {
  180. $a = function () {
  181. $a = [0 => \'this\'];
  182. var_dump(${$a[0]});
  183. };
  184. }
  185. }
  186. ',
  187. ],
  188. [
  189. '<?php function test(){} test();',
  190. ],
  191. [
  192. '<?php abstract class P
  193. {
  194. function test0(){}
  195. public function test1(){}
  196. protected function test2(){}
  197. protected abstract function test3();
  198. private function test4(){}
  199. }
  200. ',
  201. ],
  202. [
  203. '<?php
  204. class Q
  205. {
  206. public function abc()
  207. {
  208. $b = function () {
  209. $c = eval(\'return $this;\');
  210. var_dump($c);
  211. };
  212. $b();
  213. }
  214. }
  215. $b = new Q();
  216. $b->abc();
  217. ',
  218. ],
  219. ];
  220. }
  221. /**
  222. * @param string $expected
  223. * @param null|string $input
  224. *
  225. * @dataProvider provideFixPhp74Cases
  226. * @requires PHP 7.4
  227. */
  228. public function testFixPhp74($expected, $input = null)
  229. {
  230. $this->doTest($expected, $input);
  231. }
  232. public function provideFixPhp74Cases()
  233. {
  234. return [
  235. [
  236. '<?php $a=static fn() => null;$b=static fn() => null;',
  237. '<?php $a=fn() => null;$b=fn() => null;',
  238. ],
  239. [
  240. '<?php $a /**/ = /**/ static fn() => null;',
  241. '<?php $a /**/ = /**/ fn() => null;',
  242. ],
  243. [
  244. '<?php $a /**/ = /**/ static fn() => null;',
  245. '<?php $a /**/ = /**/ fn() => null;',
  246. ],
  247. [
  248. '<?php $a /**/ = /**/static fn() => null; echo $this->foo();',
  249. '<?php $a /**/ = /**/fn() => null; echo $this->foo();',
  250. ],
  251. [
  252. '<?php $a /**/ = /**/ static fn() => null ?> <?php echo $this->foo();',
  253. '<?php $a /**/ = /**/ fn() => null ?> <?php echo $this->foo();',
  254. ],
  255. [
  256. '<?php
  257. class B
  258. {
  259. public function C()
  260. {
  261. $a = fn () => var_dump($this);
  262. $a();
  263. }
  264. }
  265. ',
  266. ],
  267. [
  268. '<?php static fn($a = ["foo" => "bar"]) => [];',
  269. '<?php fn($a = ["foo" => "bar"]) => [];',
  270. ],
  271. [
  272. '<?php class Foo {
  273. public function getNames()
  274. {
  275. return \array_map(
  276. static fn ($item) => $item->getName(),
  277. $this->getItems()
  278. );
  279. }
  280. }',
  281. '<?php class Foo {
  282. public function getNames()
  283. {
  284. return \array_map(
  285. fn ($item) => $item->getName(),
  286. $this->getItems()
  287. );
  288. }
  289. }',
  290. ],
  291. [
  292. '<?php class Foo {
  293. public function getNames()
  294. {
  295. return \array_map(
  296. fn ($item) => $item->getName(1, $this->foo()),
  297. $this->getItems()
  298. );
  299. }
  300. }',
  301. ],
  302. ];
  303. }
  304. }