1
1
// RUN: %target-run-simple-swiftgyb
2
2
// REQUIRES: executable_test
3
3
4
- // FIXME(id-as-any): add tests that use CF objects (is this even
5
- // possible?)
6
-
7
- // FIXME(id-as-any): add tests that use Swift errors and
8
- // Objective-C errors.
9
-
10
- // FIXME(id-as-any): add tests for enums.
11
-
12
4
// FIXME(id-as-any): add tests for unboxing.
13
5
6
+ // FIXME(id-as-any): add tests for the _ObjectiveCBridgeable conformance.
7
+
14
8
%{
15
9
import re
16
10
@@ -81,8 +75,9 @@ AnyHashableTests.test("AnyHashable(${wrapped})/Hashable") {
81
75
}
82
76
checkHashable(xs, equalityOracle: { $0 / 2 == $1 / 2 })
83
77
84
- let anyHashableXs = xs.map(AnyHashable.init)
85
- checkHashable(anyHashableXs, equalityOracle: { $0 / 2 == $1 / 2 })
78
+ checkHashable(
79
+ xs.map(AnyHashable.init),
80
+ equalityOracle: { $0 / 2 == $1 / 2 })
86
81
}
87
82
% end
88
83
@@ -101,8 +96,9 @@ AnyHashableTests.test("AnyHashable(${wrapped}<OpaqueValue<Int>>)/Hashable") {
101
96
}
102
97
checkHashable(xs, equalityOracle: { $0 / 2 == $1 / 2 })
103
98
104
- let anyHashableXs = xs.map(AnyHashable.init)
105
- checkHashable(anyHashableXs, equalityOracle: { $0 / 2 == $1 / 2 })
99
+ checkHashable(
100
+ xs.map(AnyHashable.init),
101
+ equalityOracle: { $0 / 2 == $1 / 2 })
106
102
}
107
103
% end
108
104
% end
@@ -196,7 +192,7 @@ ${kw} HasCustomRepresentation_Generic${name}<Wrapped>
196
192
% for name in [ 'Class', 'PODStruct', 'RCStruct' ]:
197
193
% wrapped = 'HasCustomRepresentation_%s' % name
198
194
% genericWrapped = 'HasCustomRepresentation_Generic%s' % name
199
- AnyHashableTests.test("AnyHashable with ${wrapped}") {
195
+ AnyHashableTests.test("AnyHashable containing ${wrapped}") {
200
196
let xs = (-2...2).flatMap {
201
197
[ ${wrapped}(
202
198
$0, identity: 0,
@@ -207,12 +203,13 @@ AnyHashableTests.test("AnyHashable with ${wrapped}") {
207
203
}
208
204
checkHashable(xs, equalityOracle: { $0 / 2 == $1 / 2 })
209
205
210
- let anyHashableXs = xs.map(AnyHashable.init)
211
- checkHashable(anyHashableXs, equalityOracle: { $0 / 2 == $1 / 2 })
206
+ checkHashable(
207
+ xs.map(AnyHashable.init),
208
+ equalityOracle: { $0 / 2 == $1 / 2 })
212
209
}
213
210
214
211
% for payload in [ 'OpaqueValue<Int>', 'LifetimeTracked' ]:
215
- AnyHashableTests.test("AnyHashable with ${genericWrapped} with ${payload}") {
212
+ AnyHashableTests.test("AnyHashable containing ${genericWrapped} with ${payload}") {
216
213
GenericMinimalHashableValue_equalImpl.value = {
217
214
($0 as! ${payload}).value == ($1 as! ${payload}).value
218
215
}
@@ -229,8 +226,9 @@ AnyHashableTests.test("AnyHashable with ${genericWrapped} with ${payload}") {
229
226
}
230
227
checkHashable(xs, equalityOracle: { $0 / 2 == $1 / 2 })
231
228
232
- let anyHashableXs = xs.map(AnyHashable.init)
233
- checkHashable(anyHashableXs, equalityOracle: { $0 / 2 == $1 / 2 })
229
+ checkHashable(
230
+ xs.map(AnyHashable.init),
231
+ equalityOracle: { $0 / 2 == $1 / 2 })
234
232
}
235
233
% end
236
234
% end
@@ -260,7 +258,7 @@ struct HasCustomRepresentationRecursively
260
258
}
261
259
}
262
260
263
- AnyHashableTests.test("AnyHashable with recursive custom representations") {
261
+ AnyHashableTests.test("AnyHashable containing values with recursive custom representations") {
264
262
GenericMinimalHashableValue_equalImpl.value = {
265
263
($0 as! ${payload}).value == ($1 as! ${payload}).value
266
264
}
@@ -390,7 +388,7 @@ class ${Self.full_name} : ${Super.full_name} {}
390
388
% end
391
389
% end
392
390
393
- AnyHashableTests.test("AnyHashable with classes from the ${prefix} hierarchy") {
391
+ AnyHashableTests.test("AnyHashable containing classes from the ${prefix} hierarchy") {
394
392
typealias T = Int
395
393
let xs = [
396
394
% for (i, (Self, _)) in enumerate(types):
@@ -416,8 +414,9 @@ AnyHashableTests.test("AnyHashable with classes from the ${prefix} hierarchy") {
416
414
}
417
415
checkHashable(xs, equalityOracle: equalityOracle)
418
416
419
- let anyHashableXs = xs.map(AnyHashable.init)
420
- checkHashable(anyHashableXs, equalityOracle: equalityOracle)
417
+ checkHashable(
418
+ xs.map(AnyHashable.init),
419
+ equalityOracle: equalityOracle)
421
420
}
422
421
${'#endif' if 'ObjC' in prefix else ''}
423
422
@@ -466,29 +465,161 @@ let interestingBitVectorArrays: [[UInt8]] = [
466
465
[0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88],
467
466
]
468
467
469
- AnyHashableTests.test("CFBitVector/Hashable") {
470
- let bitVectors = interestingBitVectorArrays.map(CFBitVector.makeImmutable)
468
+ AnyHashableTests.test("AnyHashable containing CFBitVector") {
469
+ let bitVectors: [CFBitVector] =
470
+ interestingBitVectorArrays.map(CFBitVector.makeImmutable)
471
471
let arrays = bitVectors.map { $0.asArray }
472
472
func isEq(_ lhs: [[UInt8]], _ rhs: [[UInt8]]) -> Bool {
473
473
return zip(lhs, rhs).map { $0 == $1 }.reduce(true, { $0 && $1 })
474
474
}
475
475
expectEqualTest(interestingBitVectorArrays, arrays, sameValue: isEq)
476
476
checkHashable(bitVectors, equalityOracle: { $0 == $1 })
477
+
478
+ expectEqual(.foreignClass, SwiftRuntime.metadataKind(of: bitVectors.first!))
479
+
480
+ checkHashable(
481
+ bitVectors.map(AnyHashable.init),
482
+ equalityOracle: { $0 == $1 })
483
+
484
+ let bitVectorsAsAnyObjects: [NSObject] = bitVectors.map {
485
+ ($0 as AnyObject) as! NSObject
486
+ }
487
+ expectEqual(
488
+ .objCClassWrapper,
489
+ SwiftRuntime.metadataKind(of: bitVectorsAsAnyObjects.first!))
490
+ checkHashable(
491
+ bitVectorsAsAnyObjects.map(AnyHashable.init),
492
+ equalityOracle: { $0 == $1 })
477
493
}
478
494
479
- AnyHashableTests.test("CFMutableBitVector/Hashable ") {
495
+ AnyHashableTests.test("AnyHashable containing CFMutableBitVector") {
480
496
// CFMutableBitVector inherits the Hashable conformance from
481
497
// CFBitVector.
482
- let bitVectors =
498
+ let bitVectors: [CFMutableBitVector] =
483
499
interestingBitVectorArrays.map(CFMutableBitVector.makeMutable)
484
500
let arrays = bitVectors.map { $0.asArray }
485
501
func isEq(_ lhs: [[UInt8]], _ rhs: [[UInt8]]) -> Bool {
486
502
return zip(lhs, rhs).map { $0 == $1 }.reduce(true, { $0 && $1 })
487
503
}
488
504
expectEqualTest(interestingBitVectorArrays, arrays, sameValue: isEq)
489
505
checkHashable(bitVectors, equalityOracle: { $0 == $1 })
506
+
507
+ expectEqual(.foreignClass, SwiftRuntime.metadataKind(of: bitVectors.first!))
508
+
509
+ checkHashable(
510
+ bitVectors.map(AnyHashable.init),
511
+ equalityOracle: { $0 == $1 })
512
+
513
+ let bitVectorsAsAnyObjects: [NSObject] = bitVectors.map {
514
+ ($0 as AnyObject) as! NSObject
515
+ }
516
+ checkHashable(bitVectors, equalityOracle: { $0 == $1 })
517
+ expectEqual(
518
+ .objCClassWrapper,
519
+ SwiftRuntime.metadataKind(of: bitVectorsAsAnyObjects.first!))
520
+ checkHashable(
521
+ bitVectorsAsAnyObjects.map(AnyHashable.init),
522
+ equalityOracle: { $0 == $1 })
523
+ }
524
+
525
+ #endif
526
+
527
+ enum MinimalHashablePODSwiftError : Error, Hashable {
528
+ case caseA
529
+ case caseB
530
+ case caseC
490
531
}
491
532
533
+ enum MinimalHashableRCSwiftError : Error, Hashable {
534
+ case caseA(LifetimeTracked)
535
+ case caseB(LifetimeTracked)
536
+ case caseC(LifetimeTracked)
537
+
538
+ var hashValue: Int {
539
+ return 0
540
+ }
541
+
542
+ static func == (
543
+ lhs: MinimalHashableRCSwiftError,
544
+ rhs: MinimalHashableRCSwiftError
545
+ ) -> Bool {
546
+ switch (lhs, rhs) {
547
+ case (.caseA(let lhs), .caseA(let rhs)):
548
+ return lhs == rhs
549
+ case (.caseB(let lhs), .caseB(let rhs)):
550
+ return lhs == rhs
551
+ case (.caseC(let lhs), .caseC(let rhs)):
552
+ return lhs == rhs
553
+ default:
554
+ return false
555
+ }
556
+ }
557
+ }
558
+
559
+ AnyHashableTests.test("AnyHashable containing MinimalHashablePODSwiftError") {
560
+ let xs: [MinimalHashablePODSwiftError] = [
561
+ .caseA, .caseA,
562
+ .caseB, .caseB,
563
+ .caseC, .caseC,
564
+ ]
565
+ expectEqual(.enum, SwiftRuntime.metadataKind(of: xs.first!))
566
+ checkHashable(xs, equalityOracle: { $0 / 2 == $1 / 2 })
567
+ checkHashable(
568
+ xs.map(AnyHashable.init),
569
+ equalityOracle: { $0 / 2 == $1 / 2 })
570
+ }
571
+
572
+ AnyHashableTests.test("AnyHashable containing MinimalHashableRCSwiftError") {
573
+ let xs: [MinimalHashableRCSwiftError] = [
574
+ .caseA(LifetimeTracked(1)), .caseA(LifetimeTracked(1)),
575
+ .caseA(LifetimeTracked(2)), .caseA(LifetimeTracked(2)),
576
+ .caseB(LifetimeTracked(1)), .caseB(LifetimeTracked(1)),
577
+ .caseB(LifetimeTracked(2)), .caseB(LifetimeTracked(2)),
578
+ .caseC(LifetimeTracked(1)), .caseC(LifetimeTracked(1)),
579
+ .caseC(LifetimeTracked(2)), .caseC(LifetimeTracked(2)),
580
+ ]
581
+ expectEqual(.enum, SwiftRuntime.metadataKind(of: xs.first!))
582
+ checkHashable(xs, equalityOracle: { $0 / 2 == $1 / 2 })
583
+ checkHashable(
584
+ xs.map(AnyHashable.init),
585
+ equalityOracle: { $0 / 2 == $1 / 2 })
586
+ }
587
+
588
+ #if _runtime(_ObjC)
589
+ AnyHashableTests.test("AnyHashable containing _SwiftNativeNSError") {
590
+ let swiftErrors: [MinimalHashablePODSwiftError] = [
591
+ .caseA, .caseA,
592
+ .caseB, .caseB,
593
+ .caseC, .caseC,
594
+ ]
595
+ let nsErrors: [NSError] = swiftErrors.map { $0 as NSError }
596
+ expectEqual(
597
+ .objCClassWrapper,
598
+ SwiftRuntime.metadataKind(of: nsErrors.first!))
599
+ expectEqual("_SwiftNativeNSError", String(nsErrors[0].dynamicType))
600
+ checkHashable(nsErrors, equalityOracle: { $0 / 2 == $1 / 2 })
601
+ checkHashable(
602
+ nsErrors.map(AnyHashable.init),
603
+ equalityOracle: { $0 / 2 == $1 / 2 })
604
+ }
605
+
606
+ AnyHashableTests.test("AnyHashable containing NSError") {
607
+ let nsErrors: [NSError] = [
608
+ NSError(domain: "Foo", code: 0),
609
+ NSError(domain: "Foo", code: 0),
610
+ NSError(domain: "Foo", code: 1),
611
+ NSError(domain: "Foo", code: 1),
612
+ NSError(domain: "Foo", code: 2),
613
+ NSError(domain: "Foo", code: 2),
614
+ ]
615
+ expectEqual(
616
+ .objCClassWrapper,
617
+ SwiftRuntime.metadataKind(of: nsErrors.first!))
618
+ checkHashable(nsErrors, equalityOracle: { $0 / 2 == $1 / 2 })
619
+ checkHashable(
620
+ nsErrors.map(AnyHashable.init),
621
+ equalityOracle: { $0 / 2 == $1 / 2 })
622
+ }
492
623
#endif
493
624
494
625
runAllTests()
0 commit comments