StandardizeIncrementFixerTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764
  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\Operator;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author ntzm
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\AbstractIncrementOperatorFixer
  20. * @covers \PhpCsFixer\Fixer\Operator\StandardizeIncrementFixer
  21. */
  22. final class StandardizeIncrementFixerTest 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. public static function provideFixCases(): iterable
  32. {
  33. yield [
  34. '<?php ++$i;',
  35. '<?php $i += 1;',
  36. ];
  37. yield [
  38. '<?php ++$i;',
  39. '<?php $i+=1;',
  40. ];
  41. yield [
  42. '<?php for ($i = 0; $i < $n; ++$i) {};',
  43. '<?php for ($i = 0; $i < $n; $i += 1) {};',
  44. ];
  45. yield [
  46. '<?php ++$foo->bar;',
  47. '<?php $foo->bar += 1;',
  48. ];
  49. yield [
  50. '<?php ++$foo->$bar;',
  51. '<?php $foo->$bar += 1;',
  52. ];
  53. yield [
  54. '<?php ++$foo->$$$bar;',
  55. '<?php $foo->$$$bar += 1;',
  56. ];
  57. yield [
  58. '<?php ++$foo["bar"];',
  59. '<?php $foo["bar"] += 1;',
  60. ];
  61. yield [
  62. '<?php ++$foo[baz()];',
  63. '<?php $foo[baz()] += 1;',
  64. ];
  65. yield [
  66. '<?php ++$foo[$bar->baz];',
  67. '<?php $foo[$bar->baz] += 1;',
  68. ];
  69. yield [
  70. '<?php ++$foo[$bar];',
  71. '<?php $foo[$bar] += 1;',
  72. ];
  73. yield [
  74. '<?php ++$foo[Bar::BAZ];',
  75. '<?php $foo[Bar::BAZ] += 1;',
  76. ];
  77. yield [
  78. '<?php echo $foo[++$i];',
  79. '<?php echo $foo[$i += 1];',
  80. ];
  81. yield [
  82. '<?php echo ++$foo[$bar[$baz]];',
  83. '<?php echo $foo[$bar[$baz]] += 1;',
  84. ];
  85. yield [
  86. '<?php ++$$foo;',
  87. '<?php $$foo += 1;',
  88. ];
  89. yield [
  90. '<?php ++$$$$foo;',
  91. '<?php $$$$foo += 1;',
  92. ];
  93. yield [
  94. '<?php ++${$foo};',
  95. '<?php ${$foo} += 1;',
  96. ];
  97. yield [
  98. '<?php ++$$${$foo};',
  99. '<?php $$${$foo} += 1;',
  100. ];
  101. yield [
  102. '<?php ++$a[$b];',
  103. '<?php $a[$b] += 1;',
  104. ];
  105. yield [
  106. '<?php ++$a[++$b];',
  107. '<?php $a[$b += 1] += 1;',
  108. ];
  109. yield [
  110. '<?php foo(++$a);',
  111. '<?php foo($a += 1);',
  112. ];
  113. yield [
  114. '<?php foo(++$a, $bar);',
  115. '<?php foo($a += 1, $bar);',
  116. ];
  117. yield [
  118. '<?php ++$foo->{++$a};',
  119. '<?php $foo->{$a += 1} += 1;',
  120. ];
  121. yield [
  122. '<?php ++${++$a};',
  123. '<?php ${$a += 1} += 1;',
  124. ];
  125. yield [
  126. '<?php ++$i ?>',
  127. '<?php $i += 1 ?>',
  128. ];
  129. yield [
  130. '<?php $a = $b ? ++$c : ++$d;',
  131. '<?php $a = $b ? $c += 1 : $d += 1;',
  132. ];
  133. yield [
  134. '<?php ++$a->{++$b}[++$c];',
  135. '<?php $a->{$b += 1}[$c += 1] += 1;',
  136. ];
  137. yield [
  138. '<?php (++$i);',
  139. '<?php ($i += 1);',
  140. ];
  141. yield [
  142. '<?php (((++$i)));',
  143. '<?php ((($i += 1)));',
  144. ];
  145. yield [
  146. '<?php ++$a->b->$c;',
  147. '<?php $a->b->$c += 1;',
  148. ];
  149. yield [
  150. '<?php ++$i/* foo */;',
  151. '<?php $i +=/* foo */1;',
  152. ];
  153. yield [
  154. '<?php ++$i/* foo *//* bar */;',
  155. '<?php $i /* foo */ += /* bar */1;',
  156. ];
  157. yield [
  158. '<?php ++$i/** foo *//** bar */;',
  159. '<?php $i /** foo */ += /** bar */1;',
  160. ];
  161. yield [
  162. "<?php ++\$i// foo\n;",
  163. "<?php \$i += // foo\n1;",
  164. ];
  165. yield [
  166. '<?php --$i;',
  167. '<?php $i -= 1;',
  168. ];
  169. yield [
  170. '<?php --$i;',
  171. '<?php $i-=1;',
  172. ];
  173. yield [
  174. '<?php for ($i = 0; $i < $n; --$i) {};',
  175. '<?php for ($i = 0; $i < $n; $i -= 1) {};',
  176. ];
  177. yield [
  178. '<?php --$foo->bar;',
  179. '<?php $foo->bar -= 1;',
  180. ];
  181. yield [
  182. '<?php --$foo->$bar;',
  183. '<?php $foo->$bar -= 1;',
  184. ];
  185. yield [
  186. '<?php --$foo->$$$bar;',
  187. '<?php $foo->$$$bar -= 1;',
  188. ];
  189. yield [
  190. '<?php --$foo["bar"];',
  191. '<?php $foo["bar"] -= 1;',
  192. ];
  193. yield [
  194. '<?php --$foo[baz()];',
  195. '<?php $foo[baz()] -= 1;',
  196. ];
  197. yield [
  198. '<?php --$foo[$bar->baz];',
  199. '<?php $foo[$bar->baz] -= 1;',
  200. ];
  201. yield [
  202. '<?php --$foo[$bar];',
  203. '<?php $foo[$bar] -= 1;',
  204. ];
  205. yield [
  206. '<?php --$foo[Bar::BAZ];',
  207. '<?php $foo[Bar::BAZ] -= 1;',
  208. ];
  209. yield [
  210. '<?php echo $foo[--$i];',
  211. '<?php echo $foo[$i -= 1];',
  212. ];
  213. yield [
  214. '<?php echo --$foo->{$bar};',
  215. '<?php echo $foo->{$bar} -= 1;',
  216. ];
  217. yield [
  218. '<?php echo --$foo->{$bar->{$baz}};',
  219. '<?php echo $foo->{$bar->{$baz}} -= 1;',
  220. ];
  221. yield [
  222. '<?php echo --$foo[$bar[$baz]];',
  223. '<?php echo $foo[$bar[$baz]] -= 1;',
  224. ];
  225. yield [
  226. '<?php --$$foo;',
  227. '<?php $$foo -= 1;',
  228. ];
  229. yield [
  230. '<?php --$$$$foo;',
  231. '<?php $$$$foo -= 1;',
  232. ];
  233. yield [
  234. '<?php --${$foo};',
  235. '<?php ${$foo} -= 1;',
  236. ];
  237. yield [
  238. '<?php --$$${$foo};',
  239. '<?php $$${$foo} -= 1;',
  240. ];
  241. yield [
  242. '<?php --$a[$b];',
  243. '<?php $a[$b] -= 1;',
  244. ];
  245. yield [
  246. '<?php --$a[--$b];',
  247. '<?php $a[$b -= 1] -= 1;',
  248. ];
  249. yield [
  250. '<?php foo(--$a);',
  251. '<?php foo($a -= 1);',
  252. ];
  253. yield [
  254. '<?php foo(--$a, $bar);',
  255. '<?php foo($a -= 1, $bar);',
  256. ];
  257. yield [
  258. '<?php --$foo->{--$a};',
  259. '<?php $foo->{$a -= 1} -= 1;',
  260. ];
  261. yield [
  262. '<?php --${--$a};',
  263. '<?php ${$a -= 1} -= 1;',
  264. ];
  265. yield [
  266. '<?php --$i ?>',
  267. '<?php $i -= 1 ?>',
  268. ];
  269. yield [
  270. '<?php $a = $b ? --$c : --$d;',
  271. '<?php $a = $b ? $c -= 1 : $d -= 1;',
  272. ];
  273. yield [
  274. '<?php --$a->{--$b}[--$c];',
  275. '<?php $a->{$b -= 1}[$c -= 1] -= 1;',
  276. ];
  277. yield [
  278. '<?php (--$i);',
  279. '<?php ($i -= 1);',
  280. ];
  281. yield [
  282. '<?php (((--$i)));',
  283. '<?php ((($i -= 1)));',
  284. ];
  285. yield [
  286. '<?php --$a->b->$c;',
  287. '<?php $a->b->$c -= 1;',
  288. ];
  289. yield [
  290. '<?php --$i/* foo */;',
  291. '<?php $i -=/* foo */1;',
  292. ];
  293. yield [
  294. '<?php --$i/* foo *//* bar */;',
  295. '<?php $i /* foo */ -= /* bar */1;',
  296. ];
  297. yield [
  298. '<?php --$i/** foo *//** bar */;',
  299. '<?php $i /** foo */ -= /** bar */1;',
  300. ];
  301. yield [
  302. "<?php --\$i// foo\n;",
  303. "<?php \$i -= // foo\n1;",
  304. ];
  305. yield [
  306. '<?php $i + 1;',
  307. ];
  308. yield [
  309. '<?php $i - 1;',
  310. ];
  311. yield [
  312. '<?php $i = 1;',
  313. ];
  314. yield [
  315. '<?php $i = -1;',
  316. ];
  317. yield [
  318. '<?php $i + 1;',
  319. ];
  320. yield [
  321. '<?php $i += 1.0;',
  322. ];
  323. yield [
  324. '<?php $i += "1";',
  325. ];
  326. yield [
  327. '<?php $i -= 1.0;',
  328. ];
  329. yield [
  330. '<?php $i -= "1";',
  331. ];
  332. yield [
  333. '<?php $i += 1 * 2;',
  334. ];
  335. yield [
  336. '<?php $i += 1 ** 2;',
  337. ];
  338. yield [
  339. '<?php $i += 1 / 2;',
  340. ];
  341. yield [
  342. '<?php $i += 1 + 2;',
  343. ];
  344. yield [
  345. '<?php $i += 1 - 2;',
  346. ];
  347. yield [
  348. '<?php $i += 1 % 2;',
  349. ];
  350. yield [
  351. '<?php $i += 1 ?: 2;',
  352. ];
  353. yield [
  354. '<?php $i += 1 & 2;',
  355. ];
  356. yield [
  357. '<?php $i += 1 ^ 2;',
  358. ];
  359. yield [
  360. '<?php $i += 1 >> 2;',
  361. ];
  362. yield [
  363. '<?php $i += 1 << 2;',
  364. ];
  365. yield [
  366. '<?php $i += 1 && true;',
  367. ];
  368. yield [
  369. '<?php $i += 1 || true;',
  370. ];
  371. yield [
  372. '<?php $i += 1 and true;',
  373. ];
  374. yield [
  375. '<?php $i += 1 or true;',
  376. ];
  377. yield [
  378. '<?php $i += 1 xor true;',
  379. ];
  380. yield [
  381. '<?php $i += 1 === 2;',
  382. ];
  383. yield [
  384. '<?php $i += 1 == 2;',
  385. ];
  386. yield [
  387. '<?php $i += 1 !== 2;',
  388. ];
  389. yield [
  390. '<?php $i += 1 != 2;',
  391. ];
  392. yield [
  393. '<?php $i += 1 < 2;',
  394. ];
  395. yield [
  396. '<?php $i += 1 > 2;',
  397. ];
  398. yield [
  399. '<?php $i += 1 <= 2;',
  400. ];
  401. yield [
  402. '<?php $i += 1 >= 2;',
  403. ];
  404. yield [
  405. '<?php $i += 1 <> 2;',
  406. ];
  407. yield [
  408. '<?php $i -= 1 * 2;',
  409. ];
  410. yield [
  411. '<?php $i -= 1 ** 2;',
  412. ];
  413. yield [
  414. '<?php $i -= 1 / 2;',
  415. ];
  416. yield [
  417. '<?php $i -= 1 + 2;',
  418. ];
  419. yield [
  420. '<?php $i -= 1 - 2;',
  421. ];
  422. yield [
  423. '<?php $i -= 1 % 2;',
  424. ];
  425. yield [
  426. '<?php $i -= 1 ?: 2;',
  427. ];
  428. yield [
  429. '<?php $i -= 1 & 2;',
  430. ];
  431. yield [
  432. '<?php $i -= 1 ^ 2;',
  433. ];
  434. yield [
  435. '<?php $i -= 1 >> 2;',
  436. ];
  437. yield [
  438. '<?php $i -= 1 << 2;',
  439. ];
  440. yield [
  441. '<?php $i -= 1 && true;',
  442. ];
  443. yield [
  444. '<?php $i -= 1 || true;',
  445. ];
  446. yield [
  447. '<?php $i -= 1 and true;',
  448. ];
  449. yield [
  450. '<?php $i -= 1 or true;',
  451. ];
  452. yield [
  453. '<?php $i -= 1 xor true;',
  454. ];
  455. yield [
  456. '<?php $i -= 1 === 2;',
  457. ];
  458. yield [
  459. '<?php $i -= 1 == 2;',
  460. ];
  461. yield [
  462. '<?php $i -= 1 !== 2;',
  463. ];
  464. yield [
  465. '<?php $i -= 1 != 2;',
  466. ];
  467. yield [
  468. '<?php $i -= 1 < 2;',
  469. ];
  470. yield [
  471. '<?php $i -= 1 > 2;',
  472. ];
  473. yield [
  474. '<?php $i -= 1 <= 2;',
  475. ];
  476. yield [
  477. '<?php $i -= 1 >= 2;',
  478. ];
  479. yield [
  480. '<?php $i -= 1 <> 2;',
  481. ];
  482. yield [
  483. '<?php #1
  484. #2
  485. ++$i#3
  486. #4
  487. #5
  488. #6
  489. #7
  490. ;#8
  491. #9',
  492. '<?php #1
  493. #2
  494. $i#3
  495. #4
  496. +=#5
  497. #6
  498. 1#7
  499. ;#8
  500. #9',
  501. ];
  502. yield [
  503. '<?php $a -= ($a -= ($a -= (--$a)));',
  504. '<?php $a -= ($a -= ($a -= ($a -= 1)));',
  505. ];
  506. yield [
  507. '<?php --$a[foo($d,foo($c))];',
  508. '<?php $a[foo($d,foo($c))] -= 1;',
  509. ];
  510. yield [
  511. '<?php $i *= 1; ++$i;',
  512. '<?php $i *= 1; $i += 1;',
  513. ];
  514. yield [
  515. '<?php ++A::$b;',
  516. '<?php A::$b += 1;',
  517. ];
  518. yield [
  519. '<?php ++\A::$b;',
  520. '<?php \A::$b += 1;',
  521. ];
  522. yield [
  523. '<?php ++\A\B\C::$d;',
  524. '<?php \A\B\C::$d += 1;',
  525. ];
  526. yield [
  527. '<?php ++$a::$b;',
  528. '<?php $a::$b += 1;',
  529. ];
  530. yield [
  531. '<?php ++$a::$b->$c;',
  532. '<?php $a::$b->$c += 1;',
  533. ];
  534. yield [
  535. '<?php class Foo {
  536. public static function bar() {
  537. ++self::$v1;
  538. ++static::$v2;
  539. }
  540. }',
  541. '<?php class Foo {
  542. public static function bar() {
  543. self::$v1 += 1;
  544. static::$v2 += 1;
  545. }
  546. }',
  547. ];
  548. yield [
  549. '<?php $i -= 1 ?? 2;',
  550. ];
  551. yield [
  552. '<?php $i += 1 ?? 2;',
  553. ];
  554. yield [
  555. '<?php $i -= 1 <=> 2;',
  556. ];
  557. yield [
  558. '<?php $i += 1 <=> 2;',
  559. ];
  560. yield [
  561. '<?php ++$a::$b::$c;',
  562. '<?php $a::$b::$c += 1;',
  563. ];
  564. yield [
  565. '<?php ++$a->$b::$c;',
  566. '<?php $a->$b::$c += 1;',
  567. ];
  568. yield [
  569. '<?php ++$a::${$b}::$c;',
  570. '<?php $a::${$b}::$c += 1;',
  571. ];
  572. yield [
  573. '<?php ++$a->$b::$c->${$d}->${$e}::f(1 + 2 * 3)->$g::$h;',
  574. '<?php $a->$b::$c->${$d}->${$e}::f(1 + 2 * 3)->$g::$h += 1;',
  575. ];
  576. yield [
  577. '<?php $i += 1_0;',
  578. ];
  579. }
  580. /**
  581. * @dataProvider provideFixPre80Cases
  582. *
  583. * @requires PHP <8.0
  584. */
  585. public function testFixPre80(string $expected, string $input = null): void
  586. {
  587. $this->doTest($expected, $input);
  588. }
  589. public static function provideFixPre80Cases(): iterable
  590. {
  591. yield [
  592. '<?php echo ++$foo->{$bar};',
  593. '<?php echo $foo->{$bar} += 1;',
  594. ];
  595. yield [
  596. '<?php echo ++$foo->{$bar->{$baz}};',
  597. '<?php echo $foo->{$bar->{$baz}} += 1;',
  598. ];
  599. yield [
  600. '<?php ++$a{$b};',
  601. '<?php $a{$b} += 1;',
  602. ];
  603. yield [
  604. '<?php --$a{$b};',
  605. '<?php $a{$b} -= 1;',
  606. ];
  607. }
  608. }