SimplifiedIfReturnFixerTest.php 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. final class SimplifiedIfReturnFixerTest 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 'simple' => [
  33. '<?php return (bool) ($foo) ;',
  34. '<?php if ($foo) { return true; } return false;',
  35. ];
  36. yield 'simple-negative' => [
  37. '<?php return ! ($foo) ;',
  38. '<?php if ($foo) { return false; } return true;',
  39. ];
  40. yield 'simple-negative II' => [
  41. '<?php return ! (!$foo && $a()) ;',
  42. '<?php if (!$foo && $a()) { return false; } return true;',
  43. ];
  44. yield 'simple-braceless' => [
  45. '<?php return (bool) ($foo) ;',
  46. '<?php if ($foo) return true; return false;',
  47. ];
  48. yield 'simple-braceless-negative' => [
  49. '<?php return ! ($foo) ;',
  50. '<?php if ($foo) return false; return true;',
  51. ];
  52. yield 'bug-consecutive-ifs' => [
  53. '<?php if ($bar) { return 1; } return (bool) ($foo) ;',
  54. '<?php if ($bar) { return 1; } if ($foo) { return true; } return false;',
  55. ];
  56. yield 'bug-consecutive-ifs-negative' => [
  57. '<?php if ($bar) { return 1; } return ! ($foo) ;',
  58. '<?php if ($bar) { return 1; } if ($foo) { return false; } return true;',
  59. ];
  60. yield 'bug-consecutive-ifs-braceless' => [
  61. '<?php if ($bar) return 1; return (bool) ($foo) ;',
  62. '<?php if ($bar) return 1; if ($foo) return true; return false;',
  63. ];
  64. yield 'bug-consecutive-ifs-braceless-negative' => [
  65. '<?php if ($bar) return 1; return ! ($foo) ;',
  66. '<?php if ($bar) return 1; if ($foo) return false; return true;',
  67. ];
  68. yield [
  69. <<<'EOT'
  70. <?php
  71. function f1() { return (bool) ($f1) ; }
  72. function f2() { return true; } return false;
  73. function f3() { return (bool) ($f3) ; }
  74. function f4() { return true; } return false;
  75. function f5() { return (bool) ($f5) ; }
  76. function f6() { return false; } return true;
  77. function f7() { return ! ($f7) ; }
  78. function f8() { return false; } return true;
  79. function f9() { return ! ($f9) ; }
  80. EOT
  81. ,
  82. <<<'EOT'
  83. <?php
  84. function f1() { if ($f1) { return true; } return false; }
  85. function f2() { return true; } return false;
  86. function f3() { if ($f3) { return true; } return false; }
  87. function f4() { return true; } return false;
  88. function f5() { if ($f5) { return true; } return false; }
  89. function f6() { return false; } return true;
  90. function f7() { if ($f7) { return false; } return true; }
  91. function f8() { return false; } return true;
  92. function f9() { if ($f9) { return false; } return true; }
  93. EOT
  94. ,
  95. ];
  96. yield 'preserve-comments' => [
  97. <<<'EOT'
  98. <?php
  99. // C1
  100. return (bool)
  101. # C2
  102. (
  103. /* C3 */
  104. $foo
  105. /** C4 */
  106. )
  107. // C5
  108. # C6
  109. // C7
  110. # C8
  111. /* C9 */
  112. /** C10 */
  113. // C11
  114. # C12
  115. ;
  116. /* C13 */
  117. EOT
  118. ,
  119. <<<'EOT'
  120. <?php
  121. // C1
  122. if
  123. # C2
  124. (
  125. /* C3 */
  126. $foo
  127. /** C4 */
  128. )
  129. // C5
  130. {
  131. # C6
  132. return
  133. // C7
  134. true
  135. # C8
  136. ;
  137. /* C9 */
  138. }
  139. /** C10 */
  140. return
  141. // C11
  142. false
  143. # C12
  144. ;
  145. /* C13 */
  146. EOT
  147. ,
  148. ];
  149. yield 'preserve-comments-braceless' => [
  150. <<<'EOT'
  151. <?php
  152. // C1
  153. return (bool)
  154. # C2
  155. (
  156. /* C3 */
  157. $foo
  158. /** C4 */
  159. )
  160. // C5
  161. # C6
  162. // C7
  163. # C8
  164. /* C9 */
  165. /** C10 */
  166. // C11
  167. # C12
  168. ;
  169. /* C13 */
  170. EOT
  171. ,
  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. ];
  200. yield 'else-if' => [
  201. '<?php if ($bar) { return $bar; } else return (bool) ($foo) ;',
  202. '<?php if ($bar) { return $bar; } else if ($foo) { return true; } return false;',
  203. ];
  204. yield 'else-if-negative' => [
  205. '<?php if ($bar) { return $bar; } else return ! ($foo) ;',
  206. '<?php if ($bar) { return $bar; } else if ($foo) { return false; } return true;',
  207. ];
  208. yield 'else-if-braceless' => [
  209. '<?php if ($bar) return $bar; else return (bool) ($foo) ;',
  210. '<?php if ($bar) return $bar; else if ($foo) return true; return false;',
  211. ];
  212. yield 'else-if-braceless-negative' => [
  213. '<?php if ($bar) return $bar; else return ! ($foo) ;',
  214. '<?php if ($bar) return $bar; else if ($foo) return false; return true;',
  215. ];
  216. yield 'elseif' => [
  217. '<?php if ($bar) { return $bar; } return (bool) ($foo) ;',
  218. '<?php if ($bar) { return $bar; } elseif ($foo) { return true; } return false;',
  219. ];
  220. yield 'elseif-negative' => [
  221. '<?php if ($bar) { return $bar; } return ! ($foo) ;',
  222. '<?php if ($bar) { return $bar; } elseif ($foo) { return false; } return true;',
  223. ];
  224. yield 'elseif-braceless' => [
  225. '<?php if ($bar) return $bar; return (bool) ($foo) ;',
  226. '<?php if ($bar) return $bar; elseif ($foo) return true; return false;',
  227. ];
  228. yield 'elseif-braceless-negative' => [
  229. '<?php if ($bar) return $bar; return ! ($foo) ;',
  230. '<?php if ($bar) return $bar; elseif ($foo) return false; return true;',
  231. ];
  232. yield 'no braces loops' => [
  233. '<?php
  234. function foo1(string $str, array $letters): bool
  235. {
  236. foreach ($letters as $letter)
  237. if ($str === $letter)
  238. return true;
  239. return false;
  240. }
  241. function foo2(int $z): bool
  242. {
  243. for ($i = 0; $i < 3; ++$i)
  244. if ($i === $z)
  245. return true;
  246. return false;
  247. }
  248. function foo3($y): bool
  249. {
  250. while ($x = bar())
  251. if ($x === $z)
  252. return true;
  253. return false;
  254. }
  255. ',
  256. ];
  257. yield 'alternative syntax not supported' => [
  258. '<?php
  259. if ($foo):
  260. return true;
  261. else:
  262. return false;
  263. endif;
  264. ',
  265. ];
  266. }
  267. }