Skip to content

Commit ff05ec9

Browse files
committed
Common: prepareForOutput(): Use Unicode output on Windows as well on PHP 7.1+
PHP 7.1 fixed problems with printing Unicode characters to Windows console that forced us to avoid using them. https://www.php.net/manual/en/migration71.windows-support.php
1 parent 41bc621 commit ff05ec9

File tree

3 files changed

+40
-15
lines changed

3 files changed

+40
-15
lines changed

src/Reports/Code.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,8 @@ public function generateFileReport($report, File $phpcsFile, $showSources=false,
228228
if (strpos($tokenContent, "\t") !== false) {
229229
$token = $tokens[$i];
230230
$token['content'] = $tokenContent;
231-
if (stripos(PHP_OS, 'WIN') === 0) {
231+
if (stripos(PHP_OS, 'WIN') === 0 && PHP_VERSION_ID < 70100) {
232+
// Printing Unicode characters like '»' to Windows console only works since PHP 7.1.
232233
$tab = "\000";
233234
} else {
234235
$tab = "\033[30;1m»\033[0m";

src/Util/Common.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -283,8 +283,9 @@ public static function prepareForOutput($content, $exclude=[])
283283
"\t" => '\t',
284284
" " => '·',
285285
];
286-
if (stripos(PHP_OS, 'WIN') === 0) {
287-
// Do not replace spaces on Windows.
286+
if (stripos(PHP_OS, 'WIN') === 0 && PHP_VERSION_ID < 70100) {
287+
// Do not replace spaces on old PHP on Windows.
288+
// Printing Unicode characters like '·' to Windows console only works since PHP 7.1.
288289
unset($replacements[" "]);
289290
}
290291

tests/Core/Util/Common/PrepareForOutputTest.php

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,45 +27,68 @@ final class PrepareForOutputTest extends TestCase
2727
* @param string $content The content to prepare.
2828
* @param string[] $exclude A list of characters to leave invisible.
2929
* @param string $expected Expected function output.
30-
* @param string $expectedWin Expected function output on Windows (unused in this test).
30+
* @param string $expectedOld Expected function output on PHP<7.1 on Windows (unused in this test).
3131
*
3232
* @requires OS ^(?!WIN).*
3333
* @dataProvider dataPrepareForOutput
3434
*
3535
* @return void
3636
*/
37-
public function testPrepareForOutput($content, $exclude, $expected, $expectedWin)
37+
public function testPrepareForOutput($content, $exclude, $expected, $expectedOld)
3838
{
3939
$this->assertSame($expected, Common::prepareForOutput($content, $exclude));
4040

4141
}//end testPrepareForOutput()
4242

4343

4444
/**
45-
* Test formatting whitespace characters, on Windows.
45+
* Test formatting whitespace characters, on modern PHP on Windows.
4646
*
4747
* @param string $content The content to prepare.
4848
* @param string[] $exclude A list of characters to leave invisible.
49-
* @param string $expected Expected function output (unused in this test).
50-
* @param string $expectedWin Expected function output on Windows.
49+
* @param string $expected Expected function output.
50+
* @param string $expectedOld Expected function output on PHP<7.1 on Windows (unused in this test).
5151
*
5252
* @requires OS ^WIN.*.
53+
* @requires PHP >= 7.1
5354
* @dataProvider dataPrepareForOutput
5455
*
5556
* @return void
5657
*/
57-
public function testPrepareForOutputWindows($content, $exclude, $expected, $expectedWin)
58+
public function testPrepareForOutputWindows($content, $exclude, $expected, $expectedOld)
5859
{
59-
$this->assertSame($expectedWin, Common::prepareForOutput($content, $exclude));
60+
$this->assertSame($expected, Common::prepareForOutput($content, $exclude));
6061

6162
}//end testPrepareForOutputWindows()
6263

6364

65+
/**
66+
* Test formatting whitespace characters, on PHP<7.1 on Windows.
67+
*
68+
* @param string $content The content to prepare.
69+
* @param string[] $exclude A list of characters to leave invisible.
70+
* @param string $expected Expected function output (unused in this test).
71+
* @param string $expectedOld Expected function output on PHP<7.1 on Windows.
72+
*
73+
* @requires OS ^WIN.*.
74+
* @requires PHP < 7.1
75+
* @dataProvider dataPrepareForOutput
76+
*
77+
* @return void
78+
*/
79+
public function testPrepareForOutputOldPHPWindows($content, $exclude, $expected, $expectedOld)
80+
{
81+
$this->assertSame($expectedOld, Common::prepareForOutput($content, $exclude));
82+
83+
}//end testPrepareForOutputOldPHPWindows()
84+
85+
6486
/**
6587
* Data provider.
6688
*
6789
* @see testPrepareForOutput()
6890
* @see testPrepareForOutputWindows()
91+
* @see testPrepareForOutputOldPHPWindows()
6992
*
7093
* @return array<string, array<string, mixed>>
7194
*/
@@ -76,25 +99,25 @@ public static function dataPrepareForOutput()
7699
'content' => "\r\n\t",
77100
'exclude' => [],
78101
'expected' => "\033[30;1m\\r\\n\\t\033[0m",
79-
'expectedWin' => "\033[30;1m\\r\\n\\t\033[0m",
102+
'expectedOld' => "\033[30;1m\\r\\n\\t\033[0m",
80103
],
81104
'Spaces are replaced with a unique mark' => [
82105
'content' => " ",
83106
'exclude' => [],
84107
'expected' => "\033[30;1m····\033[0m",
85-
'expectedWin' => " ",
108+
'expectedOld' => " ",
86109
],
87110
'Other characters are unaffected' => [
88111
'content' => "{echo 1;}",
89112
'exclude' => [],
90113
'expected' => "{echo\033[30;1m·\033[0m1;}",
91-
'expectedWin' => "{echo 1;}",
114+
'expectedOld' => "{echo 1;}",
92115
],
93116
'No replacements' => [
94117
'content' => 'nothing-should-be-replaced',
95118
'exclude' => [],
96119
'expected' => 'nothing-should-be-replaced',
97-
'expectedWin' => 'nothing-should-be-replaced',
120+
'expectedOld' => 'nothing-should-be-replaced',
98121
],
99122
'Excluded whitespace characters are unaffected' => [
100123
'content' => "\r\n\t ",
@@ -103,7 +126,7 @@ public static function dataPrepareForOutput()
103126
"\n",
104127
],
105128
'expected' => "\r\n\033[30;1m\\\033[0m",
106-
'expectedWin' => "\r\n\033[30;1m\\t\033[0m ",
129+
'expectedOld' => "\r\n\033[30;1m\\t\033[0m ",
107130
],
108131
];
109132

0 commit comments

Comments
 (0)