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)
""")
}
}
}
}
}
}
|