PhpUnitDedicateAssertFixerTest.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. <?php
  2. /*
  3. * This file is part of PHP CS Fixer.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  7. *
  8. * This source file is subject to the MIT license that is bundled
  9. * with this source code in the file LICENSE.
  10. */
  11. namespace PhpCsFixer\Tests\Fixer\PhpUnit;
  12. use PhpCsFixer\Fixer\PhpUnit\PhpUnitTargetVersion;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author SpacePossum
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\PhpUnit\PhpUnitDedicateAssertFixer
  20. */
  21. final class PhpUnitDedicateAssertFixerTest extends AbstractFixerTestCase
  22. {
  23. /**
  24. * @param string $expected
  25. * @param null|string $input
  26. *
  27. * @dataProvider provideTestFixCases
  28. */
  29. public function testFix($expected, $input = null, array $config = [])
  30. {
  31. $this->fixer->configure($config);
  32. $this->doTest($expected, $input);
  33. }
  34. /**
  35. * @param string $expected
  36. * @param null|string $input
  37. *
  38. * @dataProvider provideTestFixLegacyCases
  39. * @group legacy
  40. * @expectedDeprecation Option "functions" for rule "php_unit_dedicate_assert" is deprecated and will be removed in version 3.0. Use option "target" instead.
  41. */
  42. public function testFixLegacy($expected, $input = null)
  43. {
  44. $defaultFunctions = [
  45. 'array_key_exists',
  46. 'empty',
  47. 'file_exists',
  48. 'is_array',
  49. 'is_bool',
  50. 'is_callable',
  51. 'is_double',
  52. 'is_float',
  53. 'is_infinite',
  54. 'is_int',
  55. 'is_integer',
  56. 'is_long',
  57. 'is_nan',
  58. 'is_null',
  59. 'is_numeric',
  60. 'is_object',
  61. 'is_real',
  62. 'is_resource',
  63. 'is_scalar',
  64. 'is_string',
  65. ];
  66. $this->fixer->configure(['functions' => $defaultFunctions]);
  67. $this->doTest($expected, $input);
  68. }
  69. public function provideTestFixCases()
  70. {
  71. $cases = [
  72. [
  73. self::generateTest('
  74. $this->assertNan($a);
  75. $this->assertNan($a);
  76. $this->assertTrue(test\is_nan($a));
  77. $this->assertTrue(test\a\is_nan($a));
  78. '),
  79. self::generateTest('
  80. $this->assertTrue(is_nan($a));
  81. $this->assertTrue(\is_nan($a));
  82. $this->assertTrue(test\is_nan($a));
  83. $this->assertTrue(test\a\is_nan($a));
  84. '),
  85. ],
  86. [
  87. self::generateTest('
  88. $this->assertFileExists($a);
  89. $this->assertFileNotExists($a);
  90. $this->assertFileExists($a);
  91. $this->assertFileNotExists($a);
  92. '),
  93. self::generateTest('
  94. $this->assertTrue(file_exists($a));
  95. $this->assertFalse(file_exists($a));
  96. $this->assertTrue(\file_exists($a));
  97. $this->assertFalse(\file_exists($a));
  98. '),
  99. ],
  100. [
  101. self::generateTest('
  102. $this->assertNull($a);
  103. $this->assertNotNull($a);
  104. $this->assertNull($a);
  105. $this->assertNotNull($a, "my message");
  106. '),
  107. self::generateTest('
  108. $this->assertTrue(is_null($a));
  109. $this->assertFalse(is_null($a));
  110. $this->assertTrue(\is_null($a));
  111. $this->assertFalse(\is_null($a), "my message");
  112. '),
  113. ],
  114. [
  115. self::generateTest('
  116. $this->assertEmpty($a);
  117. $this->assertNotEmpty($a);
  118. '),
  119. self::generateTest('
  120. $this->assertTrue(empty($a));
  121. $this->ASSERTFALSE(empty($a));
  122. '),
  123. ],
  124. [
  125. self::generateTest('
  126. $this->assertInfinite($a);
  127. $this->assertFinite($a, "my message");
  128. $this->assertInfinite($a);
  129. $this->assertFinite($a, "my message");
  130. '),
  131. self::generateTest('
  132. $this->assertTrue(is_infinite($a));
  133. $this->assertFalse(is_infinite($a), "my message");
  134. $this->assertTrue(\is_infinite($a));
  135. $this->assertFalse(\is_infinite($a), "my message");
  136. '),
  137. ],
  138. [
  139. self::generateTest('
  140. $this->assertArrayHasKey("test", $a);
  141. $this->assertArrayNotHasKey($b, $a, $c);
  142. '),
  143. self::generateTest('
  144. $this->assertTrue(\array_key_exists("test", $a));
  145. $this->ASSERTFALSE(array_key_exists($b, $a), $c);
  146. '),
  147. ],
  148. [
  149. self::generateTest('
  150. $this->assertTrue(is_dir($a));
  151. $this->assertTrue(is_writable($a));
  152. $this->assertTrue(is_readable($a));
  153. '),
  154. null,
  155. ],
  156. [
  157. self::generateTest('
  158. $this->assertTrue(is_dir($a));
  159. $this->assertTrue(is_writable($a));
  160. $this->assertTrue(is_readable($a));
  161. '),
  162. null,
  163. ['target' => PhpUnitTargetVersion::VERSION_3_0],
  164. ],
  165. [
  166. self::generateTest('
  167. $this->assertDirectoryNotExists($a);
  168. $this->assertNotIsWritable($a);
  169. $this->assertNotIsReadable($a);
  170. '),
  171. self::generateTest('
  172. $this->assertFalse(is_dir($a));
  173. $this->assertFalse(is_writable($a));
  174. $this->assertFalse(is_readable($a));
  175. '),
  176. ['target' => PhpUnitTargetVersion::VERSION_5_6],
  177. ],
  178. [
  179. self::generateTest('
  180. $this->assertDirectoryExists($a);
  181. $this->assertIsWritable($a);
  182. $this->assertIsReadable($a);
  183. '),
  184. self::generateTest('
  185. $this->assertTrue(is_dir($a));
  186. $this->assertTrue(is_writable($a));
  187. $this->assertTrue(is_readable($a));
  188. '),
  189. ['target' => PhpUnitTargetVersion::VERSION_NEWEST],
  190. ],
  191. ];
  192. foreach (['array', 'bool', 'callable', 'double', 'float', 'int', 'integer', 'long', 'numeric', 'object', 'resource', 'real', 'scalar', 'string'] as $type) {
  193. $cases[] = [
  194. self::generateTest(sprintf('$this->assertInternalType(\'%s\', $a);', $type)),
  195. self::generateTest(sprintf('$this->assertTrue(is_%s($a));', $type)),
  196. ];
  197. $cases[] = [
  198. self::generateTest(sprintf('$this->assertNotInternalType(\'%s\', $a);', $type)),
  199. self::generateTest(sprintf('$this->assertFalse(is_%s($a));', $type)),
  200. ];
  201. }
  202. $cases[] = [
  203. self::generateTest('$this->assertInternalType(\'float\', $a, "my message");'),
  204. self::generateTest('$this->assertTrue(is_float( $a), "my message");'),
  205. ];
  206. $cases[] = [
  207. self::generateTest('$this->assertInternalType(\'float\', $a);'),
  208. self::generateTest('$this->assertTrue(\IS_FLOAT($a));'),
  209. ];
  210. $cases[] = [
  211. self::generateTest('$this->assertInternalType(#
  212. \'float\'#
  213. , #
  214. $a#
  215. #
  216. )#
  217. ;'),
  218. self::generateTest('$this->assertTrue(#
  219. \IS_FLOAT#
  220. (#
  221. $a#
  222. )#
  223. )#
  224. ;'),
  225. ];
  226. $cases[] = [
  227. self::generateTest('static::assertInternalType(\'float\', $a);'),
  228. self::generateTest('static::assertTrue(is_float( $a));'),
  229. ];
  230. $cases[] = [
  231. self::generateTest('self::assertInternalType(\'float\', $a);'),
  232. self::generateTest('self::assertTrue(is_float( $a));'),
  233. ];
  234. $cases[] = [
  235. self::generateTest('static::assertNull($a);'),
  236. self::generateTest('static::assertTrue(is_null($a));'),
  237. ];
  238. $cases[] = [
  239. self::generateTest('self::assertNull($a);'),
  240. self::generateTest('self::assertTrue(is_null($a));'),
  241. ];
  242. $cases[] = [
  243. self::generateTest('SELF::assertNull($a);'),
  244. self::generateTest('SELF::assertTrue(is_null($a));'),
  245. ];
  246. return $cases;
  247. }
  248. public function provideTestFixLegacyCases()
  249. {
  250. return array_filter($this->provideTestFixCases(), static function (array $case) { return !isset($case[2]); });
  251. }
  252. /**
  253. * @param string $expected
  254. *
  255. * @dataProvider provideNotFixCases
  256. */
  257. public function testNotFix($expected)
  258. {
  259. $this->doTest($expected);
  260. }
  261. public function provideNotFixCases()
  262. {
  263. return [
  264. [
  265. self::generateTest('echo $this->assertTrue;'),
  266. ],
  267. [
  268. self::generateTest('
  269. $this->assertTrue(is_null);
  270. $this->assertTrue(is_int($a) && $b);
  271. $this->assertFalse(is_nan($a));
  272. $this->assertTrue(is_int($a) || \is_bool($b));
  273. $this->assertTrue($a&&is_int($a));
  274. static::assertTrue(is_null);
  275. self::assertTrue(is_null);
  276. '),
  277. ],
  278. 'not in class' => [
  279. '<?php self::assertTrue(is_null($a));',
  280. ],
  281. ];
  282. }
  283. /**
  284. * @group legacy
  285. * @expectedDeprecation Passing "functions" at the root of the configuration for rule "php_unit_dedicate_assert" is deprecated and will not be supported in 3.0, use "functions" => array(...) option instead.
  286. */
  287. public function testLegacyConfig()
  288. {
  289. $this->fixer->configure(['file_exists']);
  290. $this->doTest(
  291. self::generateTest('
  292. $this->assertFileExists($a);
  293. $this->assertTrue(is_infinite($a));
  294. '),
  295. self::generateTest('
  296. $this->assertTrue(file_exists($a));
  297. $this->assertTrue(is_infinite($a));
  298. ')
  299. );
  300. }
  301. /**
  302. * @group legacy
  303. * @expectedDeprecation Option "functions" for rule "php_unit_dedicate_assert" is deprecated and will be removed in version 3.0. Use option "target" instead.
  304. */
  305. public function testConfig()
  306. {
  307. $this->fixer->configure(['functions' => ['file_exists']]);
  308. $this->doTest(
  309. self::generateTest('
  310. $this->assertFileExists($a);
  311. $this->assertTrue(is_infinite($a));
  312. '),
  313. self::generateTest('
  314. $this->assertTrue(file_exists($a));
  315. $this->assertTrue(is_infinite($a));
  316. ')
  317. );
  318. }
  319. public function testInvalidConfig()
  320. {
  321. $this->expectException(\PhpCsFixer\ConfigurationException\InvalidFixerConfigurationException::class);
  322. $this->expectExceptionMessageMatches('/^\[php_unit_dedicate_assert\] Invalid configuration: The option "target" .*\.$/');
  323. $this->fixer->configure(['target' => '_unknown_']);
  324. }
  325. /**
  326. * @param string $expected
  327. * @param null|string $input
  328. *
  329. * @dataProvider provideTestAssertCountCases
  330. */
  331. public function testAssertCount($expected, $input = null)
  332. {
  333. if (null === $input) {
  334. $expected = sprintf($expected, 'count');
  335. } else {
  336. $input = sprintf($input, 'count');
  337. }
  338. $this->doTest($expected, $input);
  339. }
  340. /**
  341. * @param string $expected
  342. * @param null|string $input
  343. *
  344. * @dataProvider provideTestAssertCountCases
  345. */
  346. public function testAssertCountFromSizeOf($expected, $input = null)
  347. {
  348. if (null === $input) {
  349. $expected = sprintf($expected, 'sizeof');
  350. } else {
  351. $input = sprintf($input, 'sizeof');
  352. }
  353. $this->doTest($expected, $input);
  354. }
  355. public function provideTestAssertCountCases()
  356. {
  357. return [
  358. // positive fixing
  359. 'assert same' => [
  360. self::generateTest('$this->assertCount(1, $a);'),
  361. self::generateTest('$this->assertSame(1, %s($a));'),
  362. ],
  363. 'assert equals' => [
  364. self::generateTest('$this->assertCount(2, $b);'),
  365. self::generateTest('$this->assertEquals(2, %s($b));'),
  366. ],
  367. // negative fixing
  368. 'assert not same' => [
  369. self::generateTest('$this->assertNotCount(11, $c);'),
  370. self::generateTest('$this->assertNotSame(11, %s($c));'),
  371. ],
  372. 'assert not equals' => [
  373. self::generateTest('$this->assertNotCount(122, $d);'),
  374. self::generateTest('$this->assertNotEquals(122, %s($d));'),
  375. ],
  376. // other cases
  377. 'assert same with namespace' => [
  378. self::generateTest('$this->assertCount(1, $a);'),
  379. self::generateTest('$this->assertSame(1, \%s($a));'),
  380. ],
  381. 'no spacing' => [
  382. self::generateTest('$this->assertCount(1,$a);'),
  383. self::generateTest('$this->assertSame(1,%s($a));'),
  384. ],
  385. 'lot of spacing' => [
  386. self::generateTest('$this->assertCount(
  387. 1
  388. ,
  389. '.'
  390. '.'
  391. $a
  392. '.'
  393. )
  394. ;'),
  395. self::generateTest('$this->assertSame(
  396. 1
  397. ,
  398. %s
  399. (
  400. $a
  401. )
  402. )
  403. ;'),
  404. ],
  405. 'lot of fix cases' => [
  406. self::generateTest('
  407. $this->assertCount(1, $a);
  408. $this->assertCount(2, $a);
  409. $this->assertCount(3, $a);
  410. $this->assertNotCount(4, $a);
  411. $this->assertCount(5, $a, "abc");
  412. $this->assertCount(6, $a, "def");
  413. '),
  414. self::generateTest('
  415. $this->assertSame(1, %1$s($a));
  416. $this->assertSame(2, %1$s($a));
  417. $this->assertEquals(3, %1$s($a));
  418. $this->assertNotSame(4, %1$s($a));
  419. $this->assertEquals(5, %1$s($a), "abc");
  420. $this->assertSame(6, \%1$s($a), "def");
  421. '),
  422. ],
  423. 'comment handling' => [
  424. self::generateTest('$this->assertCount(# 0
  425. 1# 1
  426. ,# 2
  427. # 3
  428. # 4
  429. $a# 5
  430. # 6
  431. )# 7
  432. ;# 8'),
  433. self::generateTest('$this->assertSame(# 0
  434. 1# 1
  435. ,# 2
  436. %s# 3
  437. (# 4
  438. $a# 5
  439. )# 6
  440. )# 7
  441. ;# 8'),
  442. ],
  443. 'do not fix 1' => [
  444. self::generateTest('$this->assertSame($b, %s($a));'),
  445. ],
  446. 'do not fix 2' => [
  447. self::generateTest('$this->assertSame(b(), %s($a));'),
  448. ],
  449. 'do not fix 3' => [
  450. self::generateTest('$this->assertSame(1.0, %s($a));'),
  451. ],
  452. 'do not fix 4' => [
  453. self::generateTest('$this->assertSame(1);'),
  454. ],
  455. 'do not fix 5' => [
  456. self::generateTest('$this->assertSame(1, "%s");'),
  457. ],
  458. 'do not fix 6' => [
  459. self::generateTest('$this->test(); // $this->assertSame($b, %s($a));'),
  460. ],
  461. 'do not fix 7' => [
  462. self::generateTest('$this->assertSame(2, count($array) - 1);'),
  463. ],
  464. 'do not fix 8' => [
  465. self::generateTest('
  466. Foo::assertSame(1, sizeof($a));
  467. $this->assertSame(1, sizeof2(2));
  468. $this->assertSame(1, sizeof::foo);
  469. '),
  470. ],
  471. ];
  472. }
  473. /**
  474. * @param string $expected
  475. * @param string $input
  476. *
  477. * @dataProvider provideTestAssertCountCasingCases
  478. */
  479. public function testAssertCountCasing($expected, $input)
  480. {
  481. $expected = sprintf($expected, 'count');
  482. $input = sprintf($input, 'COUNT');
  483. $this->doTest($expected, $input);
  484. }
  485. /**
  486. * @param string $expected
  487. * @param string $input
  488. *
  489. * @dataProvider provideTestAssertCountCasingCases
  490. */
  491. public function testAssertCountFromSizeOfCasing($expected, $input)
  492. {
  493. $expected = sprintf($expected, 'sizeof');
  494. $input = sprintf($input, 'SIZEOF');
  495. $this->doTest($expected, $input);
  496. }
  497. public function provideTestAssertCountCasingCases()
  498. {
  499. return [
  500. [
  501. self::generateTest('$this->assertCount(1, $a);'),
  502. self::generateTest('$this->assertSame(1, %s($a));'),
  503. ],
  504. [
  505. self::generateTest('$this->assertCount(1, $a);'),
  506. self::generateTest('$this->assertSame(1, \%s($a));'),
  507. ],
  508. ];
  509. }
  510. /**
  511. * @param string $expected
  512. * @param string $input
  513. *
  514. * @requires PHP 7.3
  515. * @dataProvider provideFix73Cases
  516. */
  517. public function testFix73($expected, $input)
  518. {
  519. $this->doTest($expected, $input);
  520. }
  521. public function provideFix73Cases()
  522. {
  523. return [
  524. [
  525. self::generateTest('$this->assertNan($a, );'),
  526. self::generateTest('$this->assertTrue(is_nan($a), );'),
  527. ],
  528. [
  529. self::generateTest('$this->assertNan($a);'),
  530. self::generateTest('$this->assertTrue(is_nan($a, ));'),
  531. ],
  532. [
  533. self::generateTest('$this->assertNan($a, );'),
  534. self::generateTest('$this->assertTrue(is_nan($a, ), );'),
  535. ],
  536. [
  537. self::generateTest('$this->assertInternalType(\'array\', $a,);'),
  538. self::generateTest('$this->assertTrue(is_array($a,),);'),
  539. ],
  540. [
  541. self::generateTest('$this->assertNan($b);'),
  542. self::generateTest('$this->assertTrue(\is_nan($b,));'),
  543. ],
  544. [
  545. self::generateTest('$this->assertFileExists($f, \'message\',);'),
  546. self::generateTest('$this->assertTrue(file_exists($f,), \'message\',);'),
  547. ],
  548. [
  549. self::generateTest('$this->assertNan($y , );'),
  550. self::generateTest('$this->assertTrue(is_nan($y) , );'),
  551. ],
  552. ];
  553. }
  554. /**
  555. * @param string $content
  556. *
  557. * @return string
  558. */
  559. private static function generateTest($content)
  560. {
  561. return "<?php final class FooTest extends \\PHPUnit_Framework_TestCase {\n public function testSomething() {\n ".$content."\n }\n}\n";
  562. }
  563. }