LambdaNotUsedImportFixerTest.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  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\LambdaNotUsedImportFixer
  19. */
  20. final class LambdaNotUsedImportFixerTest 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. 'simple' => [
  36. '<?php $foo = function() {};',
  37. '<?php $foo = function() use ($bar) {};',
  38. ],
  39. 'simple, one of two' => [
  40. '<?php $foo = function & () use ( $foo) { echo $foo; };',
  41. '<?php $foo = function & () use ($bar, $foo) { echo $foo; };',
  42. ],
  43. 'simple, one used, one reference, two not used' => [
  44. '<?php $foo = function() use ($bar, &$foo ) { echo $bar; };',
  45. '<?php $foo = function() use ($bar, &$foo, $not1, $not2) { echo $bar; };',
  46. ],
  47. 'simple, but witch comments' => [
  48. '<?php $foo = function()
  49. # 1
  50. #2
  51. # 3
  52. #4
  53. # 5
  54. #6
  55. {};',
  56. '<?php $foo = function()
  57. use
  58. # 1
  59. ( #2
  60. # 3
  61. $bar #4
  62. # 5
  63. ) #6
  64. {};',
  65. ],
  66. 'nested lambda I' => [
  67. '<?php
  68. $f = function() {
  69. return function ($d) use ($c) {
  70. $b = 1; echo $c;
  71. };
  72. };
  73. ',
  74. '<?php
  75. $f = function() use ($b) {
  76. return function ($d) use ($c) {
  77. $b = 1; echo $c;
  78. };
  79. };
  80. ',
  81. ],
  82. 'nested lambda II' => [
  83. '<?php
  84. // do not fix
  85. $f = function() use ($a) { return function() use ($a) { return function() use ($a) { return function() use ($a) { echo $a; }; }; }; };
  86. $f = function() use ($b) { return function($b) { return function($b) { return function($b) { echo $b; }; }; }; };
  87. // do fix
  88. $f = function() { return function() { return function() { return function() { }; }; }; };
  89. ',
  90. '<?php
  91. // do not fix
  92. $f = function() use ($a) { return function() use ($a) { return function() use ($a) { return function() use ($a) { echo $a; }; }; }; };
  93. $f = function() use ($b) { return function($b) { return function($b) { return function($b) { echo $b; }; }; }; };
  94. // do fix
  95. $f = function() use ($a) { return function() use ($a) { return function() use ($a) { return function() use ($a) { }; }; }; };
  96. ',
  97. ],
  98. ];
  99. }
  100. /**
  101. * @param string $expected
  102. * @param null|string $input
  103. *
  104. * @requires PHP 7.0
  105. * @dataProvider providePhp70Cases
  106. */
  107. public function testFixPhp70($expected, $input = null)
  108. {
  109. $this->doTest($expected, $input);
  110. }
  111. public function providePhp70Cases()
  112. {
  113. return [
  114. 'anonymous class' => [
  115. '<?php
  116. $a = function() use ($b) { new class($b){}; }; // do not fix
  117. $a = function() { new class(){ public function foo($b){echo $b;}}; }; // do fix
  118. ',
  119. '<?php
  120. $a = function() use ($b) { new class($b){}; }; // do not fix
  121. $a = function() use ($b) { new class(){ public function foo($b){echo $b;}}; }; // do fix
  122. ',
  123. ],
  124. ];
  125. }
  126. /**
  127. * @param string $expected
  128. *
  129. * @dataProvider provideDoNotFixCases
  130. */
  131. public function testDoNotFix($expected)
  132. {
  133. $this->doTest($expected);
  134. }
  135. public function provideDoNotFixCases()
  136. {
  137. $tests = [
  138. 'reference' => [
  139. '<?php $fn = function() use(&$b) {} ?>',
  140. ],
  141. 'compact 1' => [
  142. '<?php $foo = function() use ($b) { return compact(\'b\'); };',
  143. ],
  144. 'compact 2' => [
  145. '<?php $foo = function() use ($b) { return \compact(\'b\'); };',
  146. ],
  147. 'eval' => [
  148. '<?php $foo = function($c) use ($b) { eval($c); };',
  149. ],
  150. 'include' => [
  151. '<?php $foo = function($c) use ($b) { include __DIR__."/test3.php"; };',
  152. ],
  153. 'include_once' => [
  154. '<?php $foo = function($c) use ($b) { include_once __DIR__."/test3.php"; };',
  155. ],
  156. 'require' => [
  157. '<?php $foo = function($c) use ($b) { require __DIR__."/test3.php"; };',
  158. ],
  159. 'require_once' => [
  160. '<?php $foo = function($c) use ($b) { require_once __DIR__."/test3.php"; };',
  161. ],
  162. '${X}' => [
  163. '<?php $foo = function($g) use ($b) { $h = ${$g}; };',
  164. ],
  165. '$$c' => [
  166. '<?php $foo = function($g) use ($b) { $h = $$g; };',
  167. ],
  168. 'interpolation 1' => [
  169. '<?php $foo = function() use ($world) { echo "hello $world"; };',
  170. ],
  171. 'interpolation 2' => [
  172. '<?php $foo = function() use ($world) { echo "hello {$world}"; };',
  173. ],
  174. 'interpolation 3' => [
  175. '<?php $foo = function() use ($world) { echo "hello ${world}"; };',
  176. ],
  177. 'heredoc' => [
  178. '<?php
  179. $b = 123;
  180. $foo = function() use ($b) {
  181. echo
  182. <<<"TEST"
  183. Foo $b
  184. TEST;
  185. };
  186. $foo();
  187. ',
  188. ],
  189. ];
  190. foreach ($tests as $index => $test) {
  191. yield $index => $test;
  192. }
  193. if (\PHP_VERSION_ID < 70100) {
  194. yield 'super global, invalid from PHP7.1' => [
  195. '<?php $fn = function() use($_COOKIE) {} ?>',
  196. ];
  197. yield 'super global' => [
  198. '<?php $foo = function($c) use ($_COOKIE) {};',
  199. ];
  200. }
  201. }
  202. /**
  203. * @param string $expected
  204. * @param string $input
  205. *
  206. * @dataProvider provideFix80Cases
  207. * @requires PHP 8.0
  208. */
  209. public function testFix80($expected, $input)
  210. {
  211. $this->doTest($expected, $input);
  212. }
  213. public function provideFix80Cases()
  214. {
  215. yield 'simple' => [
  216. '<?php $foo = function() {};',
  217. '<?php $foo = function() use ($bar,) {};',
  218. ];
  219. }
  220. }