-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathStringIndexLong.swift
103 lines (87 loc) · 2.71 KB
/
StringIndexLong.swift
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)
""")
}
}
}
}
}
}