NoEmptyCommentFixerTest.php 9.0 KB

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