PhpUnitDedicateAssertFixerTest.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  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\ConfigurationException\InvalidFixerConfigurationException;
  14. use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion;
  15. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  16. /**
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\PhpUnit\PhpUnitDedicateAssertFixer
  20. */
  21. final class PhpUnitDedicateAssertFixerTest extends AbstractFixerTestCase
  22. {
  23. /**
  24. * @dataProvider provideTestFixCases
  25. */
  26. public function testFix(string $expected, ?string $input = null, array $config = []): void
  27. {
  28. $this->fixer->configure($config);
  29. $this->doTest($expected, $input);
  30. }
  31. public function provideTestFixCases(): array
  32. {
  33. $cases = [
  34. [
  35. self::generateTest('
  36. $this->assertNan($a);
  37. $this->assertNan($a);
  38. $this->assertTrue(test\is_nan($a));
  39. $this->assertTrue(test\a\is_nan($a));
  40. '),
  41. self::generateTest('
  42. $this->assertTrue(is_nan($a));
  43. $this->assertTrue(\is_nan($a));
  44. $this->assertTrue(test\is_nan($a));
  45. $this->assertTrue(test\a\is_nan($a));
  46. '),
  47. ],
  48. [
  49. self::generateTest('
  50. $this->assertFileExists($a);
  51. $this->assertFileNotExists($a);
  52. $this->assertFileExists($a);
  53. $this->assertFileNotExists($a);
  54. '),
  55. self::generateTest('
  56. $this->assertTrue(file_exists($a));
  57. $this->assertFalse(file_exists($a));
  58. $this->assertTrue(\file_exists($a));
  59. $this->assertFalse(\file_exists($a));
  60. '),
  61. ],
  62. [
  63. self::generateTest('
  64. $this->assertNull($a);
  65. $this->assertNotNull($a);
  66. $this->assertNull($a);
  67. $this->assertNotNull($a, "my message");
  68. '),
  69. self::generateTest('
  70. $this->assertTrue(is_null($a));
  71. $this->assertFalse(is_null($a));
  72. $this->assertTrue(\is_null($a));
  73. $this->assertFalse(\is_null($a), "my message");
  74. '),
  75. ],
  76. [
  77. self::generateTest('
  78. $this->assertEmpty($a);
  79. $this->assertNotEmpty($a);
  80. '),
  81. self::generateTest('
  82. $this->assertTrue(empty($a));
  83. $this->ASSERTFALSE(empty($a));
  84. '),
  85. ],
  86. [
  87. self::generateTest('
  88. $this->assertInfinite($a);
  89. $this->assertFinite($a, "my message");
  90. $this->assertInfinite($a);
  91. $this->assertFinite($a, "my message");
  92. '),
  93. self::generateTest('
  94. $this->assertTrue(is_infinite($a));
  95. $this->assertFalse(is_infinite($a), "my message");
  96. $this->assertTrue(\is_infinite($a));
  97. $this->assertFalse(\is_infinite($a), "my message");
  98. '),
  99. ],
  100. [
  101. self::generateTest('
  102. $this->assertArrayHasKey("test", $a);
  103. $this->assertArrayNotHasKey($b, $a, $c);
  104. '),
  105. self::generateTest('
  106. $this->assertTrue(\array_key_exists("test", $a));
  107. $this->ASSERTFALSE(array_key_exists($b, $a), $c);
  108. '),
  109. ],
  110. [
  111. self::generateTest('
  112. $this->assertTrue(is_dir($a));
  113. $this->assertTrue(is_writable($a));
  114. $this->assertTrue(is_readable($a));
  115. '),
  116. null,
  117. ['target' => PhpUnitTargetVersion::VERSION_5_0],
  118. ],
  119. [
  120. self::generateTest('
  121. $this->assertTrue(is_dir($a));
  122. $this->assertTrue(is_writable($a));
  123. $this->assertTrue(is_readable($a));
  124. '),
  125. null,
  126. ['target' => PhpUnitTargetVersion::VERSION_3_0],
  127. ],
  128. [
  129. self::generateTest('
  130. $this->assertDirectoryNotExists($a);
  131. $this->assertNotIsWritable($a);
  132. $this->assertNotIsReadable($a);
  133. '),
  134. self::generateTest('
  135. $this->assertFalse(is_dir($a));
  136. $this->assertFalse(is_writable($a));
  137. $this->assertFalse(is_readable($a));
  138. '),
  139. ['target' => PhpUnitTargetVersion::VERSION_5_6],
  140. ],
  141. [
  142. self::generateTest('
  143. $this->assertDirectoryExists($a);
  144. $this->assertIsWritable($a);
  145. $this->assertIsReadable($a);
  146. '),
  147. self::generateTest('
  148. $this->assertTrue(is_dir($a));
  149. $this->assertTrue(is_writable($a));
  150. $this->assertTrue(is_readable($a));
  151. '),
  152. ['target' => PhpUnitTargetVersion::VERSION_NEWEST],
  153. ],
  154. ];
  155. foreach (['array', 'bool', 'callable', 'double', 'float', 'int', 'integer', 'long', 'numeric', 'object', 'resource', 'real', 'scalar', 'string'] as $type) {
  156. $cases[] = [
  157. self::generateTest(sprintf('$this->assertInternalType(\'%s\', $a);', $type)),
  158. self::generateTest(sprintf('$this->assertTrue(is_%s($a));', $type)),
  159. ];
  160. $cases[] = [
  161. self::generateTest(sprintf('$this->assertNotInternalType(\'%s\', $a);', $type)),
  162. self::generateTest(sprintf('$this->assertFalse(is_%s($a));', $type)),
  163. ];
  164. }
  165. $cases[] = [
  166. self::generateTest('$this->assertInternalType(\'float\', $a, "my message");'),
  167. self::generateTest('$this->assertTrue(is_float( $a), "my message");'),
  168. ];
  169. $cases[] = [
  170. self::generateTest('$this->assertInternalType(\'float\', $a);'),
  171. self::generateTest('$this->assertTrue(\IS_FLOAT($a));'),
  172. ];
  173. $cases[] = [
  174. self::generateTest('$this->assertInternalType(#
  175. \'float\'#
  176. , #
  177. $a#
  178. #
  179. )#
  180. ;'),
  181. self::generateTest('$this->assertTrue(#
  182. \IS_FLOAT#
  183. (#
  184. $a#
  185. )#
  186. )#
  187. ;'),
  188. ];
  189. $cases[] = [
  190. self::generateTest('static::assertInternalType(\'float\', $a);'),
  191. self::generateTest('static::assertTrue(is_float( $a));'),
  192. ];
  193. $cases[] = [
  194. self::generateTest('self::assertInternalType(\'float\', $a);'),
  195. self::generateTest('self::assertTrue(is_float( $a));'),
  196. ];
  197. $cases[] = [
  198. self::generateTest('static::assertNull($a);'),
  199. self::generateTest('static::assertTrue(is_null($a));'),
  200. ];
  201. $cases[] = [
  202. self::generateTest('self::assertNull($a);'),
  203. self::generateTest('self::assertTrue(is_null($a));'),
  204. ];
  205. $cases[] = [
  206. self::generateTest('SELF::assertNull($a);'),
  207. self::generateTest('SELF::assertTrue(is_null($a));'),
  208. ];
  209. return $cases;
  210. }
  211. /**
  212. * @dataProvider provideNotFixCases
  213. */
  214. public function testNotFix(string $expected): void
  215. {
  216. $this->doTest($expected);
  217. }
  218. public function provideNotFixCases(): array
  219. {
  220. return [
  221. [
  222. self::generateTest('echo $this->assertTrue;'),
  223. ],
  224. [
  225. self::generateTest('
  226. $this->assertTrue(is_null);
  227. $this->assertTrue(is_int($a) && $b);
  228. $this->assertFalse(is_nan($a));
  229. $this->assertTrue(is_int($a) || \is_bool($b));
  230. $this->assertTrue($a&&is_int($a));
  231. static::assertTrue(is_null);
  232. self::assertTrue(is_null);
  233. '),
  234. ],
  235. 'not in class' => [
  236. '<?php self::assertTrue(is_null($a));',
  237. ],
  238. ];
  239. }
  240. public function testInvalidConfig(): void
  241. {
  242. $this->expectException(InvalidFixerConfigurationException::class);
  243. $this->expectExceptionMessageMatches('/^\[php_unit_dedicate_assert\] Invalid configuration: The option "target" .*\.$/');
  244. $this->fixer->configure(['target' => '_unknown_']);
  245. }
  246. /**
  247. * @dataProvider provideTestAssertCountCases
  248. */
  249. public function testAssertCount(string $expected, ?string $input = null): void
  250. {
  251. if (null === $input) {
  252. $expected = sprintf($expected, 'count');
  253. } else {
  254. $input = sprintf($input, 'count');
  255. }
  256. $this->doTest($expected, $input);
  257. }
  258. /**
  259. * @dataProvider provideTestAssertCountCases
  260. */
  261. public function testAssertCountFromSizeOf(string $expected, ?string $input = null): void
  262. {
  263. if (null === $input) {
  264. $expected = sprintf($expected, 'sizeof');
  265. } else {
  266. $input = sprintf($input, 'sizeof');
  267. }
  268. $this->doTest($expected, $input);
  269. }
  270. public function provideTestAssertCountCases(): array
  271. {
  272. return [
  273. // positive fixing
  274. 'assert same' => [
  275. self::generateTest('$this->assertCount(1, $a);'),
  276. self::generateTest('$this->assertSame(1, %s($a));'),
  277. ],
  278. 'assert equals' => [
  279. self::generateTest('$this->assertCount(2, $b);'),
  280. self::generateTest('$this->assertEquals(2, %s($b));'),
  281. ],
  282. // negative fixing
  283. 'assert not same' => [
  284. self::generateTest('$this->assertNotCount(11, $c);'),
  285. self::generateTest('$this->assertNotSame(11, %s($c));'),
  286. ],
  287. 'assert not equals' => [
  288. self::generateTest('$this->assertNotCount(122, $d);'),
  289. self::generateTest('$this->assertNotEquals(122, %s($d));'),
  290. ],
  291. // other cases
  292. 'assert same with namespace' => [
  293. self::generateTest('$this->assertCount(1, $a);'),
  294. self::generateTest('$this->assertSame(1, \%s($a));'),
  295. ],
  296. 'no spacing' => [
  297. self::generateTest('$this->assertCount(1,$a);'),
  298. self::generateTest('$this->assertSame(1,%s($a));'),
  299. ],
  300. 'lot of spacing' => [
  301. self::generateTest('$this->assertCount(
  302. 1
  303. ,
  304. '.'
  305. '.'
  306. $a
  307. '.'
  308. )
  309. ;'),
  310. self::generateTest('$this->assertSame(
  311. 1
  312. ,
  313. %s
  314. (
  315. $a
  316. )
  317. )
  318. ;'),
  319. ],
  320. 'lot of fix cases' => [
  321. self::generateTest('
  322. $this->assertCount(1, $a);
  323. $this->assertCount(2, $a);
  324. $this->assertCount(3, $a);
  325. $this->assertNotCount(4, $a);
  326. $this->assertCount(5, $a, "abc");
  327. $this->assertCount(6, $a, "def");
  328. '),
  329. self::generateTest('
  330. $this->assertSame(1, %1$s($a));
  331. $this->assertSame(2, %1$s($a));
  332. $this->assertEquals(3, %1$s($a));
  333. $this->assertNotSame(4, %1$s($a));
  334. $this->assertEquals(5, %1$s($a), "abc");
  335. $this->assertSame(6, \%1$s($a), "def");
  336. '),
  337. ],
  338. 'comment handling' => [
  339. self::generateTest('$this->assertCount(# 0
  340. 1# 1
  341. ,# 2
  342. # 3
  343. # 4
  344. $a# 5
  345. # 6
  346. )# 7
  347. ;# 8'),
  348. self::generateTest('$this->assertSame(# 0
  349. 1# 1
  350. ,# 2
  351. %s# 3
  352. (# 4
  353. $a# 5
  354. )# 6
  355. )# 7
  356. ;# 8'),
  357. ],
  358. 'do not fix 1' => [
  359. self::generateTest('$this->assertSame($b, %s($a));'),
  360. ],
  361. 'do not fix 2' => [
  362. self::generateTest('$this->assertSame(b(), %s($a));'),
  363. ],
  364. 'do not fix 3' => [
  365. self::generateTest('$this->assertSame(1.0, %s($a));'),
  366. ],
  367. 'do not fix 4' => [
  368. self::generateTest('$this->assertSame(1);'),
  369. ],
  370. 'do not fix 5' => [
  371. self::generateTest('$this->assertSame(1, "%s");'),
  372. ],
  373. 'do not fix 6' => [
  374. self::generateTest('$this->test(); // $this->assertSame($b, %s($a));'),
  375. ],
  376. 'do not fix 7' => [
  377. self::generateTest('$this->assertSame(2, count($array) - 1);'),
  378. ],
  379. 'do not fix 8' => [
  380. self::generateTest('
  381. Foo::assertSame(1, sizeof($a));
  382. $this->assertSame(1, sizeof2(2));
  383. $this->assertSame(1, sizeof::foo);
  384. '),
  385. ],
  386. ];
  387. }
  388. /**
  389. * @dataProvider provideTestAssertCountCasingCases
  390. */
  391. public function testAssertCountCasing(string $expected, string $input): void
  392. {
  393. $expected = sprintf($expected, 'count');
  394. $input = sprintf($input, 'COUNT');
  395. $this->doTest($expected, $input);
  396. }
  397. /**
  398. * @dataProvider provideTestAssertCountCasingCases
  399. */
  400. public function testAssertCountFromSizeOfCasing(string $expected, string $input): void
  401. {
  402. $expected = sprintf($expected, 'sizeof');
  403. $input = sprintf($input, 'SIZEOF');
  404. $this->doTest($expected, $input);
  405. }
  406. public function provideTestAssertCountCasingCases(): array
  407. {
  408. return [
  409. [
  410. self::generateTest('$this->assertCount(1, $a);'),
  411. self::generateTest('$this->assertSame(1, %s($a));'),
  412. ],
  413. [
  414. self::generateTest('$this->assertCount(1, $a);'),
  415. self::generateTest('$this->assertSame(1, \%s($a));'),
  416. ],
  417. ];
  418. }
  419. /**
  420. * @requires PHP 7.3
  421. * @dataProvider provideFix73Cases
  422. */
  423. public function testFix73(string $expected, string $input): void
  424. {
  425. $this->doTest($expected, $input);
  426. }
  427. public function provideFix73Cases(): array
  428. {
  429. return [
  430. [
  431. self::generateTest('$this->assertNan($a, );'),
  432. self::generateTest('$this->assertTrue(is_nan($a), );'),
  433. ],
  434. [
  435. self::generateTest('$this->assertNan($a);'),
  436. self::generateTest('$this->assertTrue(is_nan($a, ));'),
  437. ],
  438. [
  439. self::generateTest('$this->assertNan($a, );'),
  440. self::generateTest('$this->assertTrue(is_nan($a, ), );'),
  441. ],
  442. [
  443. self::generateTest('$this->assertInternalType(\'array\', $a,);'),
  444. self::generateTest('$this->assertTrue(is_array($a,),);'),
  445. ],
  446. [
  447. self::generateTest('$this->assertNan($b);'),
  448. self::generateTest('$this->assertTrue(\is_nan($b,));'),
  449. ],
  450. [
  451. self::generateTest('$this->assertFileExists($f, \'message\',);'),
  452. self::generateTest('$this->assertTrue(file_exists($f,), \'message\',);'),
  453. ],
  454. [
  455. self::generateTest('$this->assertNan($y , );'),
  456. self::generateTest('$this->assertTrue(is_nan($y) , );'),
  457. ],
  458. ];
  459. }
  460. /**
  461. * @dataProvider provideFix81Cases
  462. * @requires PHP 8.1
  463. */
  464. public function testFix81(string $expected, ?string $input = null): void
  465. {
  466. $this->doTest($expected, $input);
  467. }
  468. public function provideFix81Cases(): \Generator
  469. {
  470. yield [
  471. self::generateTest('$a = $this->assertTrue(...);'),
  472. ];
  473. }
  474. private static function generateTest(string $content): string
  475. {
  476. return "<?php final class FooTest extends \\PHPUnit_Framework_TestCase {\n public function testSomething() {\n ".$content."\n }\n}\n";
  477. }
  478. }