File: FilePathParsingTest.swift

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (107 lines) | stat: -rw-r--r-- 3,013 bytes parent folder | download
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()
    }
  }
}