AssignNullCoalescingToCoalesceEqualFixerTest.php 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  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. * @internal
  16. *
  17. * @covers \PhpCsFixer\Fixer\Operator\AssignNullCoalescingToCoalesceEqualFixer
  18. */
  19. final class AssignNullCoalescingToCoalesceEqualFixerTest 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' => [
  31. '<?php $a ??= 1;',
  32. '<?php $a = $a ?? 1;',
  33. ];
  34. yield 'minimal' => [
  35. '<?php $a ??= 1;',
  36. '<?php $a=$a??1;',
  37. ];
  38. yield 'simple array' => [
  39. '<?php $a[1] ??= 1;',
  40. '<?php $a[1] = $a[1] ?? 1;',
  41. ];
  42. yield 'simple array [0]' => [
  43. '<?php $a[1][0] ??= 1;',
  44. '<?php $a[1][0] = $a[1][0] ?? 1;',
  45. ];
  46. yield 'simple array ([0])' => [
  47. '<?php $a[1][0] ??= 1;',
  48. '<?php $a[1][0] = ($a[1][0]) ?? 1;',
  49. ];
  50. yield 'simple array, comment' => [
  51. '<?php $a[1] /* 1 */ ??= /* 2 */ /* 3 */ /* 4 */ /* 5 */ 1;',
  52. '<?php $a[1]/* 1 */ = /* 2 */ $a[1/* 3 */] /* 4 */ ??/* 5 */ 1;',
  53. ];
  54. yield [
  55. '<?php \A\B::$foo ??= 1;',
  56. '<?php \A\B::$foo = \A\B::$foo ?? 1;',
  57. ];
  58. yield 'same' => [
  59. '<?php $a ??= 1;',
  60. '<?php $a = ($a) ?? 1;',
  61. ];
  62. yield 'object' => [
  63. '<?php $a->b ??= 1;',
  64. '<?php $a->b = $a->b ?? 1;',
  65. ];
  66. yield 'object II' => [
  67. '<?php $a->b[0]->{1} ??= 1;',
  68. '<?php $a->b[0]->{1} = $a->b[0]->{1} ?? 1;',
  69. ];
  70. yield 'simple, before ;' => [
  71. '<?php ; $a ??= 1;',
  72. '<?php ; $a = $a ?? 1;',
  73. ];
  74. yield 'simple, before {' => [
  75. '<?php { $a ??= 1; }',
  76. '<?php { $a = $a ?? 1; }',
  77. ];
  78. yield 'simple, before }' => [
  79. '<?php if ($a){} $a ??= 1;',
  80. '<?php if ($a){} $a = $a ?? 1;',
  81. ];
  82. yield 'in call' => [
  83. '<?php foo($a ??= 1);',
  84. '<?php foo($a = $a ?? 1);',
  85. ];
  86. yield 'in call followed by end tag and ternary' => [
  87. '<?php foo( $a ??= 1 ) ?><?php $b = $b ? $c : $d ?>',
  88. '<?php foo( $a = $a ?? 1 ) ?><?php $b = $b ? $c : $d ?>',
  89. ];
  90. yield 'simple, before ) I' => [
  91. '<?php if ($a) $a ??= 1;',
  92. '<?php if ($a) $a = $a ?? 1;',
  93. ];
  94. yield 'simple, before ) II' => [
  95. '<?php
  96. if ($a) $a ??= 1;
  97. foreach ($d as $i) $a ??= 1;
  98. while (foo()) $a ??= 1;
  99. ',
  100. '<?php
  101. if ($a) $a = $a ?? 1;
  102. foreach ($d as $i) $a = $a ?? 1;
  103. while (foo()) $a = $a ?? 1;
  104. ',
  105. ];
  106. yield 'simple, end' => [
  107. '<?php $a ??= 1 ?>',
  108. '<?php $a = $a ?? 1 ?>',
  109. ];
  110. yield 'simple, 10x' => [
  111. '<?php'.str_repeat(' $a ??= 1;', 10),
  112. '<?php'.str_repeat(' $a = $a ?? 1;', 10),
  113. ];
  114. yield 'simple, multi line' => [
  115. '<?php
  116. $a
  117. ??=
  118. '.'
  119. '.'
  120. 1;',
  121. '<?php
  122. $a
  123. =
  124. $a
  125. ??
  126. 1;',
  127. ];
  128. yield 'dynamic var' => [
  129. '<?php ${beers::$ale} ??= 1;',
  130. '<?php ${beers::$ale} = ${beers::$ale} ?? 1;',
  131. ];
  132. yield [
  133. '<?php $argv ??= $_SERVER[\'argv\'] ?? [];',
  134. '<?php $argv = $argv ?? $_SERVER[\'argv\'] ?? [];',
  135. ];
  136. yield 'do not fix' => [
  137. '<?php
  138. $a = 1 + $a ?? $b;
  139. $b + $a = $a ?? 1;
  140. $b = $a ?? 1;
  141. $b = $a ?? $b;
  142. $d = $a + $c ; $c ?? $c;
  143. $a = ($a ?? $b) && $c; // just to be sure
  144. $a = (string) $a ?? 1;
  145. ',
  146. ];
  147. yield 'do not fix because of precedence 1' => [
  148. '<?php $a = $a ?? $b ? $c : $d;',
  149. ];
  150. yield 'do not fix because of precedence 2' => [
  151. '<?php $a = $a ?? $b ? $c : $d ?>',
  152. ];
  153. if (\PHP_VERSION_ID < 8_00_00) {
  154. yield 'mixed array' => [
  155. '<?php
  156. $a[1] ??= 1;
  157. $a{2} ??= 1;
  158. $a{2}[$f] ??= 1;
  159. ',
  160. '<?php
  161. $a[1] = $a[1] ?? 1;
  162. $a{2} = $a{2} ?? 1;
  163. $a{2}[$f] = $a{2}[$f] ?? 1;
  164. ',
  165. ];
  166. yield 'same II' => [
  167. '<?php $a[1] ??= 1;',
  168. '<?php $a[1] = $a{1} ?? 1;',
  169. ];
  170. yield 'same III' => [
  171. '<?php $a[1] ??= 1;',
  172. '<?php $a[1] = (($a{1})) ?? 1;',
  173. ];
  174. }
  175. }
  176. }