LambdaNotUsedImportFixerTest.php 6.2 KB

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