@@ -114,6 +114,7 @@ const windowsTestCases = [
114114 // Extended UNC path
115115 { path : '\\\\?\\UNC\\server\\share\\folder\\file.txt' , expected : 'file://server/share/folder/file.txt' } ,
116116] ;
117+ const alphabet = String . fromCharCode ( ...Array . from ( { length : 26 } , ( _ , i ) => 'a' . charCodeAt ( ) + i ) ) ;
117118const posixTestCases = [
118119 // Lowercase ascii alpha
119120 { path : '/foo' , expected : 'file:///foo' } ,
@@ -159,6 +160,31 @@ const posixTestCases = [
159160 { path : '/🚀' , expected : 'file:///%F0%9F%9A%80' } ,
160161 // "unsafe" chars
161162 { path : '/foo\r\n\t<>"#%{}|^[\\~]`?bar' , expected : 'file:///foo%0D%0A%09%3C%3E%22%23%25%7B%7D%7C%5E%5B%5C%7E%5D%60%3Fbar' } ,
163+ // All of the 16-bit UTF-16 chars
164+ {
165+ path : `/${ Array . from ( { length : 0x7FFF } , ( _ , i ) => String . fromCharCode ( i ) ) . join ( '' ) } ` ,
166+ expected : `file:///${
167+ Array . from ( { length : 0x21 } , ( _ , i ) => `%${ i . toString ( 16 ) . toUpperCase ( ) . padStart ( 2 , '0' ) } ` ) . join ( '' )
168+ } !%22%23$%25&'()*+,-./0123456789:;%3C=%3E%3F@${
169+ alphabet . toUpperCase ( )
170+ } %5B%5C%5D%5E_%60${ alphabet } %7B%7C%7D%7E%7F${
171+ Array . from ( { length : 0x800 - 0x80 } , ( _ , i ) => `%${
172+ ( Math . floor ( ( i - 0x80 ) / 0x40 ) + 0xC4 ) . toString ( 16 ) . toUpperCase ( )
173+ } %${
174+ ( ( i % 0x40 ) + 0x80 ) . toString ( 16 ) . toUpperCase ( )
175+ } `) . join ( '' )
176+ } ${
177+ Array . from ( { length : 0x7FFF - 0x800 } , ( _ , i ) => i + 0x800 ) . map ( ( i ) => `%E${
178+ ( i >> 12 ) . toString ( 16 ) . toUpperCase ( )
179+ } %${
180+ ( ( ( i >> 6 ) % 0x40 ) + 0x80 ) . toString ( 16 ) . toUpperCase ( )
181+ } %${
182+ ( ( i % 0x40 ) + 0x80 ) . toString ( 16 ) . toUpperCase ( )
183+ } `) . join ( '' )
184+ } `
185+ } ,
186+ // Trying with some pair of 16-bit surrogate pseudo-characters
187+ { path : `/${ String . fromCodePoint ( 0x1F303 ) } ` , expected : 'file:///%F0%9F%8C%83' } ,
162188] ;
163189
164190for ( const { path, expected } of windowsTestCases ) {
0 commit comments