@@ -49,106 +49,120 @@ assert.throws(() => url.fileURLToPath('https://a/b/c'), {
4949 }
5050}
5151
52- {
53- let testCases;
54- if (isWindows) {
55- testCases = [
56- // Lowercase ascii alpha
57- { path: 'C:\\foo', fileURL: 'file:///C:/foo' },
58- // Uppercase ascii alpha
59- { path: 'C:\\FOO', fileURL: 'file:///C:/FOO' },
60- // dir
61- { path: 'C:\\dir\\foo', fileURL: 'file:///C:/dir/foo' },
62- // trailing separator
63- { path: 'C:\\dir\\', fileURL: 'file:///C:/dir/' },
64- // dot
65- { path: 'C:\\foo.mjs', fileURL: 'file:///C:/foo.mjs' },
66- // space
67- { path: 'C:\\foo bar', fileURL: 'file:///C:/foo%20bar' },
68- // question mark
69- { path: 'C:\\foo?bar', fileURL: 'file:///C:/foo%3Fbar' },
70- // number sign
71- { path: 'C:\\foo#bar', fileURL: 'file:///C:/foo%23bar' },
72- // ampersand
73- { path: 'C:\\foo&bar', fileURL: 'file:///C:/foo&bar' },
74- // equals
75- { path: 'C:\\foo=bar', fileURL: 'file:///C:/foo=bar' },
76- // colon
77- { path: 'C:\\foo:bar', fileURL: 'file:///C:/foo:bar' },
78- // semicolon
79- { path: 'C:\\foo;bar', fileURL: 'file:///C:/foo;bar' },
80- // percent
81- { path: 'C:\\foo%bar', fileURL: 'file:///C:/foo%25bar' },
82- // backslash
83- { path: 'C:\\foo\\bar', fileURL: 'file:///C:/foo/bar' },
84- // backspace
85- { path: 'C:\\foo\bbar', fileURL: 'file:///C:/foo%08bar' },
86- // tab
87- { path: 'C:\\foo\tbar', fileURL: 'file:///C:/foo%09bar' },
88- // newline
89- { path: 'C:\\foo\nbar', fileURL: 'file:///C:/foo%0Abar' },
90- // carriage return
91- { path: 'C:\\foo\rbar', fileURL: 'file:///C:/foo%0Dbar' },
92- // latin1
93- { path: 'C:\\fóóbàr', fileURL: 'file:///C:/f%C3%B3%C3%B3b%C3%A0r' },
94- // Euro sign (BMP code point)
95- { path: 'C:\\€', fileURL: 'file:///C:/%E2%82%AC' },
96- // Rocket emoji (non-BMP code point)
97- { path: 'C:\\🚀', fileURL: 'file:///C:/%F0%9F%9A%80' },
98- // UNC path (see https://docs.microsoft.com/en-us/archive/blogs/ie/file-uris-in-windows)
99- { path: '\\\\nas\\My Docs\\File.doc', fileURL: 'file://nas/My%20Docs/File.doc' },
100- ];
101- } else {
102- testCases = [
103- // Lowercase ascii alpha
104- { path: '/foo', fileURL: 'file:///foo' },
105- // Uppercase ascii alpha
106- { path: '/FOO', fileURL: 'file:///FOO' },
107- // dir
108- { path: '/dir/foo', fileURL: 'file:///dir/foo' },
109- // trailing separator
110- { path: '/dir/', fileURL: 'file:///dir/' },
111- // dot
112- { path: '/foo.mjs', fileURL: 'file:///foo.mjs' },
113- // space
114- { path: '/foo bar', fileURL: 'file:///foo%20bar' },
115- // question mark
116- { path: '/foo?bar', fileURL: 'file:///foo%3Fbar' },
117- // number sign
118- { path: '/foo#bar', fileURL: 'file:///foo%23bar' },
119- // ampersand
120- { path: '/foo&bar', fileURL: 'file:///foo&bar' },
121- // equals
122- { path: '/foo=bar', fileURL: 'file:///foo=bar' },
123- // colon
124- { path: '/foo:bar', fileURL: 'file:///foo:bar' },
125- // semicolon
126- { path: '/foo;bar', fileURL: 'file:///foo;bar' },
127- // percent
128- { path: '/foo%bar', fileURL: 'file:///foo%25bar' },
129- // backslash
130- { path: '/foo\\bar', fileURL: 'file:///foo%5Cbar' },
131- // backspace
132- { path: '/foo\bbar', fileURL: 'file:///foo%08bar' },
133- // tab
134- { path: '/foo\tbar', fileURL: 'file:///foo%09bar' },
135- // newline
136- { path: '/foo\nbar', fileURL: 'file:///foo%0Abar' },
137- // carriage return
138- { path: '/foo\rbar', fileURL: 'file:///foo%0Dbar' },
139- // latin1
140- { path: '/fóóbàr', fileURL: 'file:///f%C3%B3%C3%B3b%C3%A0r' },
141- // Euro sign (BMP code point)
142- { path: '/€', fileURL: 'file:///%E2%82%AC' },
143- // Rocket emoji (non-BMP code point)
144- { path: '/🚀', fileURL: 'file:///%F0%9F%9A%80' },
145- ];
146- }
52+ const windowsTestCases = [
53+ // Lowercase ascii alpha
54+ { path: 'C:\\foo', fileURL: 'file:///C:/foo' },
55+ // Uppercase ascii alpha
56+ { path: 'C:\\FOO', fileURL: 'file:///C:/FOO' },
57+ // dir
58+ { path: 'C:\\dir\\foo', fileURL: 'file:///C:/dir/foo' },
59+ // trailing separator
60+ { path: 'C:\\dir\\', fileURL: 'file:///C:/dir/' },
61+ // dot
62+ { path: 'C:\\foo.mjs', fileURL: 'file:///C:/foo.mjs' },
63+ // space
64+ { path: 'C:\\foo bar', fileURL: 'file:///C:/foo%20bar' },
65+ // question mark
66+ { path: 'C:\\foo?bar', fileURL: 'file:///C:/foo%3Fbar' },
67+ // number sign
68+ { path: 'C:\\foo#bar', fileURL: 'file:///C:/foo%23bar' },
69+ // ampersand
70+ { path: 'C:\\foo&bar', fileURL: 'file:///C:/foo&bar' },
71+ // equals
72+ { path: 'C:\\foo=bar', fileURL: 'file:///C:/foo=bar' },
73+ // colon
74+ { path: 'C:\\foo:bar', fileURL: 'file:///C:/foo:bar' },
75+ // semicolon
76+ { path: 'C:\\foo;bar', fileURL: 'file:///C:/foo;bar' },
77+ // percent
78+ { path: 'C:\\foo%bar', fileURL: 'file:///C:/foo%25bar' },
79+ // backslash
80+ { path: 'C:\\foo\\bar', fileURL: 'file:///C:/foo/bar' },
81+ // backspace
82+ { path: 'C:\\foo\bbar', fileURL: 'file:///C:/foo%08bar' },
83+ // tab
84+ { path: 'C:\\foo\tbar', fileURL: 'file:///C:/foo%09bar' },
85+ // newline
86+ { path: 'C:\\foo\nbar', fileURL: 'file:///C:/foo%0Abar' },
87+ // carriage return
88+ { path: 'C:\\foo\rbar', fileURL: 'file:///C:/foo%0Dbar' },
89+ // latin1
90+ { path: 'C:\\fóóbàr', fileURL: 'file:///C:/f%C3%B3%C3%B3b%C3%A0r' },
91+ // Euro sign (BMP code point)
92+ { path: 'C:\\€', fileURL: 'file:///C:/%E2%82%AC' },
93+ // Rocket emoji (non-BMP code point)
94+ { path: 'C:\\🚀', fileURL: 'file:///C:/%F0%9F%9A%80' },
95+ // UNC path (see https://docs.microsoft.com/en-us/archive/blogs/ie/file-uris-in-windows)
96+ { path: '\\\\nas\\My Docs\\File.doc', fileURL: 'file://nas/My%20Docs/File.doc' },
97+ ];
98+ const posixTestCases = [
99+ // Lowercase ascii alpha
100+ { path: '/foo', fileURL: 'file:///foo' },
101+ // Uppercase ascii alpha
102+ { path: '/FOO', fileURL: 'file:///FOO' },
103+ // dir
104+ { path: '/dir/foo', fileURL: 'file:///dir/foo' },
105+ // trailing separator
106+ { path: '/dir/', fileURL: 'file:///dir/' },
107+ // dot
108+ { path: '/foo.mjs', fileURL: 'file:///foo.mjs' },
109+ // space
110+ { path: '/foo bar', fileURL: 'file:///foo%20bar' },
111+ // question mark
112+ { path: '/foo?bar', fileURL: 'file:///foo%3Fbar' },
113+ // number sign
114+ { path: '/foo#bar', fileURL: 'file:///foo%23bar' },
115+ // ampersand
116+ { path: '/foo&bar', fileURL: 'file:///foo&bar' },
117+ // equals
118+ { path: '/foo=bar', fileURL: 'file:///foo=bar' },
119+ // colon
120+ { path: '/foo:bar', fileURL: 'file:///foo:bar' },
121+ // semicolon
122+ { path: '/foo;bar', fileURL: 'file:///foo;bar' },
123+ // percent
124+ { path: '/foo%bar', fileURL: 'file:///foo%25bar' },
125+ // backslash
126+ { path: '/foo\\bar', fileURL: 'file:///foo%5Cbar' },
127+ // backspace
128+ { path: '/foo\bbar', fileURL: 'file:///foo%08bar' },
129+ // tab
130+ { path: '/foo\tbar', fileURL: 'file:///foo%09bar' },
131+ // newline
132+ { path: '/foo\nbar', fileURL: 'file:///foo%0Abar' },
133+ // carriage return
134+ { path: '/foo\rbar', fileURL: 'file:///foo%0Dbar' },
135+ // latin1
136+ { path: '/fóóbàr', fileURL: 'file:///f%C3%B3%C3%B3b%C3%A0r' },
137+ // Euro sign (BMP code point)
138+ { path: '/€', fileURL: 'file:///%E2%82%AC' },
139+ // Rocket emoji (non-BMP code point)
140+ { path: '/🚀', fileURL: 'file:///%F0%9F%9A%80' },
141+ ];
147142
148- for (const { path, fileURL } of testCases) {
149- const fromString = url.fileURLToPath(fileURL);
150- assert.strictEqual(fromString, path);
151- const fromURL = url.fileURLToPath(new URL(fileURL));
152- assert.strictEqual(fromURL, path);
153- }
143+ for (const { path, fileURL } of windowsTestCases) {
144+ const fromString = url.fileURLToPath(fileURL, { windows: true });
145+ assert.strictEqual(fromString, path);
146+ const fromURL = url.fileURLToPath(new URL(fileURL), { windows: true });
147+ assert.strictEqual(fromURL, path);
148+ }
149+
150+ for (const { path, fileURL } of posixTestCases) {
151+ const fromString = url.fileURLToPath(fileURL, { windows: false });
152+ assert.strictEqual(fromString, path);
153+ const fromURL = url.fileURLToPath(new URL(fileURL), { windows: false });
154+ assert.strictEqual(fromURL, path);
155+ }
156+
157+ const defaultTestCases = isWindows ? windowsTestCases : posixTestCases;
158+
159+ // Test when `options` is null
160+ const whenNullActual = url.fileURLToPath(new URL(defaultTestCases[0].fileURL), null);
161+ assert.strictEqual(whenNullActual, defaultTestCases[0].path);
162+
163+ for (const { path, fileURL } of defaultTestCases) {
164+ const fromString = url.fileURLToPath(fileURL);
165+ assert.strictEqual(fromString, path);
166+ const fromURL = url.fileURLToPath(new URL(fileURL));
167+ assert.strictEqual(fromURL, path);
154168}
0 commit comments