PhpdocTypesOrderFixerTest.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604
  1. <?php
  2. /*
  3. * This file is part of PHP CS Fixer.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  7. *
  8. * This source file is subject to the MIT license that is bundled
  9. * with this source code in the file LICENSE.
  10. */
  11. namespace PhpCsFixer\Tests\Fixer\Phpdoc;
  12. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  13. /**
  14. * @internal
  15. *
  16. * @covers \PhpCsFixer\Fixer\Phpdoc\PhpdocTypesOrderFixer
  17. */
  18. final class PhpdocTypesOrderFixerTest extends AbstractFixerTestCase
  19. {
  20. /**
  21. * @param string $expected
  22. * @param null|string $input
  23. *
  24. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases
  25. */
  26. public function testFix($expected, $input = null)
  27. {
  28. $this->doTest($expected, $input);
  29. }
  30. /**
  31. * @param string $expected
  32. * @param null|string $input
  33. *
  34. * @dataProvider provideFixCases
  35. */
  36. public function testFixWithNullFirst($expected, $input = null)
  37. {
  38. $this->fixer->configure([
  39. 'sort_algorithm' => 'none',
  40. 'null_adjustment' => 'always_first',
  41. ]);
  42. $this->doTest($expected, $input);
  43. }
  44. public function provideFixCases()
  45. {
  46. return [
  47. [
  48. '<?php /** @var null|string */',
  49. '<?php /** @var string|null */',
  50. ],
  51. [
  52. '<?php /** @param null|string $foo */',
  53. '<?php /** @param string|null $foo */',
  54. ],
  55. [
  56. '<?php /** @property null|string $foo */',
  57. '<?php /** @property string|null $foo */',
  58. ],
  59. [
  60. '<?php /** @property-read null|string $foo */',
  61. '<?php /** @property-read string|null $foo */',
  62. ],
  63. [
  64. '<?php /** @property-write null|string $foo */',
  65. '<?php /** @property-write string|null $foo */',
  66. ],
  67. [
  68. '<?php /** @method null|string foo(null|int $foo, null|string $bar) */',
  69. '<?php /** @method string|null foo(int|null $foo, string|null $bar) */',
  70. ],
  71. [
  72. '<?php /** @return null|string */',
  73. '<?php /** @return string|null */',
  74. ],
  75. [
  76. '<?php /** @var null|string[]|resource|false|object|Foo|Bar\Baz|bool[]|string|array|int */',
  77. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  78. ],
  79. [
  80. '<?php /** @var null|array<int, string> Foo */',
  81. '<?php /** @var array<int, string>|null Foo */',
  82. ],
  83. [
  84. '<?php /** @var null|array<int, array<string>> Foo */',
  85. '<?php /** @var array<int, array<string>>|null Foo */',
  86. ],
  87. [
  88. '<?php /** @var NULL|string */',
  89. '<?php /** @var string|NULL */',
  90. ],
  91. [
  92. '<?php /** @var Foo|?Bar */',
  93. ],
  94. [
  95. '<?php /** @var ?Foo|Bar */',
  96. ],
  97. [
  98. '<?php /** @var array<null|string> */',
  99. '<?php /** @var array<string|null> */',
  100. ],
  101. [
  102. '<?php /** @var array<int, null|string> */',
  103. '<?php /** @var array<int, string|null> */',
  104. ],
  105. [
  106. '<?php /** @var array<int, array<null|int|string>> */',
  107. '<?php /** @var array<int, array<int|string|null>> */',
  108. ],
  109. [
  110. '<?php /** @var null|null */',
  111. ],
  112. [
  113. '<?php /** @var null|\null */',
  114. ],
  115. [
  116. '<?php /** @var \null|null */',
  117. ],
  118. [
  119. '<?php /** @var \null|\null */',
  120. ],
  121. [
  122. '<?php /** @var \null|int */',
  123. '<?php /** @var int|\null */',
  124. ],
  125. [
  126. '<?php /** @var array<\null|int> */',
  127. '<?php /** @var array<int|\null> */',
  128. ],
  129. [
  130. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  131. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  132. ],
  133. [
  134. '<?php /** @var null|Foo[]|Foo|Foo\Bar|Foo_Bar */',
  135. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  136. ],
  137. ];
  138. }
  139. /**
  140. * @param string $expected
  141. * @param null|string $input
  142. *
  143. * @dataProvider provideFixWithNullLastCases
  144. */
  145. public function testFixWithNullLast($expected, $input = null)
  146. {
  147. $this->fixer->configure([
  148. 'sort_algorithm' => 'none',
  149. 'null_adjustment' => 'always_last',
  150. ]);
  151. $this->doTest($expected, $input);
  152. }
  153. public function provideFixWithNullLastCases()
  154. {
  155. return [
  156. [
  157. '<?php /** @var string|null */',
  158. '<?php /** @var null|string */',
  159. ],
  160. [
  161. '<?php /** @param string|null $foo */',
  162. '<?php /** @param null|string $foo */',
  163. ],
  164. [
  165. '<?php /** @property string|null $foo */',
  166. '<?php /** @property null|string $foo */',
  167. ],
  168. [
  169. '<?php /** @property-read string|null $foo */',
  170. '<?php /** @property-read null|string $foo */',
  171. ],
  172. [
  173. '<?php /** @property-write string|null $foo */',
  174. '<?php /** @property-write null|string $foo */',
  175. ],
  176. [
  177. '<?php /** @method string|null foo(int|null $foo, string|null $bar) */',
  178. '<?php /** @method null|string foo(null|int $foo, null|string $bar) */',
  179. ],
  180. [
  181. '<?php /** @return string|null */',
  182. '<?php /** @return null|string */',
  183. ],
  184. [
  185. '<?php /** @var string[]|resource|false|object|Foo|Bar\Baz|bool[]|string|array|int|null */',
  186. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  187. ],
  188. [
  189. '<?php /** @var array<int, string>|null Foo */',
  190. '<?php /** @var null|array<int, string> Foo */',
  191. ],
  192. [
  193. '<?php /** @var array<int, array<string>>|null Foo */',
  194. '<?php /** @var null|array<int, array<string>> Foo */',
  195. ],
  196. [
  197. '<?php /** @var string|NULL */',
  198. '<?php /** @var NULL|string */',
  199. ],
  200. [
  201. '<?php /** @var Foo|?Bar */',
  202. ],
  203. [
  204. '<?php /** @var ?Foo|Bar */',
  205. ],
  206. [
  207. '<?php /** @var Foo|?\Bar */',
  208. ],
  209. [
  210. '<?php /** @var ?\Foo|Bar */',
  211. ],
  212. [
  213. '<?php /** @var array<string|null> */',
  214. '<?php /** @var array<null|string> */',
  215. ],
  216. [
  217. '<?php /** @var array<int, string|null> */',
  218. '<?php /** @var array<int, null|string> */',
  219. ],
  220. [
  221. '<?php /** @var array<int, array<int|string|null>> */',
  222. '<?php /** @var array<int, array<null|int|string>> */',
  223. ],
  224. [
  225. '<?php /** @var null|null */',
  226. ],
  227. [
  228. '<?php /** @var null|\null */',
  229. ],
  230. [
  231. '<?php /** @var \null|null */',
  232. ],
  233. [
  234. '<?php /** @var \null|\null */',
  235. ],
  236. [
  237. '<?php /** @var int|\null */',
  238. '<?php /** @var \null|int */',
  239. ],
  240. [
  241. '<?php /** @var array<int|\null> */',
  242. '<?php /** @var array<\null|int> */',
  243. ],
  244. [
  245. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  246. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  247. ],
  248. [
  249. '<?php /** @var Foo[]|Foo|Foo\Bar|Foo_Bar|null */',
  250. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  251. ],
  252. ];
  253. }
  254. /**
  255. * @param string $expected
  256. * @param null|string $input
  257. *
  258. * @dataProvider provideFixWithAlphaAlgorithmCases
  259. */
  260. public function testFixWithAlphaAlgorithm($expected, $input = null)
  261. {
  262. $this->fixer->configure([
  263. 'sort_algorithm' => 'alpha',
  264. 'null_adjustment' => 'none',
  265. ]);
  266. $this->doTest($expected, $input);
  267. }
  268. public function provideFixWithAlphaAlgorithmCases()
  269. {
  270. return [
  271. [
  272. '<?php /** @var int|null|string */',
  273. '<?php /** @var string|int|null */',
  274. ],
  275. [
  276. '<?php /** @param Bar|\Foo */',
  277. '<?php /** @param \Foo|Bar */',
  278. ],
  279. [
  280. '<?php /** @property-read \Bar|Foo */',
  281. '<?php /** @property-read Foo|\Bar */',
  282. ],
  283. [
  284. '<?php /** @property-write bar|Foo */',
  285. '<?php /** @property-write Foo|bar */',
  286. ],
  287. [
  288. '<?php /** @return Bar|foo */',
  289. '<?php /** @return foo|Bar */',
  290. ],
  291. [
  292. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  293. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  294. ],
  295. [
  296. '<?php /** @var array|Bar\Baz|bool[]|false|Foo|int|null|object|resource|string|string[] */',
  297. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  298. ],
  299. [
  300. '<?php /** @var array<int, string>|null Foo */',
  301. '<?php /** @var null|array<int, string> Foo */',
  302. ],
  303. [
  304. '<?php /** @var array<int, array<string>>|null Foo */',
  305. '<?php /** @var null|array<int, array<string>> Foo */',
  306. ],
  307. [
  308. '<?php /** @var ?Bar|Foo */',
  309. '<?php /** @var Foo|?Bar */',
  310. ],
  311. [
  312. '<?php /** @var Bar|?Foo */',
  313. '<?php /** @var ?Foo|Bar */',
  314. ],
  315. [
  316. '<?php /** @var ?\Bar|Foo */',
  317. '<?php /** @var Foo|?\Bar */',
  318. ],
  319. [
  320. '<?php /** @var Bar|?\Foo */',
  321. '<?php /** @var ?\Foo|Bar */',
  322. ],
  323. [
  324. '<?php /** @var array<null|string> */',
  325. '<?php /** @var array<string|null> */',
  326. ],
  327. [
  328. '<?php /** @var array<int|string, null|string> */',
  329. '<?php /** @var array<string|int, string|null> */',
  330. ],
  331. [
  332. '<?php /** @var array<int|string, array<int|string, null|string>> */',
  333. '<?php /** @var array<string|int, array<string|int, string|null>> */',
  334. ],
  335. [
  336. '<?php /** @var null|null */',
  337. ],
  338. [
  339. '<?php /** @var null|\null */',
  340. ],
  341. [
  342. '<?php /** @var \null|null */',
  343. ],
  344. [
  345. '<?php /** @var \null|\null */',
  346. ],
  347. [
  348. '<?php /** @var int|\null|string */',
  349. '<?php /** @var string|\null|int */',
  350. ],
  351. [
  352. '<?php /** @var array<int|\null|string> */',
  353. '<?php /** @var array<string|\null|int> */',
  354. ],
  355. [
  356. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  357. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  358. ],
  359. [
  360. '<?php /** @var Foo|Foo[]|Foo\Bar|Foo_Bar|null */',
  361. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  362. ],
  363. ];
  364. }
  365. /**
  366. * @param string $expected
  367. * @param null|string $input
  368. *
  369. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases
  370. */
  371. public function testFixWithAlphaAlgorithmAndNullAlwaysFirst($expected, $input = null)
  372. {
  373. $this->fixer->configure([
  374. 'sort_algorithm' => 'alpha',
  375. 'null_adjustment' => 'always_first',
  376. ]);
  377. $this->doTest($expected, $input);
  378. }
  379. public function provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases()
  380. {
  381. return [
  382. [
  383. '<?php /** @var null|int|string */',
  384. '<?php /** @var string|int|null */',
  385. ],
  386. [
  387. '<?php /** @param Bar|\Foo */',
  388. '<?php /** @param \Foo|Bar */',
  389. ],
  390. [
  391. '<?php /** @property-read \Bar|Foo */',
  392. '<?php /** @property-read Foo|\Bar */',
  393. ],
  394. [
  395. '<?php /** @property-write bar|Foo */',
  396. '<?php /** @property-write Foo|bar */',
  397. ],
  398. [
  399. '<?php /** @return Bar|foo */',
  400. '<?php /** @return foo|Bar */',
  401. ],
  402. [
  403. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  404. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  405. ],
  406. [
  407. '<?php /** @var null|array|Bar\Baz|bool[]|false|Foo|int|object|resource|string|string[] */',
  408. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  409. ],
  410. [
  411. '<?php /** @var null|array<int, string> Foo */',
  412. ],
  413. [
  414. '<?php /** @var null|array<int, array<string>> Foo */',
  415. ],
  416. [
  417. '<?php /** @var NULL|int|string */',
  418. '<?php /** @var string|int|NULL */',
  419. ],
  420. [
  421. '<?php /** @var ?Bar|Foo */',
  422. '<?php /** @var Foo|?Bar */',
  423. ],
  424. [
  425. '<?php /** @var Bar|?Foo */',
  426. '<?php /** @var ?Foo|Bar */',
  427. ],
  428. [
  429. '<?php /** @var ?\Bar|Foo */',
  430. '<?php /** @var Foo|?\Bar */',
  431. ],
  432. [
  433. '<?php /** @var Bar|?\Foo */',
  434. '<?php /** @var ?\Foo|Bar */',
  435. ],
  436. [
  437. '<?php /** @var array<null|int|string> */',
  438. '<?php /** @var array<string|int|null> */',
  439. ],
  440. [
  441. '<?php /** @var array<int|string, null|int|string> */',
  442. '<?php /** @var array<string|int, string|int|null> */',
  443. ],
  444. [
  445. '<?php /** @var array<int|string, array<int|string, null|int|string>> */',
  446. '<?php /** @var array<string|int, array<string|int, string|int|null>> */',
  447. ],
  448. [
  449. '<?php /** @var null|null */',
  450. ],
  451. [
  452. '<?php /** @var null|\null */',
  453. ],
  454. [
  455. '<?php /** @var \null|null */',
  456. ],
  457. [
  458. '<?php /** @var \null|\null */',
  459. ],
  460. [
  461. '<?php /** @var array<\null|int|string> */',
  462. '<?php /** @var array<string|\null|int> */',
  463. ],
  464. [
  465. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  466. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  467. ],
  468. [
  469. '<?php /** @var null|Foo|Foo[]|Foo\Bar|Foo_Bar */',
  470. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  471. ],
  472. ];
  473. }
  474. /**
  475. * @param string $expected
  476. * @param null|string $input
  477. *
  478. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysLastCases
  479. */
  480. public function testFixWithAlphaAlgorithmAndNullAlwaysLast($expected, $input = null)
  481. {
  482. $this->fixer->configure([
  483. 'sort_algorithm' => 'alpha',
  484. 'null_adjustment' => 'always_last',
  485. ]);
  486. $this->doTest($expected, $input);
  487. }
  488. public function provideFixWithAlphaAlgorithmAndNullAlwaysLastCases()
  489. {
  490. return [
  491. [
  492. '<?php /** @var int|string|null */',
  493. '<?php /** @var string|int|null */',
  494. ],
  495. [
  496. '<?php /** @param Bar|\Foo */',
  497. '<?php /** @param \Foo|Bar */',
  498. ],
  499. [
  500. '<?php /** @property-read \Bar|Foo */',
  501. '<?php /** @property-read Foo|\Bar */',
  502. ],
  503. [
  504. '<?php /** @property-write bar|Foo */',
  505. '<?php /** @property-write Foo|bar */',
  506. ],
  507. [
  508. '<?php /** @return Bar|foo */',
  509. '<?php /** @return foo|Bar */',
  510. ],
  511. [
  512. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  513. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  514. ],
  515. [
  516. '<?php /** @var array|Bar\Baz|bool[]|false|Foo|int|object|resource|string|string[]|null */',
  517. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  518. ],
  519. [
  520. '<?php /** @var array<int, string>|null Foo */',
  521. '<?php /** @var null|array<int, string> Foo */',
  522. ],
  523. [
  524. '<?php /** @var array<int, array<string>>|null Foo */',
  525. '<?php /** @var null|array<int, array<string>> Foo */',
  526. ],
  527. [
  528. '<?php /** @var int|string|NULL */',
  529. '<?php /** @var string|int|NULL */',
  530. ],
  531. [
  532. '<?php /** @var ?Bar|Foo */',
  533. '<?php /** @var Foo|?Bar */',
  534. ],
  535. [
  536. '<?php /** @var Bar|?Foo */',
  537. '<?php /** @var ?Foo|Bar */',
  538. ],
  539. [
  540. '<?php /** @var ?\Bar|Foo */',
  541. '<?php /** @var Foo|?\Bar */',
  542. ],
  543. [
  544. '<?php /** @var Bar|?\Foo */',
  545. '<?php /** @var ?\Foo|Bar */',
  546. ],
  547. [
  548. '<?php /** @var array<int|string|null> */',
  549. '<?php /** @var array<string|int|null> */',
  550. ],
  551. [
  552. '<?php /** @var array<int|string, int|string|null> */',
  553. '<?php /** @var array<string|int, string|int|null> */',
  554. ],
  555. [
  556. '<?php /** @var array<int|string, array<int|string, int|string|null>> */',
  557. '<?php /** @var array<string|int, array<string|int, string|int|null>> */',
  558. ],
  559. [
  560. '<?php /** @var null|null */',
  561. ],
  562. [
  563. '<?php /** @var null|\null */',
  564. ],
  565. [
  566. '<?php /** @var \null|null */',
  567. ],
  568. [
  569. '<?php /** @var \null|\null */',
  570. ],
  571. [
  572. '<?php /** @var array<int|string|\null> */',
  573. '<?php /** @var array<string|\null|int> */',
  574. ],
  575. [
  576. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  577. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  578. ],
  579. [
  580. '<?php /** @var Foo|Foo[]|Foo\Bar|Foo_Bar|null */',
  581. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  582. ],
  583. ];
  584. }
  585. }