@@ -20,7 +20,7 @@ func wantonlyWrapInAny<T>(_ x: T) -> Any {
20
20
extension LifetimeTracked: Error {}
21
21
extension String: Error {}
22
22
23
- struct KnownUnbridged: Equatable, Hashable, Error {
23
+ struct KnownUnbridged: Equatable, Hashable {
24
24
var x, y: LifetimeTracked
25
25
26
26
init() {
@@ -149,38 +149,55 @@ func protocolObjectPreservesIdentity(original: NSCopying.Protocol,
149
149
expectTrue(proto === bridged)
150
150
}
151
151
152
+ enum MyError: Error {
153
+ case a, e, i, o, u
154
+ }
155
+
156
+ func errorValueTypeBridgesToNSError(original: MyError, bridged: AnyObject) {
157
+ let bridgedNSError = bridged as! NSError
158
+ expectEqual(bridgedNSError.domain, original._domain)
159
+ expectEqual(bridgedNSError.code, original._code)
160
+
161
+ let unbridgedError = bridged as! MyError
162
+ expectEqual(original, unbridgedError)
163
+
164
+ let unbridgedError2 = bridgedNSError as! MyError
165
+ expectEqual(original, unbridgedError2)
166
+ }
167
+
152
168
protocol P {}
153
169
154
170
// We want to exhaustively check all paths through the bridging and dynamic
155
171
// casting infrastructure, so expand out test cases that wrap the different
156
172
// interesting bridging cases in different kinds of existential container.
157
173
%{
158
174
testCases = [
159
- # testName valueExpr testFunc conformsToError conformsToHashable
160
- ("classes", "LifetimeTracked(0)", "bridgedObjectPreservesIdentity", True, True),
161
- ("strings", '"vitameatavegamin"', "stringBridgesToEqualNSString", True, True),
162
- ("unbridged type", "KnownUnbridged()", "boxedTypeRoundTripsThroughDynamicCasting", True, True),
163
- ("tuple", '(1, "2")', "tupleCanBeDynamicallyCast", False, False),
164
- ("metatype", 'Int.self', "metatypeCanBeDynamicallyCast", False, False),
165
- ("generic metatype", 'Int.self', "metatypeCanBeDynamicallyCastGenerically", False, False),
166
- ("CF metatype", 'CFString.self', "metatypeCanBeDynamicallyCast", False, False),
167
- ("generic CF metatype", 'CFString.self', "metatypeCanBeDynamicallyCastGenerically", False, False),
168
- ("class metatype", 'LifetimeTracked.self', "classMetatypePreservesIdentity", False, False),
169
- ("objc metatype", 'NSObject.self', "classMetatypePreservesIdentity", False, False),
170
- ("protocol", 'P.self', "metatypeCanBeDynamicallyCastGenerically", False, False),
171
- ("objc protocol", 'NSCopying.self', "protocolObjectPreservesIdentity", False, False),
172
- ("objc protocol composition", '(NSCopying & NSCoding).self', "metatypeCanBeDynamicallyCastGenerically", False, False),
173
- ("mixed protocol composition", '(NSCopying & P).self', "metatypeCanBeDynamicallyCastGenerically", False, False),
174
- ("generic class metatype", 'LifetimeTracked.self', "classMetatypePreservesIdentityGenerically", False, False),
175
- ("generic objc metatype", 'NSObject.self', "classMetatypePreservesIdentityGenerically", False, False),
176
- ("function", 'guineaPigFunction', "functionCanBeDynamicallyCast", False, False),
175
+ # testName type valueExpr testFunc conformsToError conformsToHashable
176
+ ("classes", "LifetimeTracked", "LifetimeTracked(0)", "bridgedObjectPreservesIdentity", True, True),
177
+ ("strings", "String", '"vitameatavegamin"', "stringBridgesToEqualNSString", True, True),
178
+ ("unbridged type", "KnownUnbridged", "KnownUnbridged()", "boxedTypeRoundTripsThroughDynamicCasting", False, True),
179
+ ("tuple", "(Int, String)", '(1, "2")', "tupleCanBeDynamicallyCast", False, False),
180
+ ("metatype", "Int.Type", 'Int.self', "metatypeCanBeDynamicallyCast", False, False),
181
+ ("generic metatype", "Int.Type", 'Int.self', "metatypeCanBeDynamicallyCastGenerically", False, False),
182
+ ("CF metatype", "CFString.Type", 'CFString.self', "metatypeCanBeDynamicallyCast", False, False),
183
+ ("generic CF metatype", "CFString.Type", 'CFString.self', "metatypeCanBeDynamicallyCastGenerically", False, False),
184
+ ("class metatype", "LifetimeTracked.Type", 'LifetimeTracked.self', "classMetatypePreservesIdentity", False, False),
185
+ ("objc metatype", "NSObject.Type", 'NSObject.self', "classMetatypePreservesIdentity", False, False),
186
+ ("protocol", "P.Protocol", 'P.self', "metatypeCanBeDynamicallyCastGenerically", False, False),
187
+ ("objc protocol", "NSCopying.Protocol", 'NSCopying.self', "protocolObjectPreservesIdentity", False, False),
188
+ ("objc protocol composition", "(NSCopying & NSCoding).Protocol", '(NSCopying & NSCoding).self', "metatypeCanBeDynamicallyCastGenerically", False, False),
189
+ ("mixed protocol composition", "(NSCopying & P).Protocol", '(NSCopying & P).self', "metatypeCanBeDynamicallyCastGenerically", False, False),
190
+ ("generic class metatype", "LifetimeTracked.Type", 'LifetimeTracked.self', "classMetatypePreservesIdentityGenerically", False, False),
191
+ ("generic objc metatype", "NSObject.Type", 'NSObject.self', "classMetatypePreservesIdentityGenerically", False, False),
192
+ ("function", "() -> Int", 'guineaPigFunction', "functionCanBeDynamicallyCast", False, False),
193
+ ("error type", "MyError", 'MyError.e', "errorValueTypeBridgesToNSError", True, True),
177
194
]
178
195
}%
179
196
180
- % for testName, valueExpr, testFunc, conformsToError, conformsToHashable in testCases:
197
+ % for testName, type, valueExpr, testFunc, conformsToError, conformsToHashable in testCases:
181
198
BridgeAnything.test("${testName}") {
182
199
autoreleasepool {
183
- let x = ${valueExpr}
200
+ let x: ${type} = ${valueExpr}
184
201
${testFunc}(original: x, bridged: _bridgeAnythingToObjectiveC(x))
185
202
${testFunc}(original: x, bridged: _bridgeAnythingNonVerbatimToObjectiveC(x))
186
203
@@ -217,21 +234,67 @@ BridgeAnything.test("${testName}") {
217
234
% end
218
235
219
236
let xInAny: Any = x
220
- ${testFunc}(original: x, bridged: _bridgeAnythingToObjectiveC(xInAny))
221
- ${testFunc}(original: x, bridged: _bridgeAnythingNonVerbatimToObjectiveC(xInAny))
237
+ let xInAnyBridged = _bridgeAnythingToObjectiveC(xInAny)
238
+ let xInAnyBridged2 = _bridgeAnythingNonVerbatimToObjectiveC(xInAny)
239
+ ${testFunc}(original: x, bridged: xInAnyBridged)
240
+ ${testFunc}(original: x, bridged: xInAnyBridged2)
222
241
223
242
let xInAnyInAny = wantonlyWrapInAny(xInAny)
224
- ${testFunc}(original: x, bridged: _bridgeAnythingToObjectiveC(xInAnyInAny))
225
- ${testFunc}(original: x, bridged: _bridgeAnythingNonVerbatimToObjectiveC(xInAnyInAny))
243
+ let xInAnyInAnyBridged = _bridgeAnythingToObjectiveC(xInAnyInAny)
244
+ let xInAnyInAnyBridged2 = _bridgeAnythingNonVerbatimToObjectiveC(xInAnyInAny)
245
+ ${testFunc}(original: x, bridged: xInAnyInAnyBridged)
246
+ ${testFunc}(original: x, bridged: xInAnyInAnyBridged2)
226
247
227
248
% if conformsToError:
228
249
let xInError: Error = x
229
- ${testFunc}(original: x, bridged: _bridgeAnythingToObjectiveC(xInError))
230
- ${testFunc}(original: x, bridged: _bridgeAnythingNonVerbatimToObjectiveC(xInError))
250
+ let xInErrorBridged = _bridgeAnythingToObjectiveC(xInError)
251
+ let xInErrorBridged2 = _bridgeAnythingNonVerbatimToObjectiveC(xInError)
252
+
253
+ ${testFunc}(original: x, bridged: xInErrorBridged)
254
+ ${testFunc}(original: x, bridged: xInErrorBridged2)
231
255
232
256
let xInErrorInAny = wantonlyWrapInAny(xInError)
233
- ${testFunc}(original: x, bridged: _bridgeAnythingToObjectiveC(xInErrorInAny))
234
- ${testFunc}(original: x, bridged: _bridgeAnythingNonVerbatimToObjectiveC(xInErrorInAny))
257
+ let xInErrorInAnyBridged = _bridgeAnythingToObjectiveC(xInErrorInAny)
258
+ let xInErrorInAnyBridged2 = _bridgeAnythingNonVerbatimToObjectiveC(xInErrorInAny)
259
+ ${testFunc}(original: x, bridged: xInErrorInAnyBridged)
260
+ ${testFunc}(original: x, bridged: xInErrorInAnyBridged)
261
+ % end
262
+
263
+ % if conformsToHashable:
264
+ // Check that we get an equal value if we bridge cast back.
265
+ let xFromAny = xInAnyBridged as! ${type}
266
+ expectEqual(x, xFromAny)
267
+ let xFromAny2 = xInAnyBridged2 as! ${type}
268
+ expectEqual(x, xFromAny2)
269
+ let xInAnyBridgedInAny = wantonlyWrapInAny(xInAnyBridged)
270
+ let xFromAnyBridgedInAny = xInAnyBridgedInAny as! ${type}
271
+ expectEqual(x, xFromAnyBridgedInAny)
272
+
273
+ let xFromAnyInAny = xInAnyInAnyBridged as! ${type}
274
+ expectEqual(x, xFromAnyInAny)
275
+ let xFromAnyInAny2 = xInAnyInAnyBridged2 as! ${type}
276
+ expectEqual(x, xFromAnyInAny2)
277
+ let xInAnyInAnyBridgedInAny = wantonlyWrapInAny(xInAnyInAnyBridged)
278
+ let xFromAnyInAnyBridgedInAny = xInAnyInAnyBridgedInAny as! ${type}
279
+ expectEqual(x, xFromAnyInAnyBridgedInAny)
280
+
281
+ % if conformsToError:
282
+ let xFromError = xInErrorBridged as! ${type}
283
+ expectEqual(x, xFromError)
284
+ let xFromError2 = xInErrorBridged2 as! ${type}
285
+ expectEqual(x, xFromError2)
286
+ let xInErrorBridgedInAny = wantonlyWrapInAny(xInErrorBridged)
287
+ let xFromErrorBridgedInAny = xInErrorBridgedInAny as! ${type}
288
+ expectEqual(x, xFromErrorBridgedInAny)
289
+
290
+ let xFromErrorInAny = xInErrorInAnyBridged as! ${type}
291
+ expectEqual(x, xFromErrorInAny)
292
+ let xFromErrorInAny2 = xInErrorInAnyBridged2 as! ${type}
293
+ expectEqual(x, xFromErrorInAny2)
294
+ let xInErrorInAnyBridgedInAny = wantonlyWrapInAny(xInErrorInAnyBridged)
295
+ let xFromErrorInAnyBridgedInAny = xInErrorInAnyBridgedInAny as! ${type}
296
+ expectEqual(x, xFromErrorInAnyBridgedInAny)
297
+ % end
235
298
% end
236
299
}
237
300
}
0 commit comments