@@ -340,13 +340,50 @@ final class URLTests : XCTestCase {
340340
341341 #if os(Windows)
342342 func testURLWindowsDriveLetterPath( ) throws {
343- let url = URL ( filePath: " C: \\ test \\ path " , directoryHint: . notDirectory)
343+ var url = URL ( filePath: # "C:\test\path"# , directoryHint: . notDirectory)
344344 // .absoluteString and .path() use the RFC 8089 URL path
345345 XCTAssertEqual ( url. absoluteString, " file:///C:/test/path " )
346346 XCTAssertEqual ( url. path ( ) , " /C:/test/path " )
347347 // .path and .fileSystemPath strip the leading slash
348348 XCTAssertEqual ( url. path, " C:/test/path " )
349349 XCTAssertEqual ( url. fileSystemPath, " C:/test/path " )
350+
351+ url = URL ( filePath: #"C:\"# , directoryHint: . isDirectory)
352+ XCTAssertEqual ( url. absoluteString, " file:///C:/ " )
353+ XCTAssertEqual ( url. path ( ) , " /C:/ " )
354+ XCTAssertEqual ( url. path, " C:/ " )
355+ XCTAssertEqual ( url. fileSystemPath, " C:/ " )
356+
357+ url = URL ( filePath: #"C:\\\"# , directoryHint: . isDirectory)
358+ XCTAssertEqual ( url. absoluteString, " file:///C:/// " )
359+ XCTAssertEqual ( url. path ( ) , " /C:/// " )
360+ XCTAssertEqual ( url. path, " C:/ " )
361+ XCTAssertEqual ( url. fileSystemPath, " C:/ " )
362+
363+ url = URL ( filePath: #"\C:\"# , directoryHint: . isDirectory)
364+ XCTAssertEqual ( url. absoluteString, " file:///C:/ " )
365+ XCTAssertEqual ( url. path ( ) , " /C:/ " )
366+ XCTAssertEqual ( url. path, " C:/ " )
367+ XCTAssertEqual ( url. fileSystemPath, " C:/ " )
368+
369+ let base = URL ( filePath: #"\d:\path\"# , directoryHint: . isDirectory)
370+ url = URL ( filePath: #"%43:\fake\letter"# , directoryHint: . notDirectory, relativeTo: base)
371+ // ":" is encoded to "%3A" in the first path segment so it's not mistaken as the scheme separator
372+ XCTAssertEqual ( url. relativeString, " %2543%3A/fake/letter " )
373+ XCTAssertEqual ( url. path ( ) , " /d:/path/%2543%3A/fake/letter " )
374+ XCTAssertEqual ( url. path, " d:/path/%43:/fake/letter " )
375+ XCTAssertEqual ( url. fileSystemPath, " d:/path/%43:/fake/letter " )
376+
377+ let cwd = URL . currentDirectory ( )
378+ var iter = cwd. path ( ) . utf8. makeIterator ( )
379+ if iter. next ( ) == . _slash,
380+ let driveLetter = iter. next ( ) , driveLetter. isLetter!,
381+ iter. next ( ) == . _colon {
382+ let path = #"\\?\"# + " \( Unicode . Scalar ( driveLetter) ) " + #":\"#
383+ url = URL ( filePath: path, directoryHint: . isDirectory)
384+ XCTAssertEqual ( url. path. last, " / " )
385+ XCTAssertEqual ( url. fileSystemPath. last, " / " )
386+ }
350387 }
351388 #endif
352389
0 commit comments