TypeDeclarationSpacesFixerTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  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\Whitespace;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
  16. * @author John Paul E. Balandan, CPA <paulbalandan@gmail.com>
  17. *
  18. * @internal
  19. *
  20. * @covers \PhpCsFixer\Fixer\Whitespace\TypeDeclarationSpacesFixer
  21. */
  22. final class TypeDeclarationSpacesFixerTest extends AbstractFixerTestCase
  23. {
  24. /**
  25. * @dataProvider provideFixCases
  26. */
  27. public function testFix(string $expected, ?string $input = null): void
  28. {
  29. $this->doTest($expected, $input);
  30. }
  31. /**
  32. * @return iterable<array<int, null|string>>
  33. */
  34. public static function provideFixCases(): iterable
  35. {
  36. yield [
  37. '<?php function foo(bool /**bla bla*/$param) {}',
  38. '<?php function foo(bool/**bla bla*/$param) {}',
  39. ];
  40. yield [
  41. '<?php function foo(bool /**bla bla*/$param) {}',
  42. '<?php function foo(bool /**bla bla*/$param) {}',
  43. ];
  44. yield [
  45. '<?php function foo(callable $param) {}',
  46. '<?php function foo(callable$param) {}',
  47. ];
  48. yield [
  49. '<?php function foo(callable $param) {}',
  50. '<?php function foo(callable $param) {}',
  51. ];
  52. yield [
  53. '<?php function foo(array &$param) {}',
  54. '<?php function foo(array&$param) {}',
  55. ];
  56. yield [
  57. '<?php function foo(array &$param) {}',
  58. '<?php function foo(array &$param) {}',
  59. ];
  60. yield [
  61. '<?php function foo(array & $param) {}',
  62. '<?php function foo(array& $param) {}',
  63. ];
  64. yield [
  65. '<?php function foo(array & $param) {}',
  66. '<?php function foo(array & $param) {}',
  67. ];
  68. yield [
  69. '<?php function foo(Bar $param) {}',
  70. '<?php function foo(Bar$param) {}',
  71. ];
  72. yield [
  73. '<?php function foo(Bar $param) {}',
  74. '<?php function foo(Bar $param) {}',
  75. ];
  76. yield [
  77. '<?php function foo(Bar\Baz $param) {}',
  78. '<?php function foo(Bar\Baz$param) {}',
  79. ];
  80. yield [
  81. '<?php function foo(Bar\Baz $param) {}',
  82. '<?php function foo(Bar\Baz $param) {}',
  83. ];
  84. yield [
  85. '<?php function foo(Bar\Baz &$param) {}',
  86. '<?php function foo(Bar\Baz&$param) {}',
  87. ];
  88. yield [
  89. '<?php function foo(Bar\Baz &$param) {}',
  90. '<?php function foo(Bar\Baz &$param) {}',
  91. ];
  92. yield [
  93. '<?php function foo(Bar\Baz & $param) {}',
  94. '<?php function foo(Bar\Baz& $param) {}',
  95. ];
  96. yield [
  97. '<?php function foo(Bar\Baz & $param) {}',
  98. '<?php function foo(Bar\Baz & $param) {}',
  99. ];
  100. yield [
  101. '<?php $foo = function(Bar\Baz $param) {};',
  102. '<?php $foo = function(Bar\Baz$param) {};',
  103. ];
  104. yield [
  105. '<?php $foo = function(Bar\Baz $param) {};',
  106. '<?php $foo = function(Bar\Baz $param) {};',
  107. ];
  108. yield [
  109. '<?php $foo = function(Bar\Baz &$param) {};',
  110. '<?php $foo = function(Bar\Baz&$param) {};',
  111. ];
  112. yield [
  113. '<?php $foo = function(Bar\Baz &$param) {};',
  114. '<?php $foo = function(Bar\Baz &$param) {};',
  115. ];
  116. yield [
  117. '<?php $foo = function(Bar\Baz & $param) {};',
  118. '<?php $foo = function(Bar\Baz& $param) {};',
  119. ];
  120. yield [
  121. '<?php $foo = function(Bar\Baz & $param) {};',
  122. '<?php $foo = function(Bar\Baz & $param) {};',
  123. ];
  124. yield [
  125. '<?php class Test { public function foo(Bar\Baz $param) {} }',
  126. '<?php class Test { public function foo(Bar\Baz$param) {} }',
  127. ];
  128. yield [
  129. '<?php class Test { public function foo(Bar\Baz $param) {} }',
  130. '<?php class Test { public function foo(Bar\Baz $param) {} }',
  131. ];
  132. yield [
  133. '<?php $foo = function(array $a,
  134. array $b, array $c, array $d) {};',
  135. '<?php $foo = function(array $a,
  136. array$b, array $c, array
  137. $d) {};',
  138. ];
  139. yield [
  140. '<?php $foo = fn(Bar\Baz $param) => null;',
  141. '<?php $foo = fn(Bar\Baz$param) => null;',
  142. ];
  143. yield [
  144. '<?php $foo = fn(Bar\Baz $param) => null;',
  145. '<?php $foo = fn(Bar\Baz $param) => null;',
  146. ];
  147. yield [
  148. '<?php $foo = fn(Bar\Baz &$param) => null;',
  149. '<?php $foo = fn(Bar\Baz&$param) => null;',
  150. ];
  151. yield [
  152. '<?php $foo = fn(Bar\Baz &$param) => null;',
  153. '<?php $foo = fn(Bar\Baz &$param) => null;',
  154. ];
  155. yield [
  156. '<?php $foo = fn(Bar\Baz & $param) => null;',
  157. '<?php $foo = fn(Bar\Baz& $param) => null;',
  158. ];
  159. yield [
  160. '<?php $foo = fn(Bar\Baz & $param) => null;',
  161. '<?php $foo = fn(Bar\Baz & $param) => null;',
  162. ];
  163. yield [
  164. '<?php $foo = fn(array $a,
  165. array $b, array $c, array $d) => null;',
  166. '<?php $foo = fn(array $a,
  167. array$b, array $c, array
  168. $d) => null;',
  169. ];
  170. yield [
  171. '<?php function foo(array ...$param) {}',
  172. '<?php function foo(array...$param) {}',
  173. ];
  174. yield [
  175. '<?php function foo(array & ...$param) {}',
  176. '<?php function foo(array& ...$param) {}',
  177. ];
  178. yield [
  179. '<?php class Foo { public int $x; }',
  180. '<?php class Foo { public int$x; }',
  181. ];
  182. yield [
  183. '<?php class Foo { public bool $x; }',
  184. '<?php class Foo { public bool $x; }',
  185. ];
  186. yield [
  187. '<?php class Foo { protected \Bar\Baz $c; }',
  188. '<?php class Foo { protected \Bar\Baz$c; }',
  189. ];
  190. yield [
  191. '<?php class Foo { protected \Bar\Baz $c; }',
  192. '<?php class Foo { protected \Bar\Baz $c; }',
  193. ];
  194. yield [
  195. '<?php class Foo { private array $x; }',
  196. '<?php class Foo { private array$x; }',
  197. ];
  198. yield [
  199. '<?php class Foo { private array $x; }',
  200. '<?php class Foo { private array
  201. $x; }',
  202. ];
  203. yield [
  204. '<?php
  205. class Point
  206. {
  207. public \DateTime $x;
  208. protected bool $y = true;
  209. private array $z = [];
  210. public int $a = 0;
  211. protected string $b = \'\';
  212. private float $c = 0.0;
  213. }
  214. ',
  215. '<?php
  216. class Point
  217. {
  218. public \DateTime $x;
  219. protected bool $y = true;
  220. private array $z = [];
  221. public int $a = 0;
  222. protected string $b = \'\';
  223. private float $c = 0.0;
  224. }
  225. ',
  226. ];
  227. yield [
  228. '<?php function foo($param) {}',
  229. ];
  230. yield [
  231. '<?php function foo($param1,$param2) {}',
  232. ];
  233. yield [
  234. '<?php function foo(&$param) {}',
  235. ];
  236. yield [
  237. '<?php function foo(& $param) {}',
  238. ];
  239. yield [
  240. '<?php function foo(/**int*/$param) {}',
  241. ];
  242. yield [
  243. '<?php function foo(bool /**bla bla*/ $param) {}',
  244. ];
  245. yield [
  246. '<?php $foo = function(
  247. array $a,
  248. $b
  249. ) {};',
  250. ];
  251. yield [
  252. '<?php $foo = function(
  253. $a,
  254. array $b
  255. ) {};',
  256. ];
  257. yield [
  258. '<?php function foo(...$param) {}',
  259. ];
  260. yield [
  261. '<?php function foo(&...$param) {}',
  262. ];
  263. yield [
  264. '<?php use function some\test\{fn_a, fn_b, fn_c};',
  265. ];
  266. yield [
  267. '<?php use function some\test\{fn_a, fn_b, fn_c} ?>',
  268. ];
  269. yield [
  270. '<?php $foo = fn(
  271. array $a,
  272. $b
  273. ) => null;',
  274. ];
  275. yield [
  276. '<?php $foo = fn(
  277. $a,
  278. array $b
  279. ) => null;',
  280. ];
  281. yield [
  282. '<?php class Foo { public $p; }',
  283. ];
  284. yield [
  285. '<?php class Foo { protected /* int */ $a; }',
  286. ];
  287. yield [
  288. '<?php class Foo { private int $a; }',
  289. ];
  290. }
  291. /**
  292. * @dataProvider provideFixPhp80Cases
  293. *
  294. * @requires PHP 8.0
  295. */
  296. public function testFixPhp80(string $expected, string $input): void
  297. {
  298. $this->doTest($expected, $input);
  299. }
  300. /**
  301. * @return iterable<array<int, string>>
  302. */
  303. public static function provideFixPhp80Cases(): iterable
  304. {
  305. yield [
  306. '<?php function foo(mixed $a) {}',
  307. '<?php function foo(mixed$a) {}',
  308. ];
  309. yield [
  310. '<?php function foo(mixed $a) {}',
  311. '<?php function foo(mixed $a) {}',
  312. ];
  313. yield [
  314. '<?php
  315. class Foo
  316. {
  317. public function __construct(
  318. public int $a,
  319. protected bool $b,
  320. private Bar\Baz $c,
  321. ) {}
  322. }
  323. ',
  324. '<?php
  325. class Foo
  326. {
  327. public function __construct(
  328. public int $a,
  329. protected bool$b,
  330. private Bar\Baz $c,
  331. ) {}
  332. }
  333. ',
  334. ];
  335. }
  336. /**
  337. * @dataProvider provideFixPhp81Cases
  338. *
  339. * @requires PHP 8.1
  340. */
  341. public function testFixPhp81(string $expected, ?string $input = null): void
  342. {
  343. $this->doTest($expected, $input);
  344. }
  345. /**
  346. * @return iterable<array<int, string>>
  347. */
  348. public static function provideFixPhp81Cases(): iterable
  349. {
  350. yield [
  351. '<?php class Foo { private readonly int $bar; }',
  352. '<?php class Foo { private readonly int$bar; }',
  353. ];
  354. yield [
  355. '<?php class Foo { private readonly int $bar; }',
  356. '<?php class Foo { private readonly int $bar; }',
  357. ];
  358. }
  359. /**
  360. * @dataProvider provideFixPhp82Cases
  361. *
  362. * @requires PHP 8.2
  363. */
  364. public function testFixPhp82(string $expected, ?string $input = null): void
  365. {
  366. $this->doTest($expected, $input);
  367. }
  368. /**
  369. * @return iterable<array<int, string>>
  370. */
  371. public static function provideFixPhp82Cases(): iterable
  372. {
  373. yield [
  374. '<?php class Foo { public (A&B)|C $bar; }',
  375. '<?php class Foo { public (A&B)|C$bar; }',
  376. ];
  377. yield [
  378. '<?php class Foo { public (A&B)|C $bar; }',
  379. '<?php class Foo { public (A&B)|C $bar; }',
  380. ];
  381. }
  382. }