PhpdocTypesOrderFixerTest.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827
  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\Phpdoc;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @internal
  16. *
  17. * @covers \PhpCsFixer\Fixer\Phpdoc\PhpdocTypesOrderFixer
  18. */
  19. final class PhpdocTypesOrderFixerTest extends AbstractFixerTestCase
  20. {
  21. /**
  22. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases
  23. */
  24. public function testFix(string $expected, ?string $input = null): void
  25. {
  26. $this->doTest($expected, $input);
  27. }
  28. /**
  29. * @dataProvider provideFixWithNullFirstCases
  30. */
  31. public function testFixWithNullFirst(string $expected, ?string $input = null): void
  32. {
  33. $this->fixer->configure([
  34. 'sort_algorithm' => 'none',
  35. 'null_adjustment' => 'always_first',
  36. ]);
  37. $this->doTest($expected, $input);
  38. }
  39. public static function provideFixWithNullFirstCases(): iterable
  40. {
  41. yield [
  42. '<?php /** @var null|string */',
  43. '<?php /** @var string|null */',
  44. ];
  45. yield [
  46. '<?php /** @param null|string $foo */',
  47. '<?php /** @param string|null $foo */',
  48. ];
  49. yield [
  50. '<?php /** @property null|string $foo */',
  51. '<?php /** @property string|null $foo */',
  52. ];
  53. yield [
  54. '<?php /** @property-read null|string $foo */',
  55. '<?php /** @property-read string|null $foo */',
  56. ];
  57. yield [
  58. '<?php /** @property-write null|string $foo */',
  59. '<?php /** @property-write string|null $foo */',
  60. ];
  61. yield [
  62. '<?php /** @method null|string foo(null|int $foo, null|string $bar) */',
  63. '<?php /** @method string|null foo(int|null $foo, string|null $bar) */',
  64. ];
  65. yield [
  66. '<?php /** @return null|string */',
  67. '<?php /** @return string|null */',
  68. ];
  69. yield [
  70. '<?php /** @var null|string[]|resource|false|object|Foo|Bar\Baz|bool[]|string|array|int */',
  71. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  72. ];
  73. yield [
  74. '<?php /** @var null|array<int, string> Foo */',
  75. '<?php /** @var array<int, string>|null Foo */',
  76. ];
  77. yield [
  78. '<?php /** @var null|array<int, array<string>> Foo */',
  79. '<?php /** @var array<int, array<string>>|null Foo */',
  80. ];
  81. yield [
  82. '<?php /** @var NULL|string */',
  83. '<?php /** @var string|NULL */',
  84. ];
  85. yield [
  86. '<?php /** @var Foo|?Bar */',
  87. ];
  88. yield [
  89. '<?php /** @var ?Foo|Bar */',
  90. ];
  91. yield [
  92. '<?php /** @var array<null|string> */',
  93. '<?php /** @var array<string|null> */',
  94. ];
  95. yield [
  96. '<?php /** @var array<int, null|string> */',
  97. '<?php /** @var array<int, string|null> */',
  98. ];
  99. yield [
  100. '<?php /** @var array<int, array<null|int|string>> */',
  101. '<?php /** @var array<int, array<int|string|null>> */',
  102. ];
  103. yield [
  104. '<?php /** @var null|null */',
  105. ];
  106. yield [
  107. '<?php /** @var null|\null */',
  108. ];
  109. yield [
  110. '<?php /** @var \null|null */',
  111. ];
  112. yield [
  113. '<?php /** @var \null|\null */',
  114. ];
  115. yield [
  116. '<?php /** @var \null|int */',
  117. '<?php /** @var int|\null */',
  118. ];
  119. yield [
  120. '<?php /** @var array<\null|int> */',
  121. '<?php /** @var array<int|\null> */',
  122. ];
  123. yield [
  124. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  125. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  126. ];
  127. yield [
  128. '<?php /** @var null|Foo[]|Foo|Foo\Bar|Foo_Bar */',
  129. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  130. ];
  131. yield [
  132. '<?php /** @method null|Y|X setOrder(array<string, null|array{Y,X,null|Z}> $by) */',
  133. '<?php /** @method Y|null|X setOrder(array<string, array{Y,X,Z|null}|null> $by) */',
  134. ];
  135. yield '@method with invalid 2nd phpdoc' => [
  136. '<?php /** @method null|X setOrder($$by) */',
  137. '<?php /** @method X|null setOrder($$by) */',
  138. ];
  139. yield [
  140. '<?php /** @var array<array<int, int>, OutputInterface> */',
  141. ];
  142. yield [
  143. '<?php /** @var iterable<array{names:array<string>, surname:string}> */',
  144. ];
  145. yield [
  146. '<?php /** @var iterable<array{surname:string, names:array<string>}> */',
  147. ];
  148. yield [
  149. '<?php /** @return array<array{level:string, message:string, context:array<mixed>}> */',
  150. ];
  151. yield [
  152. '<?php /** @return Data<array{enabled: string[], all: array<string, string>}> */',
  153. ];
  154. yield [
  155. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  156. ];
  157. yield [
  158. '<?php /** @param null|callable(array<string>): array<string, T> $callback */',
  159. ];
  160. yield [
  161. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  162. ];
  163. yield [
  164. '<?php /** @return Closure(Iterator<TKey, T>): Generator<int, array<TKey, T>> */',
  165. ];
  166. yield [
  167. '<?php /** @var Closure(Iterator<TKey, T>): Generator<int, array<TKey, T>> $pipe */',
  168. ];
  169. yield [
  170. '<?php /** @return Generator<int, Promise<mixed>, mixed, Identity> */',
  171. ];
  172. yield [
  173. '<?php /** @param null|callable(null|foo, null|bar): array<string, T> $callback */',
  174. '<?php /** @param null|callable(foo|null, bar|null): array<string, T> $callback */',
  175. ];
  176. yield [
  177. '<?php /** @param null|string$foo */',
  178. '<?php /** @param string|null$foo */',
  179. ];
  180. }
  181. /**
  182. * @dataProvider provideFixWithNullLastCases
  183. */
  184. public function testFixWithNullLast(string $expected, ?string $input = null): void
  185. {
  186. $this->fixer->configure([
  187. 'sort_algorithm' => 'none',
  188. 'null_adjustment' => 'always_last',
  189. ]);
  190. $this->doTest($expected, $input);
  191. }
  192. public static function provideFixWithNullLastCases(): iterable
  193. {
  194. yield [
  195. '<?php /** @var string|null */',
  196. '<?php /** @var null|string */',
  197. ];
  198. yield [
  199. '<?php /** @param string|null $foo */',
  200. '<?php /** @param null|string $foo */',
  201. ];
  202. yield [
  203. '<?php /** @property string|null $foo */',
  204. '<?php /** @property null|string $foo */',
  205. ];
  206. yield [
  207. '<?php /** @property-read string|null $foo */',
  208. '<?php /** @property-read null|string $foo */',
  209. ];
  210. yield [
  211. '<?php /** @property-write string|null $foo */',
  212. '<?php /** @property-write null|string $foo */',
  213. ];
  214. yield [
  215. '<?php /** @method string|null foo(int|null $foo, string|null $bar) */',
  216. '<?php /** @method null|string foo(null|int $foo, null|string $bar) */',
  217. ];
  218. yield [
  219. '<?php /** @return string|null */',
  220. '<?php /** @return null|string */',
  221. ];
  222. yield [
  223. '<?php /** @var string[]|resource|false|object|Foo|Bar\Baz|bool[]|string|array|int|null */',
  224. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  225. ];
  226. yield [
  227. '<?php /** @var array<int, string>|null Foo */',
  228. '<?php /** @var null|array<int, string> Foo */',
  229. ];
  230. yield [
  231. '<?php /** @var array<int, array<string>>|null Foo */',
  232. '<?php /** @var null|array<int, array<string>> Foo */',
  233. ];
  234. yield [
  235. '<?php /** @var string|NULL */',
  236. '<?php /** @var NULL|string */',
  237. ];
  238. yield [
  239. '<?php /** @var Foo|?Bar */',
  240. ];
  241. yield [
  242. '<?php /** @var ?Foo|Bar */',
  243. ];
  244. yield [
  245. '<?php /** @var Foo|?\Bar */',
  246. ];
  247. yield [
  248. '<?php /** @var ?\Foo|Bar */',
  249. ];
  250. yield [
  251. '<?php /** @var array<string|null> */',
  252. '<?php /** @var array<null|string> */',
  253. ];
  254. yield [
  255. '<?php /** @var array<int, string|null> */',
  256. '<?php /** @var array<int, null|string> */',
  257. ];
  258. yield [
  259. '<?php /** @var array<int, array<int|string|null>> */',
  260. '<?php /** @var array<int, array<null|int|string>> */',
  261. ];
  262. yield [
  263. '<?php /** @var null|null */',
  264. ];
  265. yield [
  266. '<?php /** @var null|\null */',
  267. ];
  268. yield [
  269. '<?php /** @var \null|null */',
  270. ];
  271. yield [
  272. '<?php /** @var \null|\null */',
  273. ];
  274. yield [
  275. '<?php /** @var int|\null */',
  276. '<?php /** @var \null|int */',
  277. ];
  278. yield [
  279. '<?php /** @var array<int|\null> */',
  280. '<?php /** @var array<\null|int> */',
  281. ];
  282. yield [
  283. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  284. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  285. ];
  286. yield [
  287. '<?php /** @var Foo[]|Foo|Foo\Bar|Foo_Bar|null */',
  288. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  289. ];
  290. yield [
  291. '<?php /** @return array<int, callable(array<string, string|null> , DateTime): bool> */',
  292. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  293. ];
  294. }
  295. /**
  296. * @dataProvider provideFixWithAlphaAlgorithmCases
  297. */
  298. public function testFixWithAlphaAlgorithm(string $expected, ?string $input = null): void
  299. {
  300. $this->fixer->configure([
  301. 'sort_algorithm' => 'alpha',
  302. 'null_adjustment' => 'none',
  303. ]);
  304. $this->doTest($expected, $input);
  305. }
  306. public static function provideFixWithAlphaAlgorithmCases(): iterable
  307. {
  308. yield [
  309. '<?php /** @var int|null|string */',
  310. '<?php /** @var string|int|null */',
  311. ];
  312. yield [
  313. '<?php /** @param Bar|\Foo */',
  314. '<?php /** @param \Foo|Bar */',
  315. ];
  316. yield [
  317. '<?php /** @property-read \Bar|Foo */',
  318. '<?php /** @property-read Foo|\Bar */',
  319. ];
  320. yield [
  321. '<?php /** @property-write bar|Foo */',
  322. '<?php /** @property-write Foo|bar */',
  323. ];
  324. yield [
  325. '<?php /** @return Bar|foo */',
  326. '<?php /** @return foo|Bar */',
  327. ];
  328. yield [
  329. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  330. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  331. ];
  332. yield [
  333. '<?php /** @var array|Bar\Baz|bool[]|false|Foo|int|null|object|resource|string|string[] */',
  334. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  335. ];
  336. yield [
  337. '<?php /** @var array<int, string>|null Foo */',
  338. '<?php /** @var null|array<int, string> Foo */',
  339. ];
  340. yield [
  341. '<?php /** @var array<int, array<string>>|null Foo */',
  342. '<?php /** @var null|array<int, array<string>> Foo */',
  343. ];
  344. yield [
  345. '<?php /** @var ?Bar|Foo */',
  346. '<?php /** @var Foo|?Bar */',
  347. ];
  348. yield [
  349. '<?php /** @var Bar|?Foo */',
  350. '<?php /** @var ?Foo|Bar */',
  351. ];
  352. yield [
  353. '<?php /** @var ?\Bar|Foo */',
  354. '<?php /** @var Foo|?\Bar */',
  355. ];
  356. yield [
  357. '<?php /** @var Bar|?\Foo */',
  358. '<?php /** @var ?\Foo|Bar */',
  359. ];
  360. yield [
  361. '<?php /** @var array<null|string> */',
  362. '<?php /** @var array<string|null> */',
  363. ];
  364. yield [
  365. '<?php /** @var array<int|string, null|string> */',
  366. '<?php /** @var array<string|int, string|null> */',
  367. ];
  368. yield [
  369. '<?php /** @var array<int|string, array<int|string, null|string>> */',
  370. '<?php /** @var array<string|int, array<string|int, string|null>> */',
  371. ];
  372. yield [
  373. '<?php /** @var null|null */',
  374. ];
  375. yield [
  376. '<?php /** @var null|\null */',
  377. ];
  378. yield [
  379. '<?php /** @var \null|null */',
  380. ];
  381. yield [
  382. '<?php /** @var \null|\null */',
  383. ];
  384. yield [
  385. '<?php /** @var int|\null|string */',
  386. '<?php /** @var string|\null|int */',
  387. ];
  388. yield [
  389. '<?php /** @var array<int|\null|string> */',
  390. '<?php /** @var array<string|\null|int> */',
  391. ];
  392. yield [
  393. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  394. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  395. ];
  396. yield [
  397. '<?php /** @var Foo|Foo[]|Foo\Bar|Foo_Bar|null */',
  398. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  399. ];
  400. yield [
  401. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  402. ];
  403. yield [
  404. '<?php /** @return A&B&C */',
  405. '<?php /** @return A&C&B */',
  406. ];
  407. yield [
  408. '<?php /** @return array<A&B&C> */',
  409. '<?php /** @return array<A&C&B> */',
  410. ];
  411. yield [
  412. '<?php /** @return array<A&B&C>|bool|string */',
  413. '<?php /** @return bool|array<A&B&C>|string */',
  414. ];
  415. yield [
  416. '<?php /** @return A&B<X|Y|Z>&C&D */',
  417. '<?php /** @return A&D&B<X|Y|Z>&C */',
  418. ];
  419. }
  420. /**
  421. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases
  422. */
  423. public function testFixWithAlphaAlgorithmAndNullAlwaysFirst(string $expected, ?string $input = null): void
  424. {
  425. $this->fixer->configure([
  426. 'sort_algorithm' => 'alpha',
  427. 'null_adjustment' => 'always_first',
  428. ]);
  429. $this->doTest($expected, $input);
  430. }
  431. public static function provideFixWithAlphaAlgorithmAndNullAlwaysFirstCases(): iterable
  432. {
  433. yield [
  434. '<?php /** @var null|int|string */',
  435. '<?php /** @var string|int|null */',
  436. ];
  437. yield [
  438. '<?php /** @param Bar|\Foo */',
  439. '<?php /** @param \Foo|Bar */',
  440. ];
  441. yield [
  442. '<?php /** @property-read \Bar|Foo */',
  443. '<?php /** @property-read Foo|\Bar */',
  444. ];
  445. yield [
  446. '<?php /** @property-write bar|Foo */',
  447. '<?php /** @property-write Foo|bar */',
  448. ];
  449. yield [
  450. '<?php /** @return Bar|foo */',
  451. '<?php /** @return foo|Bar */',
  452. ];
  453. yield [
  454. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  455. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  456. ];
  457. yield [
  458. '<?php /** @var null|array|Bar\Baz|bool[]|false|Foo|int|object|resource|string|string[] */',
  459. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  460. ];
  461. yield [
  462. '<?php /** @var null|array<int, string> Foo */',
  463. ];
  464. yield [
  465. '<?php /** @var null|array<int, array<string>> Foo */',
  466. ];
  467. yield [
  468. '<?php /** @var NULL|int|string */',
  469. '<?php /** @var string|int|NULL */',
  470. ];
  471. yield [
  472. '<?php /** @var ?Bar|Foo */',
  473. '<?php /** @var Foo|?Bar */',
  474. ];
  475. yield [
  476. '<?php /** @var Bar|?Foo */',
  477. '<?php /** @var ?Foo|Bar */',
  478. ];
  479. yield [
  480. '<?php /** @var ?\Bar|Foo */',
  481. '<?php /** @var Foo|?\Bar */',
  482. ];
  483. yield [
  484. '<?php /** @var Bar|?\Foo */',
  485. '<?php /** @var ?\Foo|Bar */',
  486. ];
  487. yield [
  488. '<?php /** @var array<null|int|string> */',
  489. '<?php /** @var array<string|int|null> */',
  490. ];
  491. yield [
  492. '<?php /** @var array<int|string, null|int|string> */',
  493. '<?php /** @var array<string|int, string|int|null> */',
  494. ];
  495. yield [
  496. '<?php /** @var array<int|string, array<int|string, null|int|string>> */',
  497. '<?php /** @var array<string|int, array<string|int, string|int|null>> */',
  498. ];
  499. yield [
  500. '<?php /** @var null|null */',
  501. ];
  502. yield [
  503. '<?php /** @var null|\null */',
  504. ];
  505. yield [
  506. '<?php /** @var \null|null */',
  507. ];
  508. yield [
  509. '<?php /** @var \null|\null */',
  510. ];
  511. yield [
  512. '<?php /** @var array<\null|int|string> */',
  513. '<?php /** @var array<string|\null|int> */',
  514. ];
  515. yield [
  516. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  517. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  518. ];
  519. yield [
  520. '<?php /** @var null|Foo|Foo[]|Foo\Bar|Foo_Bar */',
  521. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  522. ];
  523. yield [
  524. '<?php /** @return array<array<string, int>> */',
  525. ];
  526. yield [
  527. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  528. ];
  529. }
  530. /**
  531. * @dataProvider provideFixWithAlphaAlgorithmAndNullAlwaysLastCases
  532. */
  533. public function testFixWithAlphaAlgorithmAndNullAlwaysLast(string $expected, ?string $input = null): void
  534. {
  535. $this->fixer->configure([
  536. 'sort_algorithm' => 'alpha',
  537. 'null_adjustment' => 'always_last',
  538. ]);
  539. $this->doTest($expected, $input);
  540. }
  541. public static function provideFixWithAlphaAlgorithmAndNullAlwaysLastCases(): iterable
  542. {
  543. yield [
  544. '<?php /** @var int|string|null */',
  545. '<?php /** @var string|int|null */',
  546. ];
  547. yield [
  548. '<?php /** @param Bar|\Foo */',
  549. '<?php /** @param \Foo|Bar */',
  550. ];
  551. yield [
  552. '<?php /** @property-read \Bar|Foo */',
  553. '<?php /** @property-read Foo|\Bar */',
  554. ];
  555. yield [
  556. '<?php /** @property-write bar|Foo */',
  557. '<?php /** @property-write Foo|bar */',
  558. ];
  559. yield [
  560. '<?php /** @return Bar|foo */',
  561. '<?php /** @return foo|Bar */',
  562. ];
  563. yield [
  564. '<?php /** @method \Bar|Foo foo(\Bar|Foo $foo, \Bar|Foo $bar) */',
  565. '<?php /** @method Foo|\Bar foo(Foo|\Bar $foo, Foo|\Bar $bar) */',
  566. ];
  567. yield [
  568. '<?php /** @var array|Bar\Baz|bool[]|false|Foo|int|object|resource|string|string[]|null */',
  569. '<?php /** @var string[]|resource|false|object|null|Foo|Bar\Baz|bool[]|string|array|int */',
  570. ];
  571. yield [
  572. '<?php /** @var array<int, string>|null Foo */',
  573. '<?php /** @var null|array<int, string> Foo */',
  574. ];
  575. yield [
  576. '<?php /** @var array<int, array<string>>|null Foo */',
  577. '<?php /** @var null|array<int, array<string>> Foo */',
  578. ];
  579. yield [
  580. '<?php /** @var int|string|NULL */',
  581. '<?php /** @var string|int|NULL */',
  582. ];
  583. yield [
  584. '<?php /** @var ?Bar|Foo */',
  585. '<?php /** @var Foo|?Bar */',
  586. ];
  587. yield [
  588. '<?php /** @var Bar|?Foo */',
  589. '<?php /** @var ?Foo|Bar */',
  590. ];
  591. yield [
  592. '<?php /** @var ?\Bar|Foo */',
  593. '<?php /** @var Foo|?\Bar */',
  594. ];
  595. yield [
  596. '<?php /** @var Bar|?\Foo */',
  597. '<?php /** @var ?\Foo|Bar */',
  598. ];
  599. yield [
  600. '<?php /** @var array<int|string|null> */',
  601. '<?php /** @var array<string|int|null> */',
  602. ];
  603. yield [
  604. '<?php /** @var array<int|string, int|string|null> */',
  605. '<?php /** @var array<string|int, string|int|null> */',
  606. ];
  607. yield [
  608. '<?php /** @var array<int|string, array<int|string, int|string|null>> */',
  609. '<?php /** @var array<string|int, array<string|int, string|int|null>> */',
  610. ];
  611. yield [
  612. '<?php /** @var null|null */',
  613. ];
  614. yield [
  615. '<?php /** @var null|\null */',
  616. ];
  617. yield [
  618. '<?php /** @var \null|null */',
  619. ];
  620. yield [
  621. '<?php /** @var \null|\null */',
  622. ];
  623. yield [
  624. '<?php /** @var array<int|string|\null> */',
  625. '<?php /** @var array<string|\null|int> */',
  626. ];
  627. yield [
  628. '<?php /** @var array<int, array<int, array<int, array<int, array<OutputInterface|null>>>>> */',
  629. '<?php /** @var array<int, array<int, array<int, array<int, array<null|OutputInterface>>>>> */',
  630. ];
  631. yield [
  632. '<?php /** @var Foo|Foo[]|Foo\Bar|Foo_Bar|null */',
  633. '<?php /** @var Foo[]|null|Foo|Foo\Bar|Foo_Bar */',
  634. ];
  635. yield [
  636. '<?php /** @return array<int, callable(array<string, string|null> , DateTime): bool> */',
  637. '<?php /** @return array<int, callable(array<string, null|string> , DateTime): bool> */',
  638. ];
  639. yield [
  640. '<?php /** @var ?Deferred<TestLocations> */',
  641. ];
  642. }
  643. /**
  644. * @dataProvider provideFixWithCaseSensitiveCases
  645. */
  646. public function testFixWithCaseSensitive(string $expected, ?string $input = null): void
  647. {
  648. $this->fixer->configure([
  649. 'case_sensitive' => true,
  650. ]);
  651. $this->doTest($expected, $input);
  652. }
  653. public static function provideFixWithCaseSensitiveCases(): iterable
  654. {
  655. return [
  656. [
  657. '<?php /** @var AA|Aaa */',
  658. '<?php /** @var Aaa|AA */',
  659. ],
  660. ];
  661. }
  662. }