blob: c171d08e28e6b5ee171d0eafc684f4c20ba8a064 [file] [log] [blame]
// RUN: %empty-directory(%t)
// RUN: %target-build-swift %s -o %t/a.out4 -swift-version 4 && %target-codesign %t/a.out4 && %target-run %t/a.out4
// REQUIRES: executable_test
// REQUIRES: objc_interop
// Requires swift-version 4
// UNSUPPORTED: swift_test_mode_optimize_none_with_implicit_dynamic
//
// Tests for the NSString APIs on Substring
//
import StdlibUnittest
import Foundation
extension String {
func range(fromStart: Int, fromEnd: Int) -> Range<String.Index> {
return index(startIndex, offsetBy: fromStart) ..<
index(endIndex, offsetBy: fromEnd)
}
subscript(fromStart: Int, fromEnd: Int) -> SubSequence {
return self[range(fromStart: fromStart, fromEnd: fromEnd)]
}
}
var tests = TestSuite("NSStringAPIs/Substring")
tests.test("range(of:)/NilRange") {
let ss = "aabcdd"[1, -1]
let range = ss.range(of: "bc")
expectEqual("bc", range.map { ss[$0] })
}
tests.test("range(of:)/NonNilRange") {
let s = "aabcdd"
let ss = s[1, -1]
let searchRange = s.range(fromStart: 2, fromEnd: -2)
let range = ss.range(of: "bc", range: searchRange)
expectEqual("bc", range.map { ss[$0] })
}
tests.test("rangeOfCharacter") {
let ss = "__hello__"[2, -2]
let range = ss.rangeOfCharacter(from: CharacterSet.alphanumerics)
expectEqual("h", range.map { ss[$0] })
}
tests.test("compare(_:options:range:locale:)/NilRange") {
let needle = "hello"
let haystack = "__hello__"[2, -2]
expectEqual(.orderedSame, haystack.compare(needle))
}
tests.test("compare(_:options:range:locale:)/NonNilRange") {
let needle = "hello"
let haystack = "__hello__"
let range = haystack.range(fromStart: 2, fromEnd: -2)
expectEqual(.orderedSame, haystack[range].compare(needle, range: range))
}
tests.test("replacingCharacters(in:with:)") {
let s = "__hello, world"
let range = s.range(fromStart: 2, fromEnd: -7)
let expected = "__goodbye, world"
let replacement = "goodbye"
expectEqual(expected,
s.replacingCharacters(in: range, with: replacement))
expectEqual(expected[2, 0],
s[2, 0].replacingCharacters(in: range, with: replacement))
expectEqual(replacement,
s.replacingCharacters(in: s.startIndex..., with: replacement))
expectEqual(replacement,
s.replacingCharacters(in: ..<s.endIndex, with: replacement))
expectEqual(expected[2, 0],
s[2, 0].replacingCharacters(in: range, with: replacement[...]))
}
tests.test("replacingOccurrences(of:with:options:range:)/NilRange") {
let s = "hello"
expectEqual("he11o", s.replacingOccurrences(of: "l", with: "1"))
expectEqual("he11o", s.replacingOccurrences(of: "l"[...], with: "1"))
expectEqual("he11o", s.replacingOccurrences(of: "l", with: "1"[...]))
expectEqual("he11o", s.replacingOccurrences(of: "l"[...], with: "1"[...]))
expectEqual("he11o",
s[...].replacingOccurrences(of: "l", with: "1"))
expectEqual("he11o",
s[...].replacingOccurrences(of: "l"[...], with: "1"))
expectEqual("he11o",
s[...].replacingOccurrences(of: "l", with: "1"[...]))
expectEqual("he11o",
s[...].replacingOccurrences(of: "l"[...], with: "1"[...]))
}
tests.test("replacingOccurrences(of:with:options:range:)/NonNilRange") {
let s = "hello"
let r = s.range(fromStart: 1, fromEnd: -2)
expectEqual("he1lo",
s.replacingOccurrences(of: "l", with: "1", range: r))
expectEqual("he1lo",
s.replacingOccurrences(of: "l"[...], with: "1", range: r))
expectEqual("he1lo",
s.replacingOccurrences(of: "l", with: "1"[...], range: r))
expectEqual("he1lo",
s.replacingOccurrences(of: "l"[...], with: "1"[...], range: r))
expectEqual("he1lo",
s[...].replacingOccurrences(of: "l", with: "1", range: r))
expectEqual("he1lo",
s[...].replacingOccurrences(of: "l"[...], with: "1", range: r))
expectEqual("he1lo",
s[...].replacingOccurrences(of: "l", with: "1"[...], range: r))
expectEqual("he1lo",
s[...].replacingOccurrences(of: "l"[...], with: "1"[...], range: r))
let ss = s[1, -1]
expectEqual("e1l",
ss.replacingOccurrences(of: "l", with: "1", range: r))
expectEqual("e1l",
ss.replacingOccurrences(of: "l"[...], with: "1", range: r))
expectEqual("e1l",
ss.replacingOccurrences(of: "l", with: "1"[...], range: r))
expectEqual("e1l",
ss.replacingOccurrences(of: "l"[...], with: "1"[...], range: r))
}
tests.test("substring(with:)") {
let s = "hello, world"
let r = s.range(fromStart: 7, fromEnd: 0)
expectEqual("world", s.substring(with: r))
expectEqual("world", s[...].substring(with: r))
expectEqual("world", s[1, 0].substring(with: r))
}
tests.test("substring(with:)/SubscriptEquivalence") {
let s = "hello, world"
let r = s.range(fromStart: 7, fromEnd: 0)
expectEqual(s[r], s.substring(with: r))
expectEqual(s[...][r], s[...].substring(with: r))
expectEqual(s[1, 0][r], s[1, 0].substring(with: r))
}
runAllTests()