TernaryToNullCoalescingFixerTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  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 Filippo Tessarotto <zoeslam@gmail.com>
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\Operator\TernaryToNullCoalescingFixer
  20. */
  21. final class TernaryToNullCoalescingFixerTest extends AbstractFixerTestCase
  22. {
  23. /**
  24. * @dataProvider provideFixCases
  25. */
  26. public function testFix(string $expected, ?string $input = null): void
  27. {
  28. $this->doTest($expected, $input);
  29. }
  30. public static function provideFixCases(): iterable
  31. {
  32. yield // Do not fix cases.
  33. ['<?php $x = isset($a) ? $a[1] : null;'];
  34. yield ['<?php $x = isset($a) and $a ? $a : "";'];
  35. yield ['<?php $x = "isset($a) ? $a : null";'];
  36. yield ['<?php $x = isset($a) ? $$a : null;'];
  37. yield ['<?php $x = isset($this) ? $this : null;'];
  38. yield ['<?php $x = isset($A) ? $a : null;']; // different case
  39. yield ['<?php $x = isset($a) ? "$a" : null;'];
  40. yield ['<?php $x = isset($a) ?: false;'];
  41. yield ['<?php $x = $y ?? isset($a) ? $a : null;'];
  42. yield ['<?php $x = isset($a) ?: $b;'];
  43. yield ['<?php $x = isset($a, $b) ? $a : null;'];
  44. yield ['<?php $x = $a && isset($b) ? $b : null;'];
  45. yield ['<?php $x = $a & isset($b) ? $b : null;'];
  46. yield ['<?php $x = ! isset($a) ? $a : null;'];
  47. yield ['<?php $x = false === isset($a) ? $a : 2;'];
  48. yield ['<?php $x = 4 * isset($a) ? $a : 2;'];
  49. yield ['<?php $x = "4" . isset($a) ? $a : 2;'];
  50. yield ['<?php $x = 3 ** isset($a) ? $a : 2;'];
  51. yield ['<?php $x = 1 | isset($a) ? $a : 2;'];
  52. yield ['<?php $x = (array) isset($a) ? $a : 2;'];
  53. yield ['<?php $x = isset($a[++$i]) ? $a[++$i] : null;'];
  54. yield ['<?php $x = function(){isset($a[yield]) ? $a[yield] : null;};'];
  55. yield ['<?php $x = isset($a[foo()]) ? $a[foo()] : null;'];
  56. yield ['<?php $x = isset($a[$callback()]) ? $a[$callback()] : null;'];
  57. yield ['<?php $y = isset($a) ? 2**3 : 3**2;'];
  58. yield ['<?php $x = function(){isset($a[yield from $a]) ? $a[yield from $a] : null;};'];
  59. // Fix cases.
  60. yield 'Common fix case (I).' => [
  61. '<?php $x = $a ?? null;',
  62. '<?php $x = isset($a) ? $a : null;',
  63. ];
  64. yield 'Common fix case (II).' => [
  65. '<?php $x = $a[0] ?? 1;',
  66. '<?php $x = isset($a[0]) ? $a[0] : 1;',
  67. ];
  68. yield 'Minimal number of tokens case.' => [
  69. '<?php
  70. $x=$a??null?>',
  71. '<?php
  72. $x=isset($a)?$a:null?>',
  73. ];
  74. yield [
  75. '<?php $x = $a ?? 1; $y = isset($b) ? "b" : 2; $x = $c ?? 3;',
  76. '<?php $x = isset($a) ? $a : 1; $y = isset($b) ? "b" : 2; $x = isset($c) ? $c : 3;',
  77. ];
  78. yield [
  79. '<?php $x = $a[ $b[ "c" ]] ?? null;',
  80. '<?php $x = isset ( $a[$b["c"]]) ?$a[ $b[ "c" ]] : null;',
  81. ];
  82. yield [
  83. '<?php $x = $a ?? $b[func(1, true)];',
  84. '<?php $x = isset($a) ? $a : $b[func(1, true)];',
  85. ];
  86. yield [
  87. '<?php $x = $a ?? ($b ?? "");',
  88. '<?php $x = isset($a) ? $a : (isset($b) ? $b : "");',
  89. ];
  90. yield [
  91. '<?php $x = ($a ?? isset($b)) ? $b : "";',
  92. '<?php $x = (isset($a) ? $a : isset($b)) ? $b : "";',
  93. ];
  94. yield [
  95. '<?php $x = $obj->a ?? null;',
  96. '<?php $x = isset($obj->a) ? $obj->a : null;',
  97. ];
  98. yield [
  99. '<?php $x = $obj->a->b ?? null;',
  100. '<?php $x = isset($obj->a->b) ? $obj->a->b : null;',
  101. ];
  102. yield [
  103. '<?php $x = $obj->$a ?? null;',
  104. '<?php $x = isset($obj->$a) ? $obj->$a : null;',
  105. ];
  106. yield [
  107. '<?php $x = $obj->a->$b ?? null;',
  108. '<?php $x = isset($obj->a->$b) ? $obj->a->$b : null;',
  109. ];
  110. yield [
  111. '<?php $x = $obj->a[3] ?? null;',
  112. '<?php $x = isset($obj->a[3]) ? $obj->a[3] : null;',
  113. ];
  114. yield [
  115. '<?php $x = $obj->a[\'foo\'] ?? null;',
  116. '<?php $x = isset($obj->a[\'foo\']) ? $obj->a[\'foo\'] : null;',
  117. ];
  118. yield [
  119. '<?php $x = $obj->a[$b] ?? null;',
  120. '<?php $x = isset($obj->a[$b]) ? $obj->a[$b] : null;',
  121. ];
  122. yield [
  123. '<?php $x = $obj->a[$b][\'foo\'] ?? null;',
  124. '<?php $x = isset($obj->a[$b][\'foo\']) ? $obj->a[$b][\'foo\'] : null;',
  125. ];
  126. yield [
  127. '<?php $x = $obj->a[$b[\'foo\']] ?? null;',
  128. '<?php $x = isset($obj->a[$b[\'foo\']]) ? $obj->a[$b[\'foo\']] : null;',
  129. ];
  130. yield [
  131. '<?php $x = $a[$obj->b] ?? null;',
  132. '<?php $x = isset($a[$obj->b]) ? $a[$obj->b] : null;',
  133. ];
  134. yield [
  135. '<?php $x = Foo::A[$b] ?? null;',
  136. '<?php $x = isset(Foo::A[$b]) ? Foo::A[$b] : null;',
  137. ];
  138. yield [
  139. '<?php $x = $a[Foo::B] ?? null;',
  140. '<?php $x = isset($a[Foo::B]) ? $a[Foo::B] : null;',
  141. ];
  142. yield [
  143. '<?php $x = (
  144. // c1
  145. // c2
  146. // c3
  147. $a
  148. // c4
  149. ??
  150. // c5
  151. null
  152. /* c6 */
  153. )
  154. # c7
  155. ;',
  156. '<?php $x = (
  157. // c1
  158. isset($a)
  159. // c2
  160. ?
  161. // c3
  162. $a
  163. // c4
  164. :
  165. // c5
  166. null
  167. /* c6 */
  168. )
  169. # c7
  170. ;',
  171. ];
  172. yield [
  173. '<?php $x = $THIS ?? null;',
  174. '<?php $x = isset($THIS) ? $THIS : null;',
  175. ];
  176. }
  177. /**
  178. * @dataProvider provideFixPre80Cases
  179. *
  180. * @requires PHP <8.0
  181. */
  182. public function testFixPre80(string $expected, string $input = null): void
  183. {
  184. $this->doTest($expected, $input);
  185. }
  186. public static function provideFixPre80Cases(): iterable
  187. {
  188. yield ['<?php $x = $a ? $a : isset($b) ? $b : isset($c) ? $c : "";'];
  189. yield [
  190. '<?php $x = $a ?? isset($b) ? $b : isset($c) ? $c : "";',
  191. '<?php $x = isset($a) ? $a : isset($b) ? $b : isset($c) ? $c : "";',
  192. ];
  193. yield [
  194. '<?php $x = /*a1*//*a2*/ /*b*/ $a /*c*/ ?? /*d*/ isset($b) /*e*/ ? /*f*/ $b /*g*/ : /*h*/ isset($c) /*i*/ ? /*j*/ $c /*k*/ : /*l*/ "";',
  195. '<?php $x = isset($a) /*a1*//*a2*/ ? /*b*/ $a /*c*/ : /*d*/ isset($b) /*e*/ ? /*f*/ $b /*g*/ : /*h*/ isset($c) /*i*/ ? /*j*/ $c /*k*/ : /*l*/ "";',
  196. ];
  197. yield [
  198. '<?php $x = /*a1*//*a2*/ /*b*/ $a /*c*/ ?? /*d*/ isset($b) /*e*/ ? /*f*/ $b /*g*/ : /*h*/ isset($c) /*i*/ ? /*j*/ $c /*k*/ : /*l*/ "";',
  199. '<?php $x = isset($a) /*a1*//*a2*/ ? /*b*/ $a /*c*/ : /*d*/ isset($b) /*e*/ ? /*f*/ $b /*g*/ : /*h*/ isset($c) /*i*/ ? /*j*/ $c /*k*/ : /*l*/ "";',
  200. ];
  201. }
  202. }