StringLengthToEmptyFixerTest.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  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\StringNotation;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @internal
  16. *
  17. * @covers \PhpCsFixer\Fixer\StringNotation\StringLengthToEmptyFixer
  18. */
  19. final class StringLengthToEmptyFixerTest 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 [
  31. '<?php $a = \'\' === $b;',
  32. '<?php $a = 0 === strlen($b);',
  33. ];
  34. yield 'casing' => [
  35. '<?php $a1 = \'\' === $b ?>',
  36. '<?php $a1 = 0 === \STRlen($b) ?>',
  37. ];
  38. yield 'nested' => [
  39. '<?php $a2 = \'\' === foo(\'\' === foo(\'\' === foo(\'\' === foo(\'\' === foo(\'\' === foo(\'\' === $b))))));',
  40. '<?php $a2 = 0 === strlen(foo(0 === strlen(foo(0 === strlen(foo(0 === strlen(foo(0 === strlen(foo(0 === strlen(foo(0 === strlen($b)))))))))))));',
  41. ];
  42. yield [
  43. '<?php $a3 = \'\' !== $b;',
  44. '<?php $a3 = 0 !== strlen($b);',
  45. ];
  46. yield [
  47. '<?php $a4 = 0 <= strlen($b);',
  48. ];
  49. yield [
  50. '<?php $a5 = \'\' === $b;',
  51. '<?php $a5 = 0 >= strlen($b);',
  52. ];
  53. yield [
  54. '<?php $a6 = \'\' !== $b;',
  55. '<?php $a6 = 0 < strlen($b);',
  56. ];
  57. yield [
  58. '<?php $a7 = 0 > strlen($b);',
  59. ];
  60. yield [
  61. '<?php $a8 = 1 === strlen($b);',
  62. ];
  63. yield [
  64. '<?php $a9 = 1 !== strlen($b);',
  65. ];
  66. yield [
  67. '<?php $a10 = \'\' !== $b;',
  68. '<?php $a10 = 1 <= strlen($b);',
  69. ];
  70. yield [
  71. '<?php $a11 = 1 >= strlen($b);',
  72. ];
  73. yield [
  74. '<?php $a12 = 1 < strlen($b);',
  75. ];
  76. yield [
  77. '<?php $a13 = \'\' === $b;',
  78. '<?php $a13 = 1 > strlen($b);',
  79. ];
  80. yield [
  81. '<?php $a14 = $b === \'\';',
  82. '<?php $a14 = strlen($b) === 0;',
  83. ];
  84. yield [
  85. '<?php $a15 = $b !== \'\';',
  86. '<?php $a15 = strlen($b) !== 0;',
  87. ];
  88. yield [
  89. '<?php $a16 = $b === \'\';',
  90. '<?php $a16 = strlen($b) <= 0;',
  91. ];
  92. yield [
  93. '<?php $a17 = strlen($b) >= 0;',
  94. ];
  95. yield [
  96. '<?php $a18 = strlen($b) < 0;',
  97. ];
  98. yield [
  99. '<?php $a19 = $b !== \'\';',
  100. '<?php $a19 = strlen($b) > 0;',
  101. ];
  102. yield [
  103. '<?php $a20 = strlen($b) === 1;',
  104. ];
  105. yield [
  106. '<?php $a21 = strlen($b) !== 1;',
  107. ];
  108. yield [
  109. '<?php $a22 = strlen($b) <= 1;',
  110. ];
  111. yield [
  112. '<?php $a23 = $b !== \'\';',
  113. '<?php $a23 = strlen($b) >= 1;',
  114. ];
  115. yield [
  116. '<?php $a24 = $b === \'\';',
  117. '<?php $a24 = strlen($b) < 1;',
  118. ];
  119. yield [
  120. '<?php $a25 = strlen($b) > 1;',
  121. ];
  122. yield [
  123. '<?php $e = 0 === foo() ? -1 : \'\' === $a;',
  124. '<?php $e = 0 === foo() ? -1 : 0 === strlen($a);',
  125. ];
  126. yield [
  127. '<?php $x = /* 1 */ $b /* 2 */ ->a !== \'\';',
  128. '<?php $x = strlen(/* 1 */ $b /* 2 */ ->a) >= 1;',
  129. ];
  130. yield [
  131. '<?php $y = $b[0] === \'\';',
  132. '<?php $y = strlen($b[0]) < 1;',
  133. ];
  134. yield [
  135. '<?php $y1 = $b[0]->$a[$a++](1) /* 1 */ === \'\';',
  136. '<?php $y1 = strlen($b[0]->$a[$a++](1) /* 1 */ ) < 1;',
  137. ];
  138. yield [
  139. '<?php $z = \'\' === $b[1]->foo(++$i, static function () use ($z){ return $z + 1;});',
  140. '<?php $z = 0 === strlen($b[1]->foo(++$i, static function () use ($z){ return $z + 1;}));',
  141. ];
  142. yield [
  143. '<?php if ((string) $node !== \'\') { echo 1; }',
  144. '<?php if (\strlen((string) $node) > 0) { echo 1; }',
  145. ];
  146. yield 'do not fix' => [
  147. '<?php
  148. //-----------------------------------
  149. // operator precedence
  150. $a01 = 0 === strlen($b) ** $c;
  151. $a03 = 0 === strlen($b) % $c;
  152. $a04 = 0 === strlen($b) / $c;
  153. $a05 = 0 === strlen($b) * $c;
  154. $a06 = 0 === strlen($b) + $c;
  155. $a07 = 0 === strlen($b) - $c;
  156. $a08 = 0 === strlen($b) . $c;
  157. $a09 = 0 === strlen($b) >> $c;
  158. $a10 = 0 === strlen($b) << $c;
  159. $a01n = strlen($b) === 0 ** $c;
  160. $a03n = strlen($b) === 0 % $c;
  161. $a04n = strlen($b) === 0 / $c;
  162. $a05n = strlen($b) === 0 * $c;
  163. $a06n = strlen($b) === 0 + $c;
  164. $a07n = strlen($b) === 0 - $c;
  165. $a08n = strlen($b) === 0 . $c;
  166. $a09n = strlen($b) === 0 >> $c;
  167. $a10n = strlen($b) === 0 << $c;
  168. $b = "a";
  169. $c = 0 === strlen($b) - 1;
  170. var_dump($c);
  171. $c = "" === $b - 1;
  172. var_dump($c);
  173. //-----------------------------------
  174. // type juggle
  175. $d = false;
  176. $e = 0 === strlen($d) ? -1 : 0;
  177. var_dump($e);
  178. $e = "" === $d ? -1 : 0;
  179. var_dump($e);
  180. //-----------------------------------
  181. // wrong argument count
  182. $f = strlen(1,2);
  183. $g = \strlen(1,2,3);
  184. //-----------------------------------
  185. // others
  186. $h = 0 === (string) strlen($b);
  187. $i = 0 === @strlen($b);
  188. $j = 0 === !strlen($b);
  189. $jj = 2 === strlen($b);
  190. $jk = __DIR__ === strlen($b);
  191. $jl = \'X\' !== strlen($b);
  192. $jj = strlen($b) === 2;
  193. $jk = strlen($b) === __DIR__;
  194. $jl = strlen($b) !== \'X\';
  195. //-----------------------------------
  196. // not global calls
  197. $k = 0 === $a->strlen($b);
  198. $l = 0 === Foo::strlen($b);
  199. //-----------------------------------
  200. // comments
  201. // $a = 0 === strlen($b);
  202. # $a = 0 === strlen($b);
  203. /* $a = 0 === strlen($b); */
  204. /** $a = 0 === strlen($b); */
  205. ',
  206. ];
  207. // cases where `(` and `)` must be kept
  208. yield [
  209. '<?php $e = ($a = trim($b)) !== \'\';',
  210. '<?php $e = \strlen($a = trim($b)) > 0;',
  211. ];
  212. yield [
  213. '<?php if (\'\' === ($value = foo())) { echo 2; }',
  214. '<?php if (0 === \strlen($value = foo())) { echo 2; }',
  215. ];
  216. yield [
  217. '<?php
  218. $a02 = 0 === strlen($b) instanceof stdClass;
  219. $a02n = strlen($b) === 0 instanceof stdClass;',
  220. ];
  221. }
  222. }