PhpUnitNamespacedFixerTest.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332
  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\PhpUnit;
  13. use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion;
  14. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  15. use PhpCsFixer\Tokenizer\Tokens;
  16. /**
  17. * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
  18. *
  19. * @internal
  20. *
  21. * @covers \PhpCsFixer\Fixer\PhpUnit\PhpUnitNamespacedFixer
  22. */
  23. final class PhpUnitNamespacedFixerTest extends AbstractFixerTestCase
  24. {
  25. /**
  26. * @param array<string, mixed> $config
  27. *
  28. * @dataProvider provideFixCases
  29. */
  30. public function testFix(string $expected, ?string $input = null, array $config = []): void
  31. {
  32. $this->fixer->configure($config);
  33. $this->doTest($expected, $input);
  34. }
  35. public static function provideFixCases(): iterable
  36. {
  37. yield 'class_mapping' => [
  38. '<?php new PHPUnit\Framework\Error\Error();',
  39. '<?php new PHPUnit_Framework_Error();',
  40. ];
  41. yield 'class_mapping_bogus_fqcn' => [
  42. '<?php new \PHPUnit\Framework\MockObject\Stub\ReturnStub();',
  43. '<?php new \PHPUnit_Framework_MockObject_Stub_Return();',
  44. ];
  45. yield 'class_mapping_bogus_fqcn_lowercase' => [
  46. '<?php new \PHPUnit\Framework\MockObject\Stub\ReturnStub();',
  47. '<?php new \phpunit_framework_mockobject_stub_return();',
  48. ];
  49. yield 'class_mapping_bogus_fqcn_uppercase' => [
  50. '<?php new \PHPUnit\Framework\MockObject\Stub\ReturnStub();',
  51. '<?php new \PHPUNIT_FRAMEWORK_MOCKOBJECT_STUB_RETURN();',
  52. ];
  53. yield [
  54. '<?php
  55. final class MyTest extends \PHPUnit\Framework\TestCase
  56. {
  57. }',
  58. '<?php
  59. final class MyTest extends \PHPUnit_Framework_TestCase
  60. {
  61. }',
  62. ];
  63. yield [
  64. '<?php
  65. final class TextDiffTest extends PHPUnit\Framework\TestCase
  66. {
  67. }',
  68. '<?php
  69. final class TextDiffTest extends PHPUnit_Framework_TestCase
  70. {
  71. }',
  72. ];
  73. yield [
  74. '<?php
  75. use \PHPUnit\Framework\TestCase;
  76. final class TextDiffTest extends TestCase
  77. {
  78. }',
  79. '<?php
  80. use \PHPUnit_Framework_TestCase;
  81. final class TextDiffTest extends PHPUnit_Framework_TestCase
  82. {
  83. }',
  84. ];
  85. yield [
  86. '<?php
  87. use \PHPUnit\FRAMEWORK\TestCase as TestAlias;
  88. final class TextDiffTest extends TestAlias
  89. {
  90. }',
  91. '<?php
  92. use \PHPUnit_FRAMEWORK_TestCase as TestAlias;
  93. final class TextDiffTest extends TestAlias
  94. {
  95. }',
  96. ];
  97. yield [
  98. '<?php
  99. namespace Foo;
  100. use PHPUnit\Framework\TestCase;
  101. final class TextDiffTest extends TestCase
  102. {
  103. }',
  104. '<?php
  105. namespace Foo;
  106. use PHPUnit_Framework_TestCase;
  107. final class TextDiffTest extends PHPUnit_Framework_TestCase
  108. {
  109. }',
  110. ];
  111. yield [
  112. '<?php
  113. namespace Foo;
  114. use PHPUnit\Framework\TestCase as TestAlias;
  115. final class TextDiffTest extends TestAlias
  116. {
  117. }',
  118. '<?php
  119. namespace Foo;
  120. use PHPUnit_Framework_TestCase as TestAlias;
  121. final class TextDiffTest extends TestAlias
  122. {
  123. }',
  124. ];
  125. yield [
  126. '<?php
  127. final class MyTest extends \PHPUnit\Framework\TestCase
  128. {
  129. public function aaa()
  130. {
  131. $a = new PHPUnit_Framework_Assert();
  132. $b = new PHPUnit_Framework_BaseTestListener();
  133. $c = new PHPUnit_Framework_TestListener();
  134. $d1 = new PHPUnit_Aaa();
  135. $d2 = new PHPUnit_Aaa_Bbb();
  136. $d3 = new PHPUnit_Aaa_Bbb_Ccc();
  137. $d4 = new PHPUnit_Aaa_Bbb_Ccc_Ddd();
  138. $d5 = new PHPUnit_Aaa_Bbb_Ccc_Ddd_Eee();
  139. }
  140. }',
  141. '<?php
  142. final class MyTest extends \PHPUnit_Framework_TestCase
  143. {
  144. public function aaa()
  145. {
  146. $a = new PHPUnit_Framework_Assert();
  147. $b = new PHPUnit_Framework_BaseTestListener();
  148. $c = new PHPUnit_Framework_TestListener();
  149. $d1 = new PHPUnit_Aaa();
  150. $d2 = new PHPUnit_Aaa_Bbb();
  151. $d3 = new PHPUnit_Aaa_Bbb_Ccc();
  152. $d4 = new PHPUnit_Aaa_Bbb_Ccc_Ddd();
  153. $d5 = new PHPUnit_Aaa_Bbb_Ccc_Ddd_Eee();
  154. }
  155. }',
  156. ['target' => PhpUnitTargetVersion::VERSION_4_8],
  157. ];
  158. yield [
  159. '<?php
  160. final class MyTest extends \PHPUnit\Framework\TestCase
  161. {
  162. public function aaa()
  163. {
  164. $a = new PHPUnit\Framework\Assert();
  165. $b = new PHPUnit\Framework\BaseTestListener();
  166. $c = new PHPUnit\Framework\TestListener();
  167. $d1 = new PHPUnit_Aaa();
  168. $d2 = new PHPUnit_Aaa_Bbb();
  169. $d3 = new PHPUnit_Aaa_Bbb_Ccc();
  170. $d4 = new PHPUnit_Aaa_Bbb_Ccc_Ddd();
  171. $d5 = new PHPUnit_Aaa_Bbb_Ccc_Ddd_Eee();
  172. }
  173. }',
  174. '<?php
  175. final class MyTest extends \PHPUnit_Framework_TestCase
  176. {
  177. public function aaa()
  178. {
  179. $a = new PHPUnit_Framework_Assert();
  180. $b = new PHPUnit_Framework_BaseTestListener();
  181. $c = new PHPUnit_Framework_TestListener();
  182. $d1 = new PHPUnit_Aaa();
  183. $d2 = new PHPUnit_Aaa_Bbb();
  184. $d3 = new PHPUnit_Aaa_Bbb_Ccc();
  185. $d4 = new PHPUnit_Aaa_Bbb_Ccc_Ddd();
  186. $d5 = new PHPUnit_Aaa_Bbb_Ccc_Ddd_Eee();
  187. }
  188. }',
  189. ['target' => PhpUnitTargetVersion::VERSION_5_7],
  190. ];
  191. yield [
  192. '<?php
  193. final class MyTest extends \PHPUnit\Framework\TestCase
  194. {
  195. public function aaa()
  196. {
  197. $a = new PHPUnit\Framework\Assert();
  198. $b = new PHPUnit\Framework\BaseTestListener();
  199. $c = new PHPUnit\Framework\TestListener();
  200. $d1 = new PHPUnit\Aaa();
  201. $d2 = new PHPUnit\Aaa\Bbb();
  202. $d3 = new PHPUnit\Aaa\Bbb\Ccc();
  203. $d4 = new PHPUnit\Aaa\Bbb\Ccc\Ddd();
  204. $d5 = new PHPUnit\Aaa\Bbb\Ccc\Ddd\Eee();
  205. }
  206. }',
  207. '<?php
  208. final class MyTest extends \PHPUnit_Framework_TestCase
  209. {
  210. public function aaa()
  211. {
  212. $a = new PHPUnit_Framework_Assert();
  213. $b = new PHPUnit_Framework_BaseTestListener();
  214. $c = new PHPUnit_Framework_TestListener();
  215. $d1 = new PHPUnit_Aaa();
  216. $d2 = new PHPUnit_Aaa_Bbb();
  217. $d3 = new PHPUnit_Aaa_Bbb_Ccc();
  218. $d4 = new PHPUnit_Aaa_Bbb_Ccc_Ddd();
  219. $d5 = new PHPUnit_Aaa_Bbb_Ccc_Ddd_Eee();
  220. }
  221. }',
  222. ['target' => PhpUnitTargetVersion::VERSION_6_0],
  223. ];
  224. yield [
  225. '<?php
  226. echo \PHPUnit\Runner\Version::id();
  227. echo \PHPUnit\Runner\Version::id();
  228. ',
  229. '<?php
  230. echo \PHPUnit_Runner_Version::id();
  231. echo \PHPUnit_Runner_Version::id();
  232. ',
  233. ];
  234. yield [
  235. '<?php
  236. final class MyTest extends TestCase
  237. {
  238. const PHPUNIT_FOO = "foo";
  239. }',
  240. ];
  241. yield [
  242. '<?php
  243. final class MyTest extends TestCase
  244. {
  245. const FOO = Bar::PHPUNIT_FOO;
  246. }',
  247. ];
  248. yield [
  249. '<?php
  250. define(\'PHPUNIT_COMPOSER_INSTALL\', dirname(__DIR__).\'/vendor/autoload.php\');
  251. require PHPUNIT_COMPOSER_INSTALL;',
  252. ];
  253. }
  254. /**
  255. * @dataProvider provideClassIsFixedCases
  256. */
  257. public function testClassIsFixed(string $class): void
  258. {
  259. $this->fixer->configure(['target' => PhpUnitTargetVersion::VERSION_NEWEST]);
  260. Tokens::clearCache();
  261. $tokens = Tokens::fromCode(sprintf('<?php new %s();', $class));
  262. $this->fixer->fix(self::getTestFile(), $tokens);
  263. self::assertTrue($tokens->isChanged());
  264. self::assertStringNotContainsString('_', $tokens->generateCode());
  265. }
  266. public static function provideClassIsFixedCases(): iterable
  267. {
  268. $classmap = require __DIR__.'/../../../vendor/composer/autoload_classmap.php';
  269. foreach ($classmap as $class => $file) {
  270. if (str_starts_with($class, 'PHPUnit_')) {
  271. yield $file => [$class];
  272. }
  273. }
  274. }
  275. /**
  276. * @dataProvider provideFix81Cases
  277. *
  278. * @requires PHP 8.1
  279. */
  280. public function testFix81(string $expected, ?string $input = null): void
  281. {
  282. $this->doTest($expected, $input);
  283. }
  284. public static function provideFix81Cases(): iterable
  285. {
  286. yield [
  287. '<?php
  288. final class MyTest extends TestCase
  289. {
  290. final public const PHPUNIT_FOO_A = "foo";
  291. final public const PHPUNIT_FOO_B = Bar::PHPUNIT_FOO;
  292. }',
  293. ];
  294. }
  295. }