SimplifiedIfReturnFixerTest.php 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  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\ControlStructure;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author Filippo Tessarotto <zoeslam@gmail.com>
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\ControlStructure\SimplifiedIfReturnFixer
  20. *
  21. * @extends AbstractFixerTestCase<\PhpCsFixer\Fixer\ControlStructure\SimplifiedIfReturnFixer>
  22. */
  23. final class SimplifiedIfReturnFixerTest extends AbstractFixerTestCase
  24. {
  25. /**
  26. * @dataProvider provideFixCases
  27. */
  28. public function testFix(string $expected, ?string $input = null): void
  29. {
  30. $this->doTest($expected, $input);
  31. }
  32. /**
  33. * @return iterable<int|string, array{0: string, 1?: string}>
  34. */
  35. public static function provideFixCases(): iterable
  36. {
  37. yield 'simple' => [
  38. '<?php return (bool) ($foo) ;',
  39. '<?php if ($foo) { return true; } return false;',
  40. ];
  41. yield 'simple-negative' => [
  42. '<?php return ! ($foo) ;',
  43. '<?php if ($foo) { return false; } return true;',
  44. ];
  45. yield 'simple-negative II' => [
  46. '<?php return ! (!$foo && $a()) ;',
  47. '<?php if (!$foo && $a()) { return false; } return true;',
  48. ];
  49. yield 'simple-braceless' => [
  50. '<?php return (bool) ($foo) ;',
  51. '<?php if ($foo) return true; return false;',
  52. ];
  53. yield 'simple-braceless-negative' => [
  54. '<?php return ! ($foo) ;',
  55. '<?php if ($foo) return false; return true;',
  56. ];
  57. yield 'bug-consecutive-ifs' => [
  58. '<?php if ($bar) { return 1; } return (bool) ($foo) ;',
  59. '<?php if ($bar) { return 1; } if ($foo) { return true; } return false;',
  60. ];
  61. yield 'bug-consecutive-ifs-negative' => [
  62. '<?php if ($bar) { return 1; } return ! ($foo) ;',
  63. '<?php if ($bar) { return 1; } if ($foo) { return false; } return true;',
  64. ];
  65. yield 'bug-consecutive-ifs-braceless' => [
  66. '<?php if ($bar) return 1; return (bool) ($foo) ;',
  67. '<?php if ($bar) return 1; if ($foo) return true; return false;',
  68. ];
  69. yield 'bug-consecutive-ifs-braceless-negative' => [
  70. '<?php if ($bar) return 1; return ! ($foo) ;',
  71. '<?php if ($bar) return 1; if ($foo) return false; return true;',
  72. ];
  73. yield [
  74. <<<'EOT'
  75. <?php
  76. function f1() { return (bool) ($f1) ; }
  77. function f2() { return true; } return false;
  78. function f3() { return (bool) ($f3) ; }
  79. function f4() { return true; } return false;
  80. function f5() { return (bool) ($f5) ; }
  81. function f6() { return false; } return true;
  82. function f7() { return ! ($f7) ; }
  83. function f8() { return false; } return true;
  84. function f9() { return ! ($f9) ; }
  85. EOT,
  86. <<<'EOT'
  87. <?php
  88. function f1() { if ($f1) { return true; } return false; }
  89. function f2() { return true; } return false;
  90. function f3() { if ($f3) { return true; } return false; }
  91. function f4() { return true; } return false;
  92. function f5() { if ($f5) { return true; } return false; }
  93. function f6() { return false; } return true;
  94. function f7() { if ($f7) { return false; } return true; }
  95. function f8() { return false; } return true;
  96. function f9() { if ($f9) { return false; } return true; }
  97. EOT,
  98. ];
  99. yield 'preserve-comments' => [
  100. <<<'EOT'
  101. <?php
  102. // C1
  103. return (bool)
  104. # C2
  105. (
  106. /* C3 */
  107. $foo
  108. /** C4 */
  109. )
  110. // C5
  111. # C6
  112. // C7
  113. # C8
  114. /* C9 */
  115. /** C10 */
  116. // C11
  117. # C12
  118. ;
  119. /* C13 */
  120. EOT,
  121. <<<'EOT'
  122. <?php
  123. // C1
  124. if
  125. # C2
  126. (
  127. /* C3 */
  128. $foo
  129. /** C4 */
  130. )
  131. // C5
  132. {
  133. # C6
  134. return
  135. // C7
  136. true
  137. # C8
  138. ;
  139. /* C9 */
  140. }
  141. /** C10 */
  142. return
  143. // C11
  144. false
  145. # C12
  146. ;
  147. /* C13 */
  148. EOT,
  149. ];
  150. yield 'preserve-comments-braceless' => [
  151. <<<'EOT'
  152. <?php
  153. // C1
  154. return (bool)
  155. # C2
  156. (
  157. /* C3 */
  158. $foo
  159. /** C4 */
  160. )
  161. // C5
  162. # C6
  163. // C7
  164. # C8
  165. /* C9 */
  166. /** C10 */
  167. // C11
  168. # C12
  169. ;
  170. /* C13 */
  171. EOT,
  172. <<<'EOT'
  173. <?php
  174. // C1
  175. if
  176. # C2
  177. (
  178. /* C3 */
  179. $foo
  180. /** C4 */
  181. )
  182. // C5
  183. # C6
  184. return
  185. // C7
  186. true
  187. # C8
  188. ;
  189. /* C9 */
  190. /** C10 */
  191. return
  192. // C11
  193. false
  194. # C12
  195. ;
  196. /* C13 */
  197. EOT,
  198. ];
  199. yield 'else-if' => [
  200. '<?php if ($bar) { return $bar; } else return (bool) ($foo) ;',
  201. '<?php if ($bar) { return $bar; } else if ($foo) { return true; } return false;',
  202. ];
  203. yield 'else-if-negative' => [
  204. '<?php if ($bar) { return $bar; } else return ! ($foo) ;',
  205. '<?php if ($bar) { return $bar; } else if ($foo) { return false; } return true;',
  206. ];
  207. yield 'else-if-braceless' => [
  208. '<?php if ($bar) return $bar; else return (bool) ($foo) ;',
  209. '<?php if ($bar) return $bar; else if ($foo) return true; return false;',
  210. ];
  211. yield 'else-if-braceless-negative' => [
  212. '<?php if ($bar) return $bar; else return ! ($foo) ;',
  213. '<?php if ($bar) return $bar; else if ($foo) return false; return true;',
  214. ];
  215. yield 'elseif' => [
  216. '<?php if ($bar) { return $bar; } return (bool) ($foo) ;',
  217. '<?php if ($bar) { return $bar; } elseif ($foo) { return true; } return false;',
  218. ];
  219. yield 'elseif-negative' => [
  220. '<?php if ($bar) { return $bar; } return ! ($foo) ;',
  221. '<?php if ($bar) { return $bar; } elseif ($foo) { return false; } return true;',
  222. ];
  223. yield 'elseif-braceless' => [
  224. '<?php if ($bar) return $bar; return (bool) ($foo) ;',
  225. '<?php if ($bar) return $bar; elseif ($foo) return true; return false;',
  226. ];
  227. yield 'elseif-braceless-negative' => [
  228. '<?php if ($bar) return $bar; return ! ($foo) ;',
  229. '<?php if ($bar) return $bar; elseif ($foo) return false; return true;',
  230. ];
  231. yield 'no braces loops' => [
  232. '<?php
  233. function foo1(string $str, array $letters): bool
  234. {
  235. foreach ($letters as $letter)
  236. if ($str === $letter)
  237. return true;
  238. return false;
  239. }
  240. function foo2(int $z): bool
  241. {
  242. for ($i = 0; $i < 3; ++$i)
  243. if ($i === $z)
  244. return true;
  245. return false;
  246. }
  247. function foo3($y): bool
  248. {
  249. while ($x = bar())
  250. if ($x === $z)
  251. return true;
  252. return false;
  253. }
  254. ',
  255. ];
  256. yield 'alternative syntax not supported' => [
  257. '<?php
  258. if ($foo):
  259. return true;
  260. else:
  261. return false;
  262. endif;
  263. ',
  264. ];
  265. }
  266. }