NonPrintableCharacterFixerTest.php 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  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\Basic;
  12. use PhpCsFixer\ConfigurationException\InvalidForEnvFixerConfigurationException;
  13. use PhpCsFixer\Tests\Test\AbstractFixerTestCase;
  14. /**
  15. * @author Ivan Boprzenkov <ivan.borzenkov@gmail.com>
  16. *
  17. * @internal
  18. *
  19. * @covers \PhpCsFixer\Fixer\Basic\NonPrintableCharacterFixer
  20. */
  21. final class NonPrintableCharacterFixerTest 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. /**
  34. * @param string $expected
  35. * @param null|string $input
  36. *
  37. * @dataProvider provideFixCases
  38. */
  39. public function testFixWithoutEscapeSequences($expected, $input = null)
  40. {
  41. $this->fixer->configure([
  42. 'use_escape_sequences_in_strings' => false,
  43. ]);
  44. $this->doTest($expected, $input);
  45. }
  46. public function provideFixCases()
  47. {
  48. return [
  49. [
  50. '<?php echo "Hello World !";',
  51. '<?php echo "'.pack('H*', 'e2808b').'Hello'.pack('H*', 'e28087').'World'.pack('H*', 'c2a0').'!";',
  52. ],
  53. [
  54. '<?php echo "Hello World !";',
  55. '<?php echo "'.
  56. pack('H*', 'e2808b').
  57. pack('H*', 'e2808b').
  58. pack('H*', 'e2808b').
  59. pack('H*', 'e2808b').
  60. pack('H*', 'e2808b').
  61. pack('H*', 'e2808b').
  62. 'Hello World !";',
  63. ],
  64. [
  65. '<?php
  66. // echo
  67. echo "Hello World !";',
  68. '<?php
  69. // ec'.pack('H*', 'e2808b').'ho
  70. echo "Hello'.pack('H*', 'e280af').'World'.pack('H*', 'c2a0').'!";',
  71. ],
  72. [
  73. '<?php
  74. /**
  75. * @param string $p Param
  76. */
  77. function f(string $p)
  78. {
  79. echo $p;
  80. }',
  81. '<?php
  82. /**
  83. * @param '.pack('H*', 'e2808b').'string $p Param
  84. */
  85. function f(string $p)
  86. {
  87. echo $p;
  88. }',
  89. ],
  90. [
  91. '<?php echo "$a[0] ${a}";',
  92. '<?php echo "$a'.pack('H*', 'e2808b').'[0]'.pack('H*', 'e2808b').' ${a'.pack('H*', 'e2808b').'}";',
  93. ],
  94. [
  95. '<?php echo \'12345\';?>abc<?php ?>',
  96. '<?php echo \'123'.pack('H*', 'e2808b').'45\';?>a'.pack('H*', 'e2808b').'bc<?php ?>',
  97. ],
  98. ];
  99. }
  100. /**
  101. * @param string $expected
  102. * @param null|string $input
  103. *
  104. * @dataProvider provideFixWithEscapeSequencesInStringsCases
  105. * @requires PHP 7.0
  106. */
  107. public function testFixWithEscapeSequencesInStrings($expected, $input = null)
  108. {
  109. $this->fixer->configure([
  110. 'use_escape_sequences_in_strings' => true,
  111. ]);
  112. $this->doTest($expected, $input);
  113. }
  114. public function provideFixWithEscapeSequencesInStringsCases()
  115. {
  116. return [
  117. [
  118. '<?php
  119. /**
  120. * @param string $p Param
  121. */
  122. function f(string $p)
  123. {
  124. echo $p;
  125. }',
  126. '<?php
  127. /**
  128. * @param '.pack('H*', 'e2808b').'string $p Param
  129. */
  130. function f(string $p)
  131. {
  132. echo $p;
  133. }',
  134. ],
  135. [
  136. '<?php echo \'FooBar\\\\\';',
  137. ],
  138. [
  139. '<?php echo "Foo\u{200b}Bar";',
  140. '<?php echo "Foo'.pack('H*', 'e2808b').'Bar";',
  141. ],
  142. [
  143. '<?php echo "Foo\u{200b}Bar";',
  144. '<?php echo \'Foo'.pack('H*', 'e2808b').'Bar\';',
  145. ],
  146. [
  147. '<?php echo "Foo\u{200b} Bar \\\\n \\\\ \$variableToEscape";',
  148. '<?php echo \'Foo'.pack('H*', 'e2808b').' Bar \n \ $variableToEscape\';',
  149. ],
  150. [
  151. '<?php echo <<<\'TXT\'
  152. FooBar\
  153. TXT;
  154. ',
  155. ],
  156. [
  157. '<?php echo <<<TXT
  158. Foo\u{200b}Bar
  159. TXT;
  160. ',
  161. '<?php echo <<<TXT
  162. Foo'.pack('H*', 'e2808b').'Bar
  163. TXT;
  164. ',
  165. ],
  166. [
  167. '<?php echo <<<TXT
  168. Foo\u{200b}Bar
  169. TXT;
  170. ',
  171. '<?php echo <<<\'TXT\'
  172. Foo'.pack('H*', 'e2808b').'Bar
  173. TXT;
  174. ',
  175. ],
  176. [
  177. '<?php echo <<<TXT
  178. Foo\u{200b} Bar \\\\n \\\\ \$variableToEscape
  179. TXT;
  180. ',
  181. '<?php echo <<<\'TXT\'
  182. Foo'.pack('H*', 'e2808b').' Bar \n \ $variableToEscape
  183. TXT;
  184. ',
  185. ],
  186. [
  187. '<?php echo \'。\';',
  188. ],
  189. [
  190. <<<'EXPECTED'
  191. <?php echo "Double \" quote \u{200b} inside";
  192. EXPECTED
  193. ,
  194. sprintf(<<<'INPUT'
  195. <?php echo 'Double " quote %s inside';
  196. INPUT
  197. , pack('H*', 'e2808b')),
  198. ],
  199. [
  200. <<<'EXPECTED'
  201. <?php echo "Single ' quote \u{200b} inside";
  202. EXPECTED
  203. ,
  204. sprintf(<<<'INPUT'
  205. <?php echo 'Single \' quote %s inside';
  206. INPUT
  207. , pack('H*', 'e2808b')),
  208. ],
  209. [
  210. <<<'EXPECTED'
  211. <?php echo <<<STRING
  212. Quotes ' and " to be handled \u{200b} properly \\' and \\"
  213. STRING
  214. ;
  215. EXPECTED
  216. ,
  217. sprintf(<<<'INPUT'
  218. <?php echo <<<'STRING'
  219. Quotes ' and " to be handled %s properly \' and \"
  220. STRING
  221. ;
  222. INPUT
  223. , pack('H*', 'e2808b')),
  224. ],
  225. [
  226. <<<'EXPECTED'
  227. <?php echo "\\\u{200b}\"";
  228. EXPECTED
  229. ,
  230. sprintf(<<<'INPUT'
  231. <?php echo '\\%s"';
  232. INPUT
  233. , pack('H*', 'e2808b')),
  234. ],
  235. [
  236. <<<'EXPECTED'
  237. <?php echo "\\\u{200b}'";
  238. EXPECTED
  239. ,
  240. sprintf(<<<'INPUT'
  241. <?php echo '\\%s\'';
  242. INPUT
  243. , pack('H*', 'e2808b')),
  244. ],
  245. [
  246. <<<'EXPECTED'
  247. <?php echo "Backslash 1 \\ \u{200b}";
  248. EXPECTED
  249. ,
  250. sprintf(<<<'INPUT'
  251. <?php echo 'Backslash 1 \ %s';
  252. INPUT
  253. , pack('H*', 'e2808b')),
  254. ],
  255. [
  256. <<<'EXPECTED'
  257. <?php echo "Backslash 2 \\ \u{200b}";
  258. EXPECTED
  259. ,
  260. sprintf(<<<'INPUT'
  261. <?php echo 'Backslash 2 \\ %s';
  262. INPUT
  263. , pack('H*', 'e2808b')),
  264. ],
  265. [
  266. <<<'EXPECTED'
  267. <?php echo "Backslash 3 \\\\ \u{200b}";
  268. EXPECTED
  269. ,
  270. sprintf(<<<'INPUT'
  271. <?php echo 'Backslash 3 \\\ %s';
  272. INPUT
  273. , pack('H*', 'e2808b')),
  274. ],
  275. [
  276. <<<'EXPECTED'
  277. <?php echo "Backslash 4 \\\\ \u{200b}";
  278. EXPECTED
  279. ,
  280. sprintf(<<<'INPUT'
  281. <?php echo 'Backslash 4 \\\\ %s';
  282. INPUT
  283. , pack('H*', 'e2808b')),
  284. ],
  285. ];
  286. }
  287. /**
  288. * @requires PHP <7.0
  289. */
  290. public function testFixWithEscapeSequencesInStringsLowerThanPhp70()
  291. {
  292. $this->expectException(InvalidForEnvFixerConfigurationException::class);
  293. $this->expectExceptionMessageRegExp('/^\[non_printable_character\] Invalid configuration for env: Escape sequences require PHP 7\.0\+\.$/');
  294. $this->fixer->configure([
  295. 'use_escape_sequences_in_strings' => true,
  296. ]);
  297. }
  298. }