LambdaNotUsedImportFixerTest.php 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  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 static function provideFixCases(): iterable
  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. 'anonymous class with a string argument' => [
  105. '<?php $function = function () {
  106. new class("bar") {};
  107. };',
  108. '<?php $function = function () use ($foo) {
  109. new class("bar") {};
  110. };',
  111. ],
  112. ];
  113. }
  114. /**
  115. * @dataProvider provideDoNotFixCases
  116. */
  117. public function testDoNotFix(string $expected): void
  118. {
  119. $this->doTest($expected);
  120. }
  121. public static function provideDoNotFixCases(): iterable
  122. {
  123. yield 'reference' => [
  124. '<?php $fn = function() use(&$b) {} ?>',
  125. ];
  126. yield 'compact 1' => [
  127. '<?php $foo = function() use ($b) { return compact(\'b\'); };',
  128. ];
  129. yield 'compact 2' => [
  130. '<?php $foo = function() use ($b) { return \compact(\'b\'); };',
  131. ];
  132. yield 'eval' => [
  133. '<?php $foo = function($c) use ($b) { eval($c); };',
  134. ];
  135. yield 'include' => [
  136. '<?php $foo = function($c) use ($b) { include __DIR__."/test3.php"; };',
  137. ];
  138. yield 'include_once' => [
  139. '<?php $foo = function($c) use ($b) { include_once __DIR__."/test3.php"; };',
  140. ];
  141. yield 'require' => [
  142. '<?php $foo = function($c) use ($b) { require __DIR__."/test3.php"; };',
  143. ];
  144. yield 'require_once' => [
  145. '<?php $foo = function($c) use ($b) { require_once __DIR__."/test3.php"; };',
  146. ];
  147. yield '${X}' => [
  148. '<?php $foo = function($g) use ($b) { $h = ${$g}; };',
  149. ];
  150. yield '$$c' => [
  151. '<?php $foo = function($g) use ($b) { $h = $$g; };',
  152. ];
  153. yield 'interpolation 1' => [
  154. '<?php $foo = function() use ($world) { echo "hello $world"; };',
  155. ];
  156. yield 'interpolation 2' => [
  157. '<?php $foo = function() use ($world) { echo "hello {$world}"; };',
  158. ];
  159. yield 'interpolation 3' => [
  160. '<?php $foo = function() use ($world) { echo "hello ${world}"; };',
  161. ];
  162. yield 'heredoc' => [
  163. '<?php
  164. $b = 123;
  165. $foo = function() use ($b) {
  166. echo
  167. <<<"TEST"
  168. Foo $b
  169. TEST;
  170. };
  171. $foo();
  172. ',
  173. ];
  174. }
  175. /**
  176. * @dataProvider provideFix80Cases
  177. *
  178. * @requires PHP 8.0
  179. */
  180. public function testFix80(string $expected, string $input): void
  181. {
  182. $this->doTest($expected, $input);
  183. }
  184. public static function provideFix80Cases(): iterable
  185. {
  186. yield 'simple' => [
  187. '<?php $foo = function() {};',
  188. '<?php $foo = function() use ($bar,) {};',
  189. ];
  190. }
  191. }