Skip to content

Commit 3e9cccc

Browse files
authored
Add support for Windows (#30)
* Add windows on CI * update normalize directory separator to works on windows * rollback directory separator normalize * fix unit test * update test for windows vs non-windows directory separator use * by example fix test * add 1 example for windows example * more test yield windows directory separator example
1 parent eb9bea6 commit 3e9cccc

2 files changed

Lines changed: 60 additions & 26 deletions

File tree

.github/workflows/ci.yaml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ concurrency:
1010

1111
jobs:
1212
tests:
13-
runs-on: ubuntu-latest
13+
runs-on: ${{ matrix.os }}
1414
strategy:
1515
fail-fast: false
1616
matrix:
17+
os: [ubuntu-latest, windows-latest]
1718
php:
1819
- '7.4'
1920
- '8.0'

tests/TicketSwapErrorFormatterTest.php

Lines changed: 58 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ public function formatErrors(AnalysisResult $analysisResult, Output $output): in
3939
);
4040
}
4141

42+
private static function isWindows() : bool
43+
{
44+
return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN';
45+
}
46+
4247
/**
4348
* @return iterable<array{TicketSwapErrorFormatter::LINK_FORMAT_*, array<string, string>}>
4449
*/
@@ -83,65 +88,79 @@ public function testGetLinkFormatFromEnv(string $expected, array $environmentVar
8388
public static function provideLinkFormats() : iterable
8489
{
8590
yield [
86-
"↳ <href=phpstorm://open?file=/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php&line=20>src/Core/Admin/.../User/AddUserController.php:20</>\n",
91+
self::isWindows()
92+
? "↳ <href=phpstorm://open?file=c:\www\project\src\Core\Admin\Controller\Dashboard\User\AddUserController.php&line=20>src\Core\Admin\...\User\AddUserController.php:20</>\n"
93+
: "↳ <href=phpstorm://open?file=/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php&line=20>src/Core/Admin/.../User/AddUserController.php:20</>\n",
8794
TicketSwapErrorFormatter::LINK_FORMAT_DEFAULT,
8895
20,
89-
'/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
90-
'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
96+
self::isWindows() ? 'c:\www\project\src\Core\Admin\Controller\Dashboard\User\AddUserController.php' : '/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
97+
self::isWindows() ? 'src\Core\Admin\Controller\Dashboard\User\AddUserController.php' : 'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
9198
self::PHPSTORM_EDITOR_URL,
9299
true,
93100
];
94101
yield [
95-
"↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
102+
self::isWindows()
103+
? "↳ src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php:20\n"
104+
: "↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
96105
TicketSwapErrorFormatter::LINK_FORMAT_GITHUB_ACTIONS,
97106
20,
98-
'/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
99-
'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
107+
self::isWindows() ? 'c:\\www\\project\\src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : '/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
108+
self::isWindows() ? 'src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : 'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
100109
self::PHPSTORM_EDITOR_URL,
101110
true,
102111
];
103112
yield [
104-
"↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
113+
self::isWindows()
114+
? "↳ src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php:20\n"
115+
: "↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
105116
TicketSwapErrorFormatter::LINK_FORMAT_WARP,
106117
20,
107-
'/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
108-
'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
118+
self::isWindows() ? 'c:\\www\\project\\src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : '/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
119+
self::isWindows() ? 'src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : 'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
109120
self::PHPSTORM_EDITOR_URL,
110121
true,
111122
];
112123
yield [
113-
"↳ file:///www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
124+
self::isWindows()
125+
? "↳ file://c:\\www\\project\\src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php:20\n"
126+
: "↳ file:///www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
114127
TicketSwapErrorFormatter::LINK_FORMAT_PHPSTORM,
115128
20,
116-
'/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
117-
'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
129+
self::isWindows() ? 'c:\\www\\project\\src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : '/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
130+
self::isWindows() ? 'src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : 'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
118131
self::PHPSTORM_EDITOR_URL,
119132
true,
120133
];
121134
yield [
122-
"↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
135+
self::isWindows()
136+
? "↳ src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php:20\n"
137+
: "↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
123138
TicketSwapErrorFormatter::LINK_FORMAT_WITHOUT_EDITOR,
124139
20,
125-
'/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
126-
'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
140+
self::isWindows() ? 'c:\\www\\project\\src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : '/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
141+
self::isWindows() ? 'src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : 'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
127142
self::PHPSTORM_EDITOR_URL,
128143
true,
129144
];
130145
yield [
131-
"↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
146+
self::isWindows()
147+
? "↳ src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php:20\n"
148+
: "↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
132149
TicketSwapErrorFormatter::LINK_FORMAT_DEFAULT,
133150
20,
134-
'/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
135-
'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
151+
self::isWindows() ? 'c:\\www\\project\\src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : '/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
152+
self::isWindows() ? 'src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : 'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
136153
self::PHPSTORM_EDITOR_URL,
137154
false,
138155
];
139156
yield [
140-
"↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
157+
self::isWindows()
158+
? "↳ src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php:20\n"
159+
: "↳ src/Core/Admin/Controller/Dashboard/User/AddUserController.php:20\n",
141160
TicketSwapErrorFormatter::LINK_FORMAT_DEFAULT,
142161
20,
143-
'/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
144-
'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
162+
self::isWindows() ? 'c:\\www\\project\\src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : '/www/project/src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
163+
self::isWindows() ? 'src\\Core\\Admin\\Controller\\Dashboard\\User\\AddUserController.php' : 'src/Core/Admin/Controller/Dashboard/User/AddUserController.php',
145164
null,
146165
true,
147166
];
@@ -398,12 +417,20 @@ public function testFormatErrorsNoErrorsWritesNoErrorsAndReturnsZero() : void
398417

399418
public function testFormatErrorsWithErrorsPrintsMessagesLinksSummaryAndReturnsOne() : void
400419
{
420+
// Use OS-appropriate paths to test directory separator handling
421+
$absolutePath = self::isWindows()
422+
? 'C:\\www\\project\\src\\Foo\\Bar.php'
423+
: '/www/project/src/Foo/Bar.php';
424+
$configPath = self::isWindows()
425+
? 'C:\\www\\project\\phpstan.neon'
426+
: '/www/project/phpstan.neon';
427+
401428
$fileError = new Error(
402429
'Parameter #1 $var expects string, int given.',
403-
'/www/project/src/Foo/Bar.php',
430+
$absolutePath,
404431
12,
405432
null,
406-
'/www/project/src/Foo/Bar.php',
433+
$absolutePath,
407434
null,
408435
'Adjust in %configurationFile%',
409436
null,
@@ -419,7 +446,7 @@ public function testFormatErrorsWithErrorsPrintsMessagesLinksSummaryAndReturnsOn
419446
[],
420447
[],
421448
false,
422-
'/www/project/phpstan.neon',
449+
$configPath,
423450
false,
424451
0,
425452
false,
@@ -433,7 +460,13 @@ public function testFormatErrorsWithErrorsPrintsMessagesLinksSummaryAndReturnsOn
433460

434461
self::assertSame(1, $result);
435462

436-
$expectedLink = "↳ <href=phpstorm://open?file=/www/project/src/Foo/Bar.php&line=12>/www/project/.../Foo/Bar.php:12</>\n";
463+
// NullRelativePathHelper returns the absolute path, which has 6+ parts and gets trimmed
464+
// Windows: C:\www\project\src\Foo\Bar.php -> C:\www\project\...\Foo\Bar.php
465+
// Unix: /www/project/src/Foo/Bar.php -> /www/project/.../Foo/Bar.php
466+
$expectedShortPath = self::isWindows()
467+
? 'C:\\www\\project\\...\\Foo\\Bar.php'
468+
: '/www/project/.../Foo/Bar.php';
469+
$expectedLink = "↳ <href=phpstorm://open?file=$absolutePath&line=12>$expectedShortPath:12</>\n";
437470
$expectedSummary = '<bg=red;options=bold>Found 1 error</>';
438471

439472
$writes = $output->getWrites();

0 commit comments

Comments
 (0)