@@ -143,3 +143,148 @@ if #available(SwiftStdlib 5.3, *) {
143
143
expectEqual ( str1, str6)
144
144
}
145
145
}
146
+
147
+ let s1 = " Long string containing the characters é, ß, 🦆, and 👨👧👦. "
148
+ let s2 = " Long ascii string with no accented characters (obviously). "
149
+
150
+ StringCreateTests . test ( " Validating.utf8 " )
151
+ . skip ( . custom(
152
+ { if #available( SwiftStdlib 5 . 10 , * ) { false } else { true } } ,
153
+ reason: " Requires Swift 5.10's standard library "
154
+ ) )
155
+ . code {
156
+ guard #available( SwiftStdlib 5 . 10 , * ) else { return }
157
+
158
+ let i1 = Array ( s1. utf8)
159
+ let i2 = Array ( s2. utf8)
160
+ let i3 = {
161
+ var modified = i1
162
+ let index = modified. lastIndex ( of: 240 )
163
+ expectNotNil ( index)
164
+ index. map { modified [ $0] = 0 }
165
+ return modified
166
+ } ( )
167
+
168
+ var actual : String ?
169
+ for simpleString in SimpleString . allCases {
170
+ let expected = simpleString. rawValue
171
+ actual = String ( validating: expected. utf8, as: Unicode . UTF8. self)
172
+ expectEqual ( actual, expected)
173
+ }
174
+
175
+ expectEqual ( String ( validating: i1, as: UTF8 . self) , s1)
176
+ expectEqual ( String ( validating: i2, as: UTF8 . self) , s2)
177
+ expectNil ( String ( validating: i3, as: UTF8 . self) )
178
+
179
+ expectEqual ( String ( validating: AnyCollection ( i1) , as: UTF8 . self) , s1)
180
+ expectEqual ( String ( validating: AnyCollection ( i2) , as: UTF8 . self) , s2)
181
+ expectNil ( String ( validating: AnyCollection ( i3) , as: UTF8 . self) )
182
+ }
183
+
184
+ StringCreateTests . test ( " Validating.utf8.from.int8 " )
185
+ . skip ( . custom(
186
+ { if #available( SwiftStdlib 5 . 10 , * ) { false } else { true } } ,
187
+ reason: " Requires Swift 5.10's standard library "
188
+ ) )
189
+ . code {
190
+ guard #available( SwiftStdlib 5 . 10 , * ) else { return }
191
+
192
+ let i1 = s1. utf8. map ( Int8 . init ( bitPattern: ) )
193
+ let i2 = s2. utf8. map ( Int8 . init ( bitPattern: ) )
194
+ let i3 = {
195
+ var modified = i1
196
+ let index = modified. lastIndex ( of: Int8 ( bitPattern: 240 ) )
197
+ expectNotNil ( index)
198
+ index. map { modified [ $0] = 0 }
199
+ return modified
200
+ } ( )
201
+
202
+ expectEqual ( String ( validating: i1, as: UTF8 . self) , s1)
203
+ expectEqual ( String ( validating: i2, as: UTF8 . self) , s2)
204
+ expectNil ( String ( validating: i3, as: UTF8 . self) )
205
+
206
+ expectEqual ( String ( validating: AnyCollection ( i1) , as: UTF8 . self) , s1)
207
+ expectEqual ( String ( validating: AnyCollection ( i2) , as: UTF8 . self) , s2)
208
+ expectNil ( String ( validating: AnyCollection ( i3) , as: UTF8 . self) )
209
+ }
210
+
211
+ StringCreateTests . test ( " Validating.ascii " )
212
+ . skip ( . custom(
213
+ { if #available( SwiftStdlib 5 . 10 , * ) { false } else { true } } ,
214
+ reason: " Requires Swift 5.10's standard library "
215
+ ) )
216
+ . code {
217
+ guard #available( SwiftStdlib 5 . 10 , * ) else { return }
218
+
219
+ let i1 = Array ( s1. utf8)
220
+ let i2 = Array ( s2. utf8)
221
+
222
+ expectNil ( String ( validating: i1, as: Unicode . ASCII. self) )
223
+ expectEqual ( String ( validating: i2, as: Unicode . ASCII. self) , s2)
224
+
225
+ expectNil ( String ( validating: AnyCollection ( i1) , as: Unicode . ASCII. self) )
226
+ expectEqual ( String ( validating: AnySequence ( i2) , as: Unicode . ASCII. self) , s2)
227
+
228
+ let i3 = i1. map ( Int8 . init ( bitPattern: ) )
229
+ let i4 = i2. map ( Int8 . init ( bitPattern: ) )
230
+
231
+ expectNil ( String ( validating: i3, as: Unicode . ASCII. self) )
232
+ expectEqual ( String ( validating: i4, as: Unicode . ASCII. self) , s2)
233
+
234
+ expectNil ( String ( validating: AnyCollection ( i3) , as: Unicode . ASCII. self) )
235
+ expectEqual ( String ( validating: AnySequence ( i4) , as: Unicode . ASCII. self) , s2)
236
+ }
237
+
238
+ StringCreateTests . test ( " Validating.utf16 " )
239
+ . skip ( . custom(
240
+ { if #available( SwiftStdlib 5 . 10 , * ) { false } else { true } } ,
241
+ reason: " Requires Swift 5.10's standard library "
242
+ ) )
243
+ . code {
244
+ guard #available( SwiftStdlib 5 . 10 , * ) else { return }
245
+
246
+ let i1 = Array ( s1. utf16)
247
+ let i2 = Array ( s2. utf16)
248
+ let i3 = {
249
+ var modified = i1
250
+ let index = modified. lastIndex ( of: 32 )
251
+ expectNotNil ( index)
252
+ index. map { modified [ $0] = 0xd801 }
253
+ return modified
254
+ } ( )
255
+
256
+ expectEqual ( String ( validating: i1, as: UTF16 . self) , s1)
257
+ expectEqual ( String ( validating: i2, as: UTF16 . self) , s2)
258
+ expectNil ( String ( validating: i3, as: UTF16 . self) )
259
+
260
+ expectEqual ( String ( validating: AnySequence ( i1) , as: UTF16 . self) , s1)
261
+ expectEqual ( String ( validating: AnySequence ( i2) , as: UTF16 . self) , s2)
262
+ expectNil ( String ( validating: AnyCollection ( i3) , as: UTF16 . self) )
263
+ }
264
+
265
+ StringCreateTests . test ( " Validating.utf32 " )
266
+ . skip ( . custom(
267
+ { if #available( SwiftStdlib 5 . 10 , * ) { false } else { true } } ,
268
+ reason: " Requires Swift 5.10's standard library "
269
+ ) )
270
+ . code {
271
+ guard #available( SwiftStdlib 5 . 10 , * ) else { return }
272
+
273
+ let i1 = s1. unicodeScalars. map ( \. value)
274
+ let i2 = s2. unicodeScalars. map ( \. value)
275
+ let i3 = {
276
+ var modified = i1
277
+ let index = modified. lastIndex ( of: . init( bitPattern: 32 ) )
278
+ expectNotNil ( index)
279
+ index. map { modified [ $0] = . max }
280
+ return modified
281
+ } ( )
282
+
283
+ expectEqual ( String ( validating: i1, as: UTF32 . self) , s1)
284
+ expectEqual ( String ( validating: i2, as: UTF32 . self) , s2)
285
+ expectNil ( String ( validating: i3, as: UTF32 . self) )
286
+
287
+ expectEqual ( String ( validating: AnySequence ( i1) , as: UTF32 . self) , s1)
288
+ expectEqual ( String ( validating: AnySequence ( i2) , as: UTF32 . self) , s2)
289
+ expectNil ( String ( validating: AnyCollection ( i3) , as: UTF32 . self) )
290
+ }
0 commit comments