Skip to content

Commit 7648210

Browse files
committed
[test] se-0405 input-validating String initializers
1 parent f700688 commit 7648210

File tree

1 file changed

+145
-0
lines changed

1 file changed

+145
-0
lines changed

test/stdlib/StringCreate.swift

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,148 @@ if #available(SwiftStdlib 5.3, *) {
143143
expectEqual(str1, str6)
144144
}
145145
}
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

Comments
 (0)