LambdaNotUsedImportFixerTest.php 5.8 KB

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