@@ -164,6 +164,66 @@ final class SnippetBasedReferenceTests: XCTestCase {
164
164
)
165
165
}
166
166
167
+ func testComponentsSchemasNullableString( ) throws {
168
+ try self . assertSchemasTranslation (
169
+ """
170
+ schemas:
171
+ MyString:
172
+ type: string
173
+ """ ,
174
+ // NOTE: We don't generate a typealias to an optional; instead nullable is considered at point of use.
175
+ """
176
+ public enum Schemas {
177
+ public typealias MyString = Swift.String
178
+ }
179
+ """
180
+ )
181
+ }
182
+
183
+ func testComponentsSchemasArrayWithNullableItems( ) throws {
184
+ try self . assertSchemasTranslation (
185
+ """
186
+ schemas:
187
+ StringArray:
188
+ type: array
189
+ items:
190
+ type: string
191
+
192
+ StringArrayNullableItems:
193
+ type: array
194
+ items:
195
+ type: [string, null]
196
+ """ ,
197
+ """
198
+ public enum Schemas {
199
+ public typealias StringArray = [Swift.String]
200
+ public typealias StringArrayNullableItems = [Swift.String?]
201
+ }
202
+ """
203
+ )
204
+ }
205
+
206
+ func testComponentsSchemasArrayOfRefsOfNullableItems( ) throws {
207
+ try XCTSkipIf ( true , " TODO: Still need to propagate nullability through reference at time of use " )
208
+ try self . assertSchemasTranslation (
209
+ """
210
+ schemas:
211
+ ArrayOfRefsToNullableItems:
212
+ type: array
213
+ items:
214
+ $ref: '#/components/schemas/NullableString'
215
+ NullableString:
216
+ type: [string, null]
217
+ """ ,
218
+ """
219
+ public enum Schemas {
220
+ public typealias ArrayOfRefsToNullableItems = [Components.Schemas.NullableString?]
221
+ public typealias NullableString = Swift.String
222
+ }
223
+ """
224
+ )
225
+ }
226
+
167
227
func testComponentsSchemasNullableStringProperty( ) throws {
168
228
try self . assertSchemasTranslation (
169
229
"""
@@ -179,9 +239,47 @@ final class SnippetBasedReferenceTests: XCTestCase {
179
239
type: [string, null]
180
240
fooRequiredNullable:
181
241
type: [string, null]
242
+
243
+ fooOptionalArray:
244
+ type: array
245
+ items:
246
+ type: string
247
+ fooRequiredArray:
248
+ type: array
249
+ items:
250
+ type: string
251
+ fooOptionalNullableArray:
252
+ type: [array, null]
253
+ items:
254
+ type: string
255
+ fooRequiredNullableArray:
256
+ type: [array, null]
257
+ items:
258
+ type: string
259
+
260
+ fooOptionalArrayOfNullableItems:
261
+ type: array
262
+ items:
263
+ type: [string, null]
264
+ fooRequiredArrayOfNullableItems:
265
+ type: array
266
+ items:
267
+ type: [string, null]
268
+ fooOptionalNullableArrayOfNullableItems:
269
+ type: [array, null]
270
+ items:
271
+ type: [string, null]
272
+ fooRequiredNullableArrayOfNullableItems:
273
+ type: [array, null]
274
+ items:
275
+ type: [string, null]
182
276
required:
183
277
- fooRequired
184
278
- fooRequiredNullable
279
+ - fooRequiredArray
280
+ - fooRequiredNullableArray
281
+ - fooRequiredArrayOfNullableItems
282
+ - fooRequiredNullableArrayOfNullableItems
185
283
""" ,
186
284
"""
187
285
public enum Schemas {
@@ -190,29 +288,80 @@ final class SnippetBasedReferenceTests: XCTestCase {
190
288
public var fooRequired: Swift.String
191
289
public var fooOptionalNullable: Swift.String?
192
290
public var fooRequiredNullable: Swift.String?
291
+ public var fooOptionalArray: [Swift.String]?
292
+ public var fooRequiredArray: [Swift.String]
293
+ public var fooOptionalNullableArray: [Swift.String]?
294
+ public var fooRequiredNullableArray: [Swift.String]?
295
+ public var fooOptionalArrayOfNullableItems: [Swift.String?]?
296
+ public var fooRequiredArrayOfNullableItems: [Swift.String?]
297
+ public var fooOptionalNullableArrayOfNullableItems: [Swift.String?]?
298
+ public var fooRequiredNullableArrayOfNullableItems: [Swift.String?]?
193
299
public init(
194
300
fooOptional: Swift.String? = nil,
195
301
fooRequired: Swift.String,
196
302
fooOptionalNullable: Swift.String? = nil,
197
- fooRequiredNullable: Swift.String? = nil
303
+ fooRequiredNullable: Swift.String? = nil,
304
+ fooOptionalArray: [Swift.String]? = nil,
305
+ fooRequiredArray: [Swift.String],
306
+ fooOptionalNullableArray: [Swift.String]? = nil,
307
+ fooRequiredNullableArray: [Swift.String]? = nil,
308
+ fooOptionalArrayOfNullableItems: [Swift.String?]? = nil,
309
+ fooRequiredArrayOfNullableItems: [Swift.String?],
310
+ fooOptionalNullableArrayOfNullableItems: [Swift.String?]? = nil,
311
+ fooRequiredNullableArrayOfNullableItems: [Swift.String?]? = nil
198
312
) {
199
313
self.fooOptional = fooOptional
200
314
self.fooRequired = fooRequired
201
315
self.fooOptionalNullable = fooOptionalNullable
202
316
self.fooRequiredNullable = fooRequiredNullable
317
+ self.fooOptionalArray = fooOptionalArray
318
+ self.fooRequiredArray = fooRequiredArray
319
+ self.fooOptionalNullableArray = fooOptionalNullableArray
320
+ self.fooRequiredNullableArray = fooRequiredNullableArray
321
+ self.fooOptionalArrayOfNullableItems = fooOptionalArrayOfNullableItems
322
+ self.fooRequiredArrayOfNullableItems = fooRequiredArrayOfNullableItems
323
+ self.fooOptionalNullableArrayOfNullableItems = fooOptionalNullableArrayOfNullableItems
324
+ self.fooRequiredNullableArrayOfNullableItems = fooRequiredNullableArrayOfNullableItems
203
325
}
204
326
public enum CodingKeys: String, CodingKey {
205
327
case fooOptional
206
328
case fooRequired
207
329
case fooOptionalNullable
208
330
case fooRequiredNullable
331
+ case fooOptionalArray
332
+ case fooRequiredArray
333
+ case fooOptionalNullableArray
334
+ case fooRequiredNullableArray
335
+ case fooOptionalArrayOfNullableItems
336
+ case fooRequiredArrayOfNullableItems
337
+ case fooOptionalNullableArrayOfNullableItems
338
+ case fooRequiredNullableArrayOfNullableItems
209
339
}
210
340
}
211
341
}
212
342
"""
213
343
)
214
344
}
215
345
346
+ func testEncodingDecodingArrayWithNullableItems( ) throws {
347
+ struct MyObject : Codable , Equatable {
348
+ let myArray : [ String ? ] ?
349
+
350
+ var json : String { get throws { try String ( data: JSONEncoder ( ) . encode ( self ) , encoding: . utf8) ! } }
351
+
352
+ static func from( json: String ) throws -> Self { try JSONDecoder ( ) . decode ( Self . self, from: Data ( json. utf8) ) }
353
+ }
354
+
355
+ for (value, encoding) in [
356
+ ( MyObject ( myArray: nil ) , #"{}"# ) , ( MyObject ( myArray: [ ] ) , #"{"myArray":[]}"# ) ,
357
+ ( MyObject ( myArray: [ " a " ] ) , #"{"myArray":["a"]}"# ) , ( MyObject ( myArray: [ nil ] ) , #"{"myArray":[null]}"# ) ,
358
+ ( MyObject ( myArray: [ " a " , nil ] ) , #"{"myArray":["a",null]}"# ) ,
359
+ ] {
360
+ XCTAssertEqual ( try value. json, encoding)
361
+ XCTAssertEqual ( try MyObject . from ( json: value. json) , value)
362
+ }
363
+ }
364
+
216
365
func testComponentsSchemasObjectWithInferredProperty( ) throws {
217
366
try self . assertSchemasTranslation (
218
367
ignoredDiagnosticMessages: [
0 commit comments