ClassKeywordRemoveFixerTest.php 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  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\LanguageConstruct;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author Sullivan Senechal <soullivaneuh@gmail.com>
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\LanguageConstruct\ClassKeywordRemoveFixer
  20. */
  21. final class ClassKeywordRemoveFixerTest 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 function provideFixCases(): array
  31. {
  32. return [
  33. [
  34. "<?php
  35. use Foo\\Bar\\Thing;
  36. echo 'Foo\\Bar\\Thing';
  37. ",
  38. '<?php
  39. use Foo\Bar\Thing;
  40. echo Thing::class;
  41. ',
  42. ],
  43. [
  44. '<?php
  45. use Foo\\Bar;
  46. '."
  47. echo 'Foo\\Bar\\Thing';
  48. ",
  49. '<?php
  50. use Foo\Bar;
  51. '.'
  52. echo Bar\Thing::class;
  53. ',
  54. ],
  55. [
  56. "<?php
  57. namespace Foo;
  58. use Foo\\Bar;
  59. echo 'Foo\\Bar\\Baz';
  60. ",
  61. '<?php
  62. namespace Foo;
  63. use Foo\\Bar;
  64. echo \\Foo\\Bar\\Baz::class;
  65. ',
  66. ],
  67. [
  68. "<?php
  69. use Foo\\Bar\\Thing as Alias;
  70. echo 'Foo\\Bar\\Thing';
  71. ",
  72. '<?php
  73. use Foo\Bar\Thing as Alias;
  74. echo Alias::class;
  75. ',
  76. ],
  77. [
  78. "<?php
  79. use Foo\\Bar\\Dummy;
  80. use Foo\\Bar\\Thing as Alias;
  81. echo 'Foo\\Bar\\Dummy';
  82. echo 'Foo\\Bar\\Thing';
  83. ",
  84. '<?php
  85. use Foo\Bar\Dummy;
  86. use Foo\Bar\Thing as Alias;
  87. echo Dummy::class;
  88. echo Alias::class;
  89. ',
  90. ],
  91. [
  92. "<?php
  93. echo 'DateTime';
  94. ",
  95. '<?php
  96. echo \DateTime::class;
  97. ',
  98. ],
  99. [
  100. "<?php
  101. echo 'Thing';
  102. ",
  103. '<?php
  104. echo Thing::class;
  105. ',
  106. ],
  107. [
  108. "<?php
  109. class Foo {
  110. public function amazingFunction() {
  111. echo 'Thing';
  112. }
  113. }
  114. ",
  115. '<?php
  116. class Foo {
  117. public function amazingFunction() {
  118. echo Thing::class;
  119. }
  120. }
  121. ',
  122. ],
  123. [
  124. "<?php
  125. namespace A\\B;
  126. use Foo\\Bar;
  127. echo 'Foo\\Bar';
  128. ",
  129. '<?php
  130. namespace A\B;
  131. use Foo\Bar;
  132. echo Bar::class;
  133. ',
  134. ],
  135. [
  136. "<?php
  137. namespace A\\B {
  138. class D {
  139. }
  140. }
  141. namespace B\\B {
  142. class D {
  143. }
  144. }
  145. namespace C {
  146. use A\\B\\D;
  147. var_dump('A\\B\\D');
  148. }
  149. namespace C1 {
  150. use B\\B\\D;
  151. var_dump('B\\B\\D');
  152. }
  153. ",
  154. '<?php
  155. namespace A\B {
  156. class D {
  157. }
  158. }
  159. namespace B\B {
  160. class D {
  161. }
  162. }
  163. namespace C {
  164. use A\B\D;
  165. var_dump(D::class);
  166. }
  167. namespace C1 {
  168. use B\B\D;
  169. var_dump(D::class);
  170. }
  171. ',
  172. ],
  173. [
  174. '<?php
  175. namespace Foo;
  176. class Bar extends Baz {
  177. public function a() {
  178. return self::class;
  179. }
  180. public function b() {
  181. return static::class;
  182. }
  183. public function c() {
  184. return parent::class;
  185. }
  186. }
  187. ',
  188. ],
  189. [
  190. "<?php
  191. namespace Foo;
  192. var_dump('Foo\\Bar\\Baz');
  193. ",
  194. '<?php
  195. namespace Foo;
  196. var_dump(Bar\\Baz::class);
  197. ',
  198. ],
  199. [
  200. "<?php
  201. namespace Foo\\Bar;
  202. var_dump('Foo\\Bar\\Baz');
  203. ",
  204. '<?php
  205. namespace Foo\\Bar;
  206. var_dump(Baz::class);
  207. ',
  208. ],
  209. [
  210. "<?php
  211. use Foo\\Bar\\{ClassA, ClassB, ClassC as C};
  212. use function Foo\\Bar\\{fn_a, fn_b, fn_c};
  213. use const Foo\\Bar\\{ConstA, ConstB, ConstC};
  214. echo 'Foo\\Bar\\ClassB';
  215. echo 'Foo\\Bar\\ClassC';
  216. ",
  217. '<?php
  218. use Foo\Bar\{ClassA, ClassB, ClassC as C};
  219. use function Foo\Bar\{fn_a, fn_b, fn_c};
  220. use const Foo\Bar\{ConstA, ConstB, ConstC};
  221. echo ClassB::class;
  222. echo C::class;
  223. ',
  224. "<?php
  225. namespace {
  226. var_dump('Foo');
  227. }
  228. namespace A {
  229. use B\\C;
  230. var_dump('B\\C');
  231. }
  232. namespace {
  233. var_dump('Bar\\Baz');
  234. }
  235. namespace B {
  236. use A\\C\\D;
  237. var_dump('A\\C\\D');
  238. }
  239. namespace {
  240. var_dump('Qux\\Quux');
  241. }
  242. ",
  243. '<?php
  244. namespace {
  245. var_dump(Foo::class);
  246. }
  247. namespace A {
  248. use B\\C;
  249. var_dump(C::class);
  250. }
  251. namespace {
  252. var_dump(Bar\\Baz::class);
  253. }
  254. namespace B {
  255. use A\\C\\D;
  256. var_dump(D::class);
  257. }
  258. namespace {
  259. var_dump(Qux\\Quux::class);
  260. }
  261. ',
  262. ],
  263. ];
  264. }
  265. /**
  266. * @requires PHP <8.0
  267. */
  268. public function testFixPrePHP80(): void
  269. {
  270. $this->doTest(
  271. "<?php echo 'DateTime'
  272. # a
  273. /* b */?>
  274. ",
  275. '<?php echo \
  276. DateTime:: # a
  277. /* b */ class?>
  278. '
  279. );
  280. }
  281. /**
  282. * @requires PHP 8.0
  283. */
  284. public function testNotFixPHP8(): void
  285. {
  286. $this->doTest(
  287. "<?php
  288. echo 'Thing';
  289. echo \$thing::class;
  290. ",
  291. '<?php
  292. echo Thing::class;
  293. echo $thing::class;
  294. '
  295. );
  296. }
  297. }