14
14
15
15
import StdlibUnittest
16
16
import StdlibCollectionUnittest
17
+ import StdlibUnicodeUnittest
17
18
18
19
#if _runtime(_ObjC)
19
20
import NSSlowString
@@ -49,6 +50,35 @@ var strings: Array<String> = [
49
50
50
51
let kCFStringEncodingASCII : UInt32 = 0x0600
51
52
53
+ #if _runtime(_ObjC)
54
+
55
+ var utf16ByteSequences = utf16Tests. flatMap { $0. value } . map { $0. encoded }
56
+
57
+ private func testForeignContiguous( slowString: NSSlowString , string: String ) {
58
+ // Lazily bridged strings are not contiguous UTF-8
59
+ var slowString = NSSlowString ( string: string) as String
60
+ expectFalse ( slowString. isFastUTF8)
61
+ expectEqualSequence ( string. utf8, slowString. utf8)
62
+
63
+ // They become fast when mutated
64
+ slowString. makeNative ( )
65
+ expectTrue ( slowString. isFastUTF8)
66
+ expectEqualSequence (
67
+ string. utf8, slowString. withFastUTF8IfAvailable ( Array . init) !)
68
+
69
+ // Contiguous ASCII CFStrings provide access, even if lazily bridged
70
+ if string. isASCII {
71
+ let cfString = string. withCString {
72
+ CFStringCreateWithCString ( nil , $0, kCFStringEncodingASCII) !
73
+ } as String
74
+ expectTrue ( cfString. isFastUTF8)
75
+ expectEqualSequence (
76
+ string. utf8, cfString. withFastUTF8IfAvailable ( Array . init) !)
77
+ }
78
+ }
79
+
80
+ #endif
81
+
52
82
UTF8Tests . test ( " Contiguous Access " ) {
53
83
for string in strings {
54
84
print ( string)
@@ -70,28 +100,20 @@ UTF8Tests.test("Contiguous Access") {
70
100
// expectTrue(((copy as NSString) as String).isFastUTF8)
71
101
72
102
#if _runtime(_ObjC)
73
- // Lazily bridged strings are not contiguous UTF-8
74
- var slowString = NSSlowString ( string: string) as String
75
- expectFalse ( slowString. isFastUTF8)
76
- expectEqualSequence ( string. utf8, slowString. utf8)
77
-
78
- // They become fast when mutated
79
- slowString. makeNative ( )
80
- expectTrue ( slowString. isFastUTF8)
81
- expectEqualSequence (
82
- string. utf8, slowString. withFastUTF8IfAvailable ( Array . init) !)
83
-
84
- // Contiguous ASCII CFStrings provide access, even if lazily bridged
85
- if string. isASCII {
86
- let cfString = string. withCString {
87
- CFStringCreateWithCString ( nil , $0, kCFStringEncodingASCII) !
88
- } as String
89
- expectTrue ( cfString. isFastUTF8)
90
- expectEqualSequence (
91
- string. utf8, cfString. withFastUTF8IfAvailable ( Array . init) !)
92
- }
103
+ testForeignContiguous ( slowString: NSSlowString ( string: string) ,
104
+ string: string)
93
105
#endif
94
106
}
107
+ #if _runtime(_ObjC)
108
+ for bytes in utf16ByteSequences {
109
+ bytes. withContiguousStorageIfAvailable {
110
+ let slowString = NSSlowString ( characters: $0. baseAddress!,
111
+ length: UInt ( $0. count) )
112
+ let string = String ( decoding: $0, as: UTF16 . self)
113
+ testForeignContiguous ( slowString: slowString, string: string)
114
+ }
115
+ }
116
+ #endif
95
117
}
96
118
97
119
runAllTests ( )
0 commit comments