1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
/*
This source file is part of the Swift System open source project
Copyright (c) 2020 Apple Inc. and the Swift System project authors
Licensed under Apache License v2.0 with Runtime Library Exception
See https://swift.org/LICENSE.txt for license information
*/
import XCTest
#if SYSTEM_PACKAGE
import SystemPackage
#else
import System
#endif
private struct ParsingTestCase: TestCase {
// Whether we want the path to be constructed and syntactically
// manipulated as though it were a Windows path
let isWindows: Bool
// We defer forming the path until `runAllTests()` executes,
// so that we can switch between unix and windows behavior.
var pathStr: String
// The expected path post separator normalization
var normalized: String
var file: StaticString
var line: UInt
}
extension ParsingTestCase {
static func unix(
_ path: String, normalized: String,
file: StaticString = #file, line: UInt = #line
) -> ParsingTestCase {
ParsingTestCase(
isWindows: false,
pathStr: path, normalized: normalized,
file: file, line: line)
}
static func windows(
_ path: String, normalized: String,
file: StaticString = #file, line: UInt = #line
) -> ParsingTestCase {
ParsingTestCase(
isWindows: true,
pathStr: path, normalized: normalized,
file: file, line: line)
}
}
extension ParsingTestCase {
func runAllTests() {
withWindowsPaths(enabled: isWindows) {
let path = FilePath(pathStr)
expectEqual(normalized, path.description)
}
}
}
#if SYSTEM_PACKAGE
@testable import SystemPackage
#else
@testable import System
#endif
/*System 0.0.2, @available(macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0, *)*/
final class FilePathParsingTest: XCTestCase {
func testNormalization() {
let unixPaths: Array<ParsingTestCase> = [
.unix("/", normalized: "/"),
.unix("", normalized: ""),
.unix("//", normalized: "/"),
.unix("///", normalized: "/"),
.unix("/foo/bar/", normalized: "/foo/bar"),
.unix("foo//bar", normalized: "foo/bar"),
.unix("//foo/bar//baz/", normalized: "/foo/bar/baz"),
.unix("/foo/bar/baz//", normalized: "/foo/bar/baz"),
.unix("/foo/bar/baz///", normalized: "/foo/bar/baz"),
]
let windowsPaths: Array<ParsingTestCase> = [
.windows(#"C:\\folder\file\"#, normalized: #"C:\folder\file"#),
.windows(#"C:folder\\\file\\\"#, normalized: #"C:folder\file"#),
.windows(#"C:/foo//bar/"#, normalized: #"C:\foo\bar"#),
.windows(#"\\server\share\"#, normalized: #"\\server\share\"#),
.windows(#"//server/share/"#, normalized: #"\\server\share\"#),
.windows(#"\\?\UNC/server\share\"#, normalized: #"\\?\UNC\server\share\"#),
.windows(#"\\.\C:\"#, normalized: #"\\.\C:\"#),
.windows(#"C:\"#, normalized: #"C:\"#),
.windows(#"\"#, normalized: #"\"#),
]
for test in unixPaths {
test.runAllTests()
}
for test in windowsPaths {
test.runAllTests()
}
}
}
|