PowToExponentiationFixerTest.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  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\Alias;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @internal
  16. *
  17. * @covers \PhpCsFixer\AbstractFunctionReferenceFixer
  18. * @covers \PhpCsFixer\Fixer\Alias\PowToExponentiationFixer
  19. */
  20. final class PowToExponentiationFixerTest extends AbstractFixerTestCase
  21. {
  22. /**
  23. * @dataProvider provideFixCases
  24. */
  25. public function testFix(string $expected, ?string $input = null): void
  26. {
  27. $this->doTest($expected, $input);
  28. }
  29. public static function provideFixCases(): iterable
  30. {
  31. yield [
  32. '<?php 1**2;',
  33. '<?php pow(1,2);',
  34. ];
  35. yield [
  36. '<?php 1**2?>',
  37. '<?php pow(1,2)?>',
  38. ];
  39. yield [
  40. '<?php 1.2**2.3;',
  41. '<?php pow(1.2,2.3);',
  42. ];
  43. yield [
  44. '<?php echo (-2)** 3;',
  45. '<?php echo pow(-2, 3);',
  46. ];
  47. yield [
  48. '<?php echo (-2)**( -3);',
  49. '<?php echo pow(-2, -3);',
  50. ];
  51. yield [
  52. '<?php echo (-2)**( 1-3);',
  53. '<?php echo pow(-2, 1-3);',
  54. ];
  55. yield [
  56. '<?php echo (-2)**( -1-3);',
  57. '<?php echo pow(-2, -1-3);',
  58. ];
  59. yield [
  60. '<?php $a = 3** +2;',
  61. '<?php $a = pow(3, +2);',
  62. ];
  63. yield [
  64. '<?php $a--**++$b;',
  65. '<?php pow($a--,++$b);',
  66. ];
  67. yield [
  68. '<?php 1//
  69. #
  70. **2/**/ /** */;',
  71. '<?php pow(1//
  72. #
  73. ,2/**/ /** */);',
  74. ];
  75. yield [
  76. '<?php /**/a(3/**/,4)**$pow;//pow(1,2);',
  77. '<?php pow/**/(a(3/**/,4),$pow);//pow(1,2);',
  78. ];
  79. yield [
  80. '<?php \a\pow(5,6);7**8?>',
  81. '<?php \a\pow(5,6);pow(7,8)?>',
  82. ];
  83. yield [
  84. '<?php (9**10)**(11**12);',
  85. '<?php pow(pow(9,10),pow(11,12));',
  86. ];
  87. yield [
  88. '<?php (1 + 2)**( 3 * 4);',
  89. '<?php pow(1 + 2, 3 * 4);',
  90. ];
  91. yield [
  92. '<?php ($b = 4)** 3;',
  93. '<?php pow($b = 4, 3);',
  94. ];
  95. yield [
  96. '<?php 13**14;',
  97. '<?php \pow(13,14);',
  98. ];
  99. yield [
  100. '<?php $a = 15 + (16** 17)** 18;',
  101. '<?php $a = 15 + \pow(\pow(16, 17), 18);',
  102. ];
  103. yield [
  104. '<?php $a = $b** $c($d + 1);',
  105. '<?php $a = pow($b, $c($d + 1));',
  106. ];
  107. yield [
  108. '<?php $a = ($a+$b)** ($c-$d);',
  109. '<?php $a = pow(($a+$b), ($c-$d));',
  110. ];
  111. yield [
  112. "<?php \$a = 2**( '1'.'2'). 2;",
  113. "<?php \$a = pow(2, '1'.'2'). 2;",
  114. ];
  115. yield [
  116. '<?php A::B** 2;\A\B\C::B** 2;',
  117. '<?php pow(A::B, 2);pow(\A\B\C::B, 2);',
  118. ];
  119. yield [
  120. '<?php $obj->{$bar}** $obj->{$foo};',
  121. '<?php pow($obj->{$bar}, $obj->{$foo});',
  122. ];
  123. yield [
  124. '<?php echo ${$bar}** ${$foo};',
  125. '<?php echo pow(${$bar}, ${$foo});',
  126. ];
  127. yield [
  128. '<?php echo $a[2^3+1]->test(1,2)** $b[2+$c];',
  129. '<?php echo pow($a[2^3+1]->test(1,2), $b[2+$c]);',
  130. ];
  131. yield [
  132. '<?php (int)"2"**(float)"3.0";',
  133. '<?php pow((int)"2",(float)"3.0");',
  134. ];
  135. yield [
  136. '<?php namespace\Foo::BAR** 2;',
  137. '<?php pow(namespace\Foo::BAR, 2);',
  138. ];
  139. yield [
  140. '<?php (-1)**( (-2)**( (-3)**( (-4)**( (-5)**( (-6)**( (-7)**( (-8)**( (-9)** 3))))))));',
  141. '<?php pow(-1, pow(-2, pow(-3, pow(-4, pow(-5, pow(-6, pow(-7, pow(-8, pow(-9, 3)))))))));',
  142. ];
  143. yield [
  144. '<?php
  145. $z = 1**2;
  146. $a = 1**( 2**( 3**( 4**( 5**( 6**( 7**( 8**( 9** 3))))))));
  147. $b = 1**( 2**( 3**( 4**( 5**( 6**( 7**( 8**( 9** 3))))))));
  148. $d = 1**2;
  149. ',
  150. '<?php
  151. $z = pow(1,2);
  152. $a = \pow(1, \poW(2, \pOw(3, \pOW(4, \Pow(5, \PoW(6, \POw(7, \POW(8, \pow(9, 3)))))))));
  153. $b = \pow(1, \pow(2, \pow(3, \pow(4, \pow(5, \pow(6, \pow(7, \pow(8, \pow(9, 3)))))))));
  154. $d = pow(1,2);
  155. ',
  156. ];
  157. yield [
  158. '<?php $b = 3** __LINE__;',
  159. '<?php $b = pow(3, __LINE__);',
  160. ];
  161. yield [
  162. '<?php
  163. ($a-$b)**(
  164. ($a-$b)**(
  165. ($a-$b)**(
  166. ($a-$b)**(
  167. ($a-$b)**($a-$b)
  168. ))));',
  169. '<?php
  170. pow($a-$b,
  171. pow($a-$b,
  172. pow($a-$b,
  173. pow($a-$b,
  174. pow($a-$b,$a-$b)
  175. ))));',
  176. ];
  177. yield [
  178. '<?php (-1)**( $a** pow(1,2,3, ($a-3)** 4));',
  179. '<?php pow(-1, pow($a, pow(1,2,3, pow($a-3, 4))));',
  180. ];
  181. yield [
  182. '<?php 1**2 /**/ ?>',
  183. '<?php pow(1,2) /**/ ?>',
  184. ];
  185. yield [
  186. '<?php ($$a)**( $$b);',
  187. '<?php pow($$a, $$b);',
  188. ];
  189. yield [
  190. '<?php [1, 2, 3, 4][$x]** 2;',
  191. '<?php pow([1, 2, 3, 4][$x], 2);',
  192. ];
  193. yield [
  194. '<?php echo +$a** 2;',
  195. '<?php echo pow(+$a, 2);',
  196. ];
  197. yield [
  198. '<?php
  199. interface Test
  200. {
  201. public function pow($a, $b);
  202. }',
  203. ];
  204. yield [
  205. '<?php
  206. interface Test
  207. {
  208. public function &pow($a, $b);
  209. }',
  210. ];
  211. yield [
  212. '<?php echo $a[1]** $b[2+5];',
  213. '<?php echo pow($a[1], $b[2+5]);',
  214. ];
  215. yield [
  216. '<?php pow($b, ...$a);',
  217. ];
  218. yield [
  219. '<?php echo +$a** 2;',
  220. '<?php echo pow(+$a, 2,);',
  221. ];
  222. yield [
  223. '<?php echo +$a** 2/*1*//*2*/;',
  224. '<?php echo pow(+$a, 2/*1*/,/*2*/);',
  225. ];
  226. yield [
  227. '<?php echo 10_0** 2;',
  228. '<?php echo pow(10_0, 2);',
  229. ];
  230. }
  231. /**
  232. * @dataProvider provideFixPre80Cases
  233. *
  234. * @requires PHP <8.0
  235. */
  236. public function testFixPre80(string $expected, string $input = null): void
  237. {
  238. $this->doTest($expected, $input);
  239. }
  240. public static function provideFixPre80Cases(): iterable
  241. {
  242. yield [
  243. '<?php echo $a{1}** $b{2+5};',
  244. '<?php echo pow($a{1}, $b{2+5});',
  245. ];
  246. }
  247. /**
  248. * @dataProvider provideNotFixCases
  249. */
  250. public function testNotFix(string $expected): void
  251. {
  252. $this->doTest($expected);
  253. }
  254. public static function provideNotFixCases(): iterable
  255. {
  256. yield [
  257. '<?php pow(); ++$a;++$a;++$a;++$a;++$a;++$a;// pow(1,2);',
  258. ];
  259. yield [
  260. '<?php pow(5); ++$a;++$a;++$a;++$a;++$a;++$a;# pow(1,2);',
  261. ];
  262. yield [
  263. '<?php pow(5,1,1); ++$a;++$a;++$a;++$a;++$a;++$a;/* pow(1,2); */',
  264. ];
  265. yield [
  266. '<?php \a\pow(4,3); ++$a;++$a;++$a;++$a;++$a;++$a;/** pow(1,2); */',
  267. ];
  268. }
  269. /**
  270. * @requires PHP 8.0
  271. *
  272. * @dataProvider provideFix80Cases
  273. */
  274. public function testFix80(string $expected, string $input): void
  275. {
  276. $this->doTest($expected, $input);
  277. }
  278. public static function provideFix80Cases(): iterable
  279. {
  280. yield [
  281. '<?php echo $a[2^3+1]?->test(1,2)** $b[2+$c];',
  282. '<?php echo pow($a[2^3+1]?->test(1,2), $b[2+$c]);',
  283. ];
  284. }
  285. }