@@ -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