File: StringIndexLong.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 (103 lines) | stat: -rw-r--r-- 2,780 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
// RUN: %target-run-simple-swift
// REQUIRES: executable_test
// REQUIRES: long_test

import StdlibUnittest
#if _runtime(_ObjC)
import Foundation
#endif

var suite = TestSuite("StringIndexLong")
defer { runAllTests() }

let _examples: [StaticString] = [
  "abc\r\ndefg",
  "a\r\ncΠ΄e\u{301}ζ—₯πŸ§Ÿβ€β™€οΈxπŸ³οΈβ€πŸŒˆπŸ‡ΊπŸ‡ΈπŸ‡¨πŸ‡¦",
]

let examples: [String] = _examples.flatMap { s in
  let str = "\(s)"
  #if _runtime(_ObjC)
  let unichars = Array(str.utf16)
  let nsstr = NSString(characters: unichars, length: unichars.count)
  return [str, nsstr as String]
  #else
  return [str]
  #endif
}

suite.test("Substring.replaceSubrange index validation")
.forEach(in: examples) { string in
  guard #available(SwiftStdlib 5.7, *) else {
    // Index navigation in 5.7 always rounds input indices down to the nearest
    // Character, so that we always have a well-defined distance between
    // indices, even if they aren't valid.
    //
    // 5.6 and below did not behave consistently in this case.
    return
  }

  string.dumpIndices()

  let scalarMap = string.scalarMap()
  let allIndices = string.allIndices()

  for i in allIndices {
    print(i)
    for j in allIndices {
      guard i <= j else { continue }
      let si = scalarMap[i]!.index
      let sj = scalarMap[j]!.index

      let substring = string[i ..< j]

      let subindices = substring.allIndices()
      for m in subindices {
        for n in subindices {
          guard m <= n else { continue }
          let sm = scalarMap[m]!.index
          let sn = scalarMap[n]!.index

          let replacement = "x"

          var _expected = "".unicodeScalars
          _expected += string.unicodeScalars[si ..< sm]
          _expected += replacement.unicodeScalars
          _expected += string.unicodeScalars[sn ..< sj]
          let expected = String(_expected)[...]

          // Check Substring.replaceSubrange(_:with:)
          do {
            var actual = substring
            actual.replaceSubrange(m ..< n, with: Array(replacement))

            expectEqual(actual, expected,
              """
              string: \(string.debugDescription)
              i:      \(i)
              j:      \(j)
              m:      \(m)
              n:      \(n)
              """)
          }

          // Check String.unicodeScalars.replaceSubrange(_:with:)
          do {
            var actual = substring
            actual.unicodeScalars.replaceSubrange(
              m ..< n, with: Array(replacement.unicodeScalars))

            expectEqual(actual, expected,
              """
              string: \(string.debugDescription)
              i:      \(i)
              j:      \(j)
              m:      \(m)
              n:      \(n)
              """)
          }
        }
      }
    }
  }
}