NoEmptyCommentFixerTest.php 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  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\Comment;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. use PhpCsFixer\Tokenizer\Tokens;
  15. /**
  16. * @author SpacePossum
  17. *
  18. * @internal
  19. *
  20. * @covers \PhpCsFixer\Fixer\Comment\NoEmptyCommentFixer
  21. */
  22. final class NoEmptyCommentFixerTest extends AbstractFixerTestCase
  23. {
  24. /**
  25. * @dataProvider provideFixCases
  26. */
  27. public function testFix(string $expected, ?string $input = null): void
  28. {
  29. $this->doTest($expected, $input);
  30. }
  31. public function provideFixCases()
  32. {
  33. return [
  34. // fix cases
  35. [
  36. '<?php
  37. echo 0;
  38. echo 1;
  39. ',
  40. '<?php
  41. echo 0;//
  42. echo 1;
  43. ',
  44. ],
  45. [
  46. '<?php
  47. echo 0;
  48. echo 1;
  49. ',
  50. '<?php
  51. echo 0;//
  52. echo 1;
  53. ',
  54. ],
  55. [
  56. '<?php
  57. echo 1;
  58. ',
  59. '<?php
  60. echo 1;//
  61. ',
  62. ],
  63. [
  64. '<?php
  65. echo 2;
  66. '.'
  67. echo 1;
  68. ',
  69. '<?php
  70. echo 2;
  71. //
  72. echo 1;
  73. ',
  74. ],
  75. [
  76. '<?php
  77. ?>',
  78. '<?php
  79. //?>',
  80. ],
  81. [
  82. '<?php
  83. '.'
  84. ',
  85. '<?php
  86. //
  87. ',
  88. ],
  89. [
  90. '<?php
  91. '.'
  92. ',
  93. '<?php
  94. #
  95. ',
  96. ],
  97. [
  98. '<?php
  99. '.'
  100. ',
  101. '<?php
  102. /**/
  103. ',
  104. ],
  105. [
  106. '<?php
  107. echo 0;echo 1;
  108. ',
  109. '<?php
  110. echo 0;/**/echo 1;
  111. ',
  112. ],
  113. [
  114. '<?php
  115. echo 0;echo 1;
  116. ',
  117. '<?php
  118. echo 0;/**//**//**/echo 1/**/;
  119. ',
  120. ],
  121. [
  122. '<?php
  123. ',
  124. '<?php
  125. //',
  126. ],
  127. [
  128. '<?php
  129. ',
  130. '<?php
  131. /*
  132. */',
  133. ],
  134. [
  135. '<?php
  136. '.'
  137. '.'
  138. '.'
  139. '.'
  140. ',
  141. '<?php
  142. //
  143. //
  144. //
  145. /**///
  146. ',
  147. ],
  148. [
  149. "<?php\n \n \n \n \n ",
  150. "<?php\n //\n //\n //\n /**///\n ",
  151. ],
  152. [
  153. "<?php\r \r \r \r \r ",
  154. "<?php\r //\r //\r //\r /**///\r ",
  155. ],
  156. [
  157. "<?php\r\n \r\n \r\n \r\n \r\n ",
  158. "<?php\r\n //\r\n //\r\n //\r\n /**///\r\n ",
  159. ],
  160. [
  161. "<?php\necho 1;\r\recho 2;",
  162. "<?php\necho 1;\r//\recho 2;",
  163. ],
  164. // do not fix cases
  165. [
  166. '<?php
  167. // a
  168. // /**/
  169. // #
  170. /* b */ // s
  171. # c',
  172. ],
  173. [
  174. '<?php
  175. // This comment could be nicely formatted.
  176. //
  177. //
  178. // For that, it could have some empty comment lines inside.
  179. //
  180. ## A 1
  181. ##
  182. ##
  183. ## A 2
  184. ##
  185. // B 1
  186. //
  187. // B 2
  188. ## C 1
  189. ##
  190. ## C 2
  191. $foo = 1;
  192. //
  193. // a
  194. //
  195. $bar = 2;
  196. ',
  197. ],
  198. [
  199. '<?php
  200. '.'
  201. ',
  202. '<?php
  203. /*
  204. *
  205. */
  206. ',
  207. ],
  208. [
  209. '<?php
  210. '.'
  211. ',
  212. '<?php
  213. /********
  214. *
  215. ********/
  216. ',
  217. ],
  218. [
  219. '<?php /* a */',
  220. '<?php /* *//* a *//* */',
  221. ],
  222. [
  223. '<?php
  224. '.'
  225. /* a */
  226. '.'
  227. ',
  228. '<?php
  229. //
  230. /* a */
  231. //
  232. ',
  233. ],
  234. ];
  235. }
  236. /**
  237. * @param string $source valid PHP source code
  238. * @param int $startIndex start index of the comment block
  239. * @param int $endIndex expected index of the last token of the block
  240. * @param bool $isEmpty expected value of empty flag returned
  241. *
  242. * @dataProvider provideCommentBlockCases
  243. */
  244. public function testGetCommentBlock(string $source, int $startIndex, int $endIndex, bool $isEmpty): void
  245. {
  246. Tokens::clearCache();
  247. $tokens = Tokens::fromCode($source);
  248. static::assertTrue($tokens[$startIndex]->isComment(), sprintf('Misconfiguration of test, expected comment token at index "%d".', $startIndex));
  249. $method = new \ReflectionMethod($this->fixer, 'getCommentBlock');
  250. $method->setAccessible(true);
  251. list($foundStart, $foundEnd, $foundIsEmpty) = $method->invoke($this->fixer, $tokens, $startIndex);
  252. static::assertSame($startIndex, $foundStart, 'Find start index of block failed.');
  253. static::assertSame($endIndex, $foundEnd, 'Find end index of block failed.');
  254. static::assertSame($isEmpty, $foundIsEmpty, 'Is empty comment block detection failed.');
  255. }
  256. public function provideCommentBlockCases()
  257. {
  258. $cases = [
  259. [
  260. '<?php // a',
  261. 1,
  262. 1,
  263. false,
  264. ],
  265. [
  266. '<?php
  267. // This comment could be nicely formatted.
  268. //
  269. //
  270. // For that, it could have some empty comment lines inside.
  271. // ',
  272. 2,
  273. 11,
  274. false,
  275. ],
  276. [
  277. '<?php
  278. /**///',
  279. 1,
  280. 1,
  281. true,
  282. ],
  283. [
  284. '<?php
  285. //
  286. //
  287. #
  288. #
  289. ',
  290. 5,
  291. 8,
  292. true,
  293. ],
  294. [
  295. '<?php
  296. //
  297. //
  298. //
  299. //
  300. ',
  301. 5,
  302. 8,
  303. true,
  304. ],
  305. [
  306. '<?php
  307. //
  308. //
  309. //
  310. //
  311. ',
  312. 1,
  313. 3,
  314. true,
  315. ],
  316. [
  317. str_replace("\n", "\r", "<?php\n//\n//\n\n//\n//\n"),
  318. 1,
  319. 3,
  320. true,
  321. ],
  322. [
  323. str_replace("\n", "\r\n", "<?php\n//\n//\n\n//\n//\n"),
  324. 1,
  325. 3,
  326. true,
  327. ],
  328. [
  329. '<?php
  330. //
  331. //
  332. ',
  333. 1,
  334. 1,
  335. true,
  336. ],
  337. [
  338. '<?php
  339. //
  340. //
  341. $a; ',
  342. 1,
  343. 4,
  344. true,
  345. ],
  346. [
  347. '<?php
  348. //',
  349. 1,
  350. 1,
  351. true,
  352. ],
  353. ];
  354. $src = '<?php
  355. // a2
  356. // /*4*/
  357. // #6
  358. /* b8 */ // s10
  359. # c12';
  360. foreach ([2, 4, 6] as $i) {
  361. $cases[] = [$src, $i, 7, false];
  362. }
  363. $cases[] = [$src, 8, 8, false];
  364. $cases[] = [$src, 10, 11, false];
  365. $cases[] = [$src, 12, 12, false];
  366. return $cases;
  367. }
  368. }