NoTrailingCommaInSinglelineFunctionCallFixerTest.php 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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\NoTrailingCommaInSinglelineFunctionCallFixer
  18. */
  19. final class NoTrailingCommaInSinglelineFunctionCallFixerTest extends AbstractFixerTestCase
  20. {
  21. /**
  22. * @dataProvider provideFixCases
  23. */
  24. public function testFix(string $expected, string $input = null): void
  25. {
  26. $this->doTest($expected, $input);
  27. }
  28. public static function provideFixCases(): iterable
  29. {
  30. yield 'simple var' => [
  31. '<?php $a(1);',
  32. '<?php $a(1,);',
  33. ];
  34. yield '&' => [
  35. '<?php $a = &foo($a);',
  36. '<?php $a = &foo($a,);',
  37. ];
  38. yield 'open' => [
  39. '<?php foo($a);',
  40. '<?php foo($a,);',
  41. ];
  42. yield '=' => [
  43. '<?php $b = foo($a);',
  44. '<?php $b = foo($a,);',
  45. ];
  46. yield '.' => [
  47. '<?php $c = $b . foo($a);',
  48. '<?php $c = $b . foo($a,);',
  49. ];
  50. yield '(' => [
  51. '<?php (foo($a/* 1 */ /* 2 */ ));',
  52. '<?php (foo($a /* 1 */ , /* 2 */ ));',
  53. ];
  54. yield '\\' => [
  55. '<?php \foo($a);',
  56. '<?php \foo($a,);',
  57. ];
  58. yield 'A\\' => [
  59. '<?php A\foo($a);',
  60. '<?php A\foo($a,);',
  61. ];
  62. yield '\A\\' => [
  63. '<?php \A\foo($a);',
  64. '<?php \A\foo($a,);',
  65. ];
  66. yield ';' => [
  67. '<?php ; foo($a);',
  68. '<?php ; foo($a,);',
  69. ];
  70. yield '}' => [
  71. '<?php if ($a) { echo 1;} foo($a);',
  72. '<?php if ($a) { echo 1;} foo($a,);',
  73. ];
  74. yield 'test method call' => [
  75. '<?php $o->abc($a);',
  76. '<?php $o->abc($a,);',
  77. ];
  78. yield 'nested call' => [
  79. '<?php $o->abc($a,foo(1));',
  80. '<?php $o->abc($a,foo(1,));',
  81. ];
  82. yield 'wrapped' => [
  83. '<?php echo (new Process())->getOutput(1);',
  84. '<?php echo (new Process())->getOutput(1,);',
  85. ];
  86. yield 'dynamic function and method calls' => [
  87. '<?php $b->$a(1); $c("");',
  88. '<?php $b->$a(1,); $c("",);',
  89. ];
  90. yield 'static function call' => [
  91. '<?php
  92. unset($foo->bar);
  93. $b = isset($foo->bar);
  94. list($a,$b) = $a;
  95. ',
  96. '<?php
  97. unset($foo->bar,);
  98. $b = isset($foo->bar,);
  99. list($a,$b,) = $a;
  100. ',
  101. ];
  102. yield 'unset' => [
  103. '<?php A::foo(1);',
  104. '<?php A::foo(1,);',
  105. ];
  106. yield 'anonymous_class construction' => [
  107. '<?php new class(1, 2) {};',
  108. '<?php new class(1, 2,) {};',
  109. ];
  110. yield 'array/property access call' => [
  111. '<?php
  112. $a = [
  113. "e" => static function(int $a): void{ echo $a;},
  114. "d" => [
  115. [2 => static function(int $a): void{ echo $a;}]
  116. ]
  117. ];
  118. $a["e"](1);
  119. $a["d"][0][2](1);
  120. $z = new class { public static function b(int $a): void {echo $a; }};
  121. $z::b(1);
  122. ${$e}(1);
  123. $$e(2);
  124. $f(0)(1);
  125. $g["e"](1); // foo',
  126. '<?php
  127. $a = [
  128. "e" => static function(int $a): void{ echo $a;},
  129. "d" => [
  130. [2 => static function(int $a): void{ echo $a;}]
  131. ]
  132. ];
  133. $a["e"](1,);
  134. $a["d"][0][2](1,);
  135. $z = new class { public static function b(int $a): void {echo $a; }};
  136. $z::b(1,);
  137. ${$e}(1,);
  138. $$e(2,);
  139. $f(0,)(1,);
  140. $g["e"](1,); // foo',
  141. ];
  142. yield 'do not fix' => [
  143. '<?php
  144. function someFunction ($p1){}
  145. function & foo($a,$b): array { return []; }
  146. foo (
  147. 1,
  148. 2,
  149. );
  150. $a = new class (
  151. $a,
  152. ) {};
  153. isset($a, $b);
  154. unset($a,$b);
  155. list($a,$b) = $a;
  156. $a = [1,2,3,];
  157. $a = array(1,2,3,);
  158. function foo1(string $param = null ): void
  159. {
  160. }
  161. ;',
  162. ];
  163. }
  164. /**
  165. * @dataProvider provideFix80Cases
  166. *
  167. * @requires PHP 8.0
  168. */
  169. public function testFix80(string $expected, string $input = null): void
  170. {
  171. $this->doTest($expected, $input);
  172. }
  173. public static function provideFix80Cases(): iterable
  174. {
  175. yield [
  176. '<?php function foo(
  177. #[MyAttr(1, 2,)] Type $myParam,
  178. ) {}
  179. $foo1b = function() use ($bar, ) {};
  180. ',
  181. ];
  182. }
  183. /**
  184. * @dataProvider provideFix81Cases
  185. *
  186. * @requires PHP 8.1
  187. */
  188. public function testFix81(string $expected, ?string $input = null): void
  189. {
  190. $this->doTest($expected, $input);
  191. }
  192. public static function provideFix81Cases(): iterable
  193. {
  194. yield [
  195. '<?php $object?->method(1); strlen(...);',
  196. '<?php $object?->method(1,); strlen(...);',
  197. ];
  198. }
  199. }