File: FilePathTest.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 (78 lines) | stat: -rw-r--r-- 2,291 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
/*
 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

/*System 0.0.1, @available(macOS 11.0, iOS 14.0, watchOS 7.0, tvOS 14.0, *)*/
func filePathFromUnterminatedBytes<S: Sequence>(_ bytes: S) -> FilePath where S.Element == UInt8 {
  var array = Array(bytes)
  assert(array.last != 0, "already null terminated")
  array += [0]

  return array.withUnsafeBufferPointer {
    $0.withMemoryRebound(to: CChar.self) {
      FilePath(platformString: $0.baseAddress!)
    }
  }
}
let invalidBytes: [UInt8] = [0x2F, 0x61, 0x2F, 0x62, 0x2F, 0x83]

/*System 0.0.2, @available(macOS 12.0, iOS 15.0, watchOS 8.0, tvOS 15.0, *)*/
final class FilePathTest: XCTestCase {
  struct TestPath {
    let filePath: FilePath
    let string: String
    let validUTF8: Bool
  }

  let testPaths: [TestPath] = [
    // empty
    TestPath(filePath: FilePath(), string: String(), validUTF8: true),

    // valid ascii
    TestPath(filePath: "/a/b/c", string: "/a/b/c", validUTF8: true),

    // valid utf8
    TestPath(filePath: "/あ/🧟‍♀️", string: "/あ/🧟‍♀️", validUTF8: true),

    // invalid utf8
    TestPath(filePath: filePathFromUnterminatedBytes(invalidBytes), string: String(decoding: invalidBytes, as: UTF8.self), validUTF8: false),
  ]

  func testFilePath() {

    XCTAssertEqual(0, FilePath().length)

    for testPath in testPaths {

      XCTAssertEqual(testPath.string, String(decoding: testPath.filePath))

      // TODO: test component UTF8 validation
      if testPath.validUTF8 {
        XCTAssertEqual(testPath.filePath, FilePath(testPath.string))
        XCTAssertEqual(testPath.string, String(validating: testPath.filePath))
      } else {
        XCTAssertNotEqual(testPath.filePath, FilePath(testPath.string))
        XCTAssertNil(String(validating: testPath.filePath))
      }

      testPath.filePath.withPlatformString {
        XCTAssertEqual(testPath.string, String(cString: $0))
        XCTAssertEqual(testPath.filePath, FilePath(platformString: $0))
      }
    }
  }
}