// RUN: %empty-directory(%t) // RUN: %target-run-stdlib-swift %S/Inputs/ // REQUIRES: executable_test // REQUIRES: objc_interop // REQUIRES: optimized_stdlib // rdar://124539686 // UNSUPPORTED: CPU=arm64e, CPU=arm64 import StdlibUnittest import StdlibUnicodeUnittest import Foundation let StringGraphemeBreaking = TestSuite("StringGraphemeBreaking") defer { runAllTests() } extension String { var forwardPieces: [[Unicode.Scalar]] { var i = startIndex var r: [[Unicode.Scalar]] = [] while i < endIndex { let j = self.index(after: i) r.append(Array(self[i.. startIndex { let i = self.index(before: j) r.append(Array(self[i..) { _value = Array(value) super.init() } @objc(copyWithZone:) override func copy(with zone: NSZone?) -> Any { // Ensure that copying this string produces a class that CoreFoundation // does not know about. return self } @objc override var length: Int { return _value.count } @objc override func character(at index: Int) -> unichar { return _value[index] } var _value: [UInt16] } extension _StringGuts { @_silgen_name("$ss11_StringGutsV9isForeignSbvg") func _isForeign() -> Bool } if #available(SwiftStdlib 5.9, *) { StringGraphemeBreaking.test("grapheme breaking foreign") { for test in graphemeBreakTests { let foreign = NonContiguousNSString(test.string.utf16) let string = foreign as String expectTrue(string._guts._isForeign()) check(string, test.pieces) } } StringGraphemeBreaking.test("GB11") { // MAN, ZERO WIDTH JOINER, ZERO WIDTH JOINER, GIRL let string = "\u{1f468}\u{200d}\u{200d}\u{1f467}" let pieces: [[Unicode.Scalar]] = [ ["\u{1f468}", "\u{200d}", "\u{200d}"], ["\u{1f467}"] ] check(string, pieces) let foreign = NonContiguousNSString(string.utf16) as String expectTrue(foreign._guts._isForeign()) check(foreign, pieces) } }