Skip to content

Commit ea5138c

Browse files
authored
Merge pull request #3785 from apple/Foundation-AnyHashable-tests
AnyHashable tests for Foundation types: add tests for bridging back to Swift types + fixes that make tests pass
2 parents c8edd4b + 4315082 commit ea5138c

33 files changed

+352
-14
lines changed

stdlib/public/SDK/Foundation/AffineTransform.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,8 @@ extension AffineTransform : _ObjectiveCBridgeable {
294294
}
295295

296296
extension NSAffineTransform : _HasCustomAnyHashableRepresentation {
297+
// Must be @nonobjc to avoid infinite recursion during bridging.
298+
@nonobjc
297299
public func _toCustomAnyHashable() -> AnyHashable? {
298300
return AnyHashable(self as AffineTransform)
299301
}

stdlib/public/SDK/Foundation/Calendar.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1129,6 +1129,8 @@ extension Calendar : _ObjectiveCBridgeable {
11291129
}
11301130

11311131
extension NSCalendar : _HasCustomAnyHashableRepresentation {
1132+
// Must be @nonobjc to avoid infinite recursion during bridging.
1133+
@nonobjc
11321134
public func _toCustomAnyHashable() -> AnyHashable? {
11331135
return AnyHashable(self as Calendar)
11341136
}

stdlib/public/SDK/Foundation/CharacterSet.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,8 @@ extension CharacterSet : _ObjectiveCBridgeable {
469469
}
470470

471471
extension NSCharacterSet : _HasCustomAnyHashableRepresentation {
472+
// Must be @nonobjc to avoid infinite recursion during bridging.
473+
@nonobjc
472474
public func _toCustomAnyHashable() -> AnyHashable? {
473475
return AnyHashable(self as CharacterSet)
474476
}

stdlib/public/SDK/Foundation/Data.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,8 @@ extension Data : _ObjectiveCBridgeable {
730730
}
731731

732732
extension NSData : _HasCustomAnyHashableRepresentation {
733+
// Must be @nonobjc to avoid infinite recursion during bridging.
734+
@nonobjc
733735
public func _toCustomAnyHashable() -> AnyHashable? {
734736
return AnyHashable(self as Data)
735737
}

stdlib/public/SDK/Foundation/Date.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,8 @@ extension Date : _ObjectiveCBridgeable {
263263
}
264264

265265
extension NSDate : _HasCustomAnyHashableRepresentation {
266+
// Must be @nonobjc to avoid infinite recursion during bridging.
267+
@nonobjc
266268
public func _toCustomAnyHashable() -> AnyHashable? {
267269
return AnyHashable(self as Date)
268270
}

stdlib/public/SDK/Foundation/DateComponents.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,8 @@ extension DateComponents : _ObjectiveCBridgeable {
346346
}
347347

348348
extension NSDateComponents : _HasCustomAnyHashableRepresentation {
349+
// Must be @nonobjc to avoid infinite recursion during bridging.
350+
@nonobjc
349351
public func _toCustomAnyHashable() -> AnyHashable? {
350352
return AnyHashable(self as DateComponents)
351353
}

stdlib/public/SDK/Foundation/DateInterval.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,8 @@ extension DateInterval : _ObjectiveCBridgeable {
222222

223223
@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
224224
extension NSDateInterval : _HasCustomAnyHashableRepresentation {
225+
// Must be @nonobjc to avoid infinite recursion during bridging.
226+
@nonobjc
225227
public func _toCustomAnyHashable() -> AnyHashable? {
226228
return AnyHashable(self as DateInterval)
227229
}

stdlib/public/SDK/Foundation/Foundation.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -937,6 +937,8 @@ extension Set : _ObjectiveCBridgeable {
937937
/*
938938
FIXME(id-as-any): uncomment this when we can cast NSSet to Set<AnyHashable>.
939939
extension NSSet : _HasCustomAnyHashableRepresentation {
940+
// Must be @nonobjc to avoid infinite recursion during bridging
941+
@nonobjc
940942
public func _toCustomAnyHashable() -> AnyHashable? {
941943
var builder = _SetBuilder<Element>(count: s!.count)
942944
// FIXME(id-as-any): how to get the Hashable conformance here?

stdlib/public/SDK/Foundation/IndexPath.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ extension IndexPath : _ObjectiveCBridgeable {
241241
}
242242

243243
extension NSIndexPath : _HasCustomAnyHashableRepresentation {
244+
// Must be @nonobjc to avoid infinite recursion during bridging.
245+
@nonobjc
244246
public func _toCustomAnyHashable() -> AnyHashable? {
245247
return AnyHashable(self as IndexPath)
246248
}

stdlib/public/SDK/Foundation/IndexSet.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,8 @@ extension IndexSet : _ObjectiveCBridgeable {
885885
}
886886

887887
extension NSIndexSet : _HasCustomAnyHashableRepresentation {
888+
// Must be @nonobjc to avoid infinite recursion during bridging.
889+
@nonobjc
888890
public func _toCustomAnyHashable() -> AnyHashable? {
889891
return AnyHashable(self as IndexSet)
890892
}

stdlib/public/SDK/Foundation/Locale.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,8 @@ extension Locale : _ObjectiveCBridgeable {
483483
}
484484

485485
extension NSLocale : _HasCustomAnyHashableRepresentation {
486+
// Must be @nonobjc to avoid infinite recursion during bridging.
487+
@nonobjc
486488
public func _toCustomAnyHashable() -> AnyHashable? {
487489
return AnyHashable(self as Locale)
488490
}

stdlib/public/SDK/Foundation/Measurement.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,8 @@ FIXME(id-as-any): can't write this code because of:
294294

295295
@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
296296
extension NSMeasurement : _HasCustomAnyHashableRepresentation {
297+
// Must be @nonobjc to avoid infinite recursion during bridging.
298+
@nonobjc
297299
public func _toCustomAnyHashable() -> AnyHashable? {
298300
return AnyHashable(self as Measurement)
299301
}

stdlib/public/SDK/Foundation/Notification.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,8 @@ extension Notification : _ObjectiveCBridgeable {
153153
}
154154

155155
extension NSNotification : _HasCustomAnyHashableRepresentation {
156+
// Must be @nonobjc to avoid infinite recursion during bridging.
157+
@nonobjc
156158
public func _toCustomAnyHashable() -> AnyHashable? {
157159
return AnyHashable(self as Notification)
158160
}

stdlib/public/SDK/Foundation/PersonNameComponents.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,8 @@ extension PersonNameComponents : _ObjectiveCBridgeable {
138138

139139
@available(OSX 10.11, iOS 9.0, *)
140140
extension NSPersonNameComponents : _HasCustomAnyHashableRepresentation {
141+
// Must be @nonobjc to avoid infinite recursion during bridging.
142+
@nonobjc
141143
public func _toCustomAnyHashable() -> AnyHashable? {
142144
return AnyHashable(self as PersonNameComponents)
143145
}

stdlib/public/SDK/Foundation/TimeZone.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,8 @@ extension TimeZone : _ObjectiveCBridgeable {
277277
}
278278

279279
extension NSTimeZone : _HasCustomAnyHashableRepresentation {
280+
// Must be @nonobjc to avoid infinite recursion during bridging.
281+
@nonobjc
280282
public func _toCustomAnyHashable() -> AnyHashable? {
281283
return AnyHashable(self as TimeZone)
282284
}

stdlib/public/SDK/Foundation/URL.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,6 +1168,8 @@ extension URL : CustomStringConvertible, CustomDebugStringConvertible {
11681168
}
11691169

11701170
extension NSURL : _HasCustomAnyHashableRepresentation {
1171+
// Must be @nonobjc to avoid infinite recursion during bridging.
1172+
@nonobjc
11711173
public func _toCustomAnyHashable() -> AnyHashable? {
11721174
return AnyHashable(self as URL)
11731175
}

stdlib/public/SDK/Foundation/URLComponents.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,8 @@ extension URLComponents : _ObjectiveCBridgeable {
371371
}
372372

373373
extension NSURLComponents : _HasCustomAnyHashableRepresentation {
374+
// Must be @nonobjc to avoid infinite recursion during bridging.
375+
@nonobjc
374376
public func _toCustomAnyHashable() -> AnyHashable? {
375377
return AnyHashable(self as URLComponents)
376378
}
@@ -463,6 +465,8 @@ extension URLQueryItem : _ObjectiveCBridgeable {
463465

464466
@available(OSX 10.10, iOS 8.0, *)
465467
extension NSURLQueryItem : _HasCustomAnyHashableRepresentation {
468+
// Must be @nonobjc to avoid infinite recursion during bridging.
469+
@nonobjc
466470
public func _toCustomAnyHashable() -> AnyHashable? {
467471
return AnyHashable(self as URLQueryItem)
468472
}

stdlib/public/SDK/Foundation/URLRequest.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,8 @@ extension URLRequest : _ObjectiveCBridgeable {
297297
}
298298

299299
extension NSURLRequest : _HasCustomAnyHashableRepresentation {
300+
// Must be @nonobjc to avoid infinite recursion during bridging.
301+
@nonobjc
300302
public func _toCustomAnyHashable() -> AnyHashable? {
301303
return AnyHashable(self as URLRequest)
302304
}

stdlib/public/SDK/Foundation/UUID.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,8 @@ extension UUID : _ObjectiveCBridgeable {
141141
}
142142

143143
extension NSUUID : _HasCustomAnyHashableRepresentation {
144+
// Must be @nonobjc to avoid infinite recursion during bridging.
145+
@nonobjc
144146
public func _toCustomAnyHashable() -> AnyHashable? {
145147
return AnyHashable(self as UUID)
146148
}

test/1_stdlib/TestAffineTransform.swift

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -331,7 +331,7 @@ class TestAffineTransform : TestAffineTransformSuper {
331331
}
332332

333333
func test_AnyHashableContainingAffineTransform() {
334-
let values = [
334+
let values: [AffineTransform] = [
335335
AffineTransform.identity,
336336
AffineTransform(m11: -55.66, m12: 22.7, m21: 1.5, m22: 0.0, tX: -22, tY: -33),
337337
AffineTransform(m11: -55.66, m12: 22.7, m21: 1.5, m22: 0.0, tX: -22, tY: -33)
@@ -343,6 +343,25 @@ class TestAffineTransform : TestAffineTransformSuper {
343343
expectNotEqual(anyHashables[0], anyHashables[1])
344344
expectEqual(anyHashables[1], anyHashables[2])
345345
}
346+
347+
func test_AnyHashableCreatedFromNSAffineTransform() {
348+
func makeNSAffineTransform(rotatedByDegrees angle: CGFloat) -> NSAffineTransform {
349+
let result = NSAffineTransform()
350+
result.rotate(byDegrees: angle)
351+
return result
352+
}
353+
let values: [NSAffineTransform] = [
354+
makeNSAffineTransform(rotatedByDegrees: 0),
355+
makeNSAffineTransform(rotatedByDegrees: 10),
356+
makeNSAffineTransform(rotatedByDegrees: 10),
357+
]
358+
let anyHashables = values.map(AnyHashable.init)
359+
expectEqual("AffineTransform", String(anyHashables[0].base.dynamicType))
360+
expectEqual("AffineTransform", String(anyHashables[1].base.dynamicType))
361+
expectEqual("AffineTransform", String(anyHashables[2].base.dynamicType))
362+
expectNotEqual(anyHashables[0], anyHashables[1])
363+
expectEqual(anyHashables[1], anyHashables[2])
364+
}
346365
}
347366

348367
#if !FOUNDATION_XCTEST
@@ -364,6 +383,7 @@ AffineTransformTests.test("test_TransformComposition") { TestAffineTransform().t
364383
AffineTransformTests.test("test_hashing_identity") { TestAffineTransform().test_hashing_identity() }
365384
AffineTransformTests.test("test_hashing_values") { TestAffineTransform().test_hashing_values() }
366385
AffineTransformTests.test("test_AnyHashableContainingAffineTransform") { TestAffineTransform().test_AnyHashableContainingAffineTransform() }
386+
AffineTransformTests.test("test_AnyHashableCreatedFromNSAffineTransform") { TestAffineTransform().test_AnyHashableCreatedFromNSAffineTransform() }
367387
runAllTests()
368388
#endif
369389

test/1_stdlib/TestCalendar.swift

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -257,7 +257,7 @@ class TestCalendar : TestCalendarSuper {
257257
}
258258

259259
func test_AnyHashableContainingCalendar() {
260-
let values = [
260+
let values: [Calendar] = [
261261
Calendar(identifier: .gregorian),
262262
Calendar(identifier: .japanese),
263263
Calendar(identifier: .japanese)
@@ -269,6 +269,22 @@ class TestCalendar : TestCalendarSuper {
269269
expectNotEqual(anyHashables[0], anyHashables[1])
270270
expectEqual(anyHashables[1], anyHashables[2])
271271
}
272+
273+
func test_AnyHashableCreatedFromNSCalendar() {
274+
if #available(iOS 8.0, *) {
275+
let values: [NSCalendar] = [
276+
NSCalendar(identifier: .gregorian)!,
277+
NSCalendar(identifier: .japanese)!,
278+
NSCalendar(identifier: .japanese)!,
279+
]
280+
let anyHashables = values.map(AnyHashable.init)
281+
expectEqual("Calendar", String(anyHashables[0].base.dynamicType))
282+
expectEqual("Calendar", String(anyHashables[1].base.dynamicType))
283+
expectEqual("Calendar", String(anyHashables[2].base.dynamicType))
284+
expectNotEqual(anyHashables[0], anyHashables[1])
285+
expectEqual(anyHashables[1], anyHashables[2])
286+
}
287+
}
272288
}
273289

274290
#if !FOUNDATION_XCTEST
@@ -278,5 +294,6 @@ CalendarTests.test("test_bridgingAutoupdating") { TestCalendar().test_bridgingAu
278294
CalendarTests.test("test_equality") { TestCalendar().test_equality() }
279295
CalendarTests.test("test_properties") { TestCalendar().test_properties() }
280296
CalendarTests.test("test_AnyHashableContainingCalendar") { TestCalendar().test_AnyHashableContainingCalendar() }
297+
CalendarTests.test("test_AnyHashableCreatedFromNSCalendar") { TestCalendar().test_AnyHashableCreatedFromNSCalendar() }
281298
runAllTests()
282299
#endif

test/1_stdlib/TestCharacterSet.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class TestCharacterSet : TestCharacterSetSuper {
154154
}
155155

156156
func test_AnyHashableContainingCharacterSet() {
157-
let values = [
157+
let values: [CharacterSet] = [
158158
CharacterSet(charactersIn: "ABC"),
159159
CharacterSet(charactersIn: "XYZ"),
160160
CharacterSet(charactersIn: "XYZ")
@@ -166,6 +166,20 @@ class TestCharacterSet : TestCharacterSetSuper {
166166
expectNotEqual(anyHashables[0], anyHashables[1])
167167
expectEqual(anyHashables[1], anyHashables[2])
168168
}
169+
170+
func test_AnyHashableCreatedFromNSCharacterSet() {
171+
let values: [NSCharacterSet] = [
172+
NSCharacterSet(charactersIn: "ABC"),
173+
NSCharacterSet(charactersIn: "XYZ"),
174+
NSCharacterSet(charactersIn: "XYZ"),
175+
]
176+
let anyHashables = values.map(AnyHashable.init)
177+
expectEqual("CharacterSet", String(anyHashables[0].base.dynamicType))
178+
expectEqual("CharacterSet", String(anyHashables[1].base.dynamicType))
179+
expectEqual("CharacterSet", String(anyHashables[2].base.dynamicType))
180+
expectNotEqual(anyHashables[0], anyHashables[1])
181+
expectEqual(anyHashables[1], anyHashables[2])
182+
}
169183
}
170184

171185

@@ -180,6 +194,7 @@ CharacterSetTests.test("testInsertAndRemove") { TestCharacterSet().testInsertAnd
180194
CharacterSetTests.test("testBasics") { TestCharacterSet().testBasics() }
181195
CharacterSetTests.test("test_classForCoder") { TestCharacterSet().test_classForCoder() }
182196
CharacterSetTests.test("test_AnyHashableContainingCharacterSet") { TestCharacterSet().test_AnyHashableContainingCharacterSet() }
197+
CharacterSetTests.test("test_AnyHashableCreatedFromNSCharacterSet") { TestCharacterSet().test_AnyHashableCreatedFromNSCharacterSet() }
183198
runAllTests()
184199
#endif
185200

test/1_stdlib/TestData.swift

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,7 @@ class TestData : TestDataSuper {
867867
}
868868

869869
func test_AnyHashableContainingData() {
870-
let values = [
870+
let values: [Data] = [
871871
Data(base64Encoded: "AAAA")!,
872872
Data(base64Encoded: "AAAB")!,
873873
Data(base64Encoded: "AAAB")!,
@@ -879,6 +879,20 @@ class TestData : TestDataSuper {
879879
expectNotEqual(anyHashables[0], anyHashables[1])
880880
expectEqual(anyHashables[1], anyHashables[2])
881881
}
882+
883+
func test_AnyHashableCreatedFromNSData() {
884+
let values: [NSData] = [
885+
NSData(base64Encoded: "AAAA")!,
886+
NSData(base64Encoded: "AAAB")!,
887+
NSData(base64Encoded: "AAAB")!,
888+
]
889+
let anyHashables = values.map(AnyHashable.init)
890+
expectEqual("Data", String(anyHashables[0].base.dynamicType))
891+
expectEqual("Data", String(anyHashables[1].base.dynamicType))
892+
expectEqual("Data", String(anyHashables[2].base.dynamicType))
893+
expectNotEqual(anyHashables[0], anyHashables[1])
894+
expectEqual(anyHashables[1], anyHashables[2])
895+
}
882896
}
883897

884898
#if !FOUNDATION_XCTEST
@@ -921,6 +935,7 @@ DataTests.test("test_passing") { TestData().test_passing() }
921935
DataTests.test("test_bufferSizeCalculation") { TestData().test_bufferSizeCalculation() }
922936
DataTests.test("test_classForCoder") { TestData().test_classForCoder() }
923937
DataTests.test("test_AnyHashableContainingData") { TestData().test_AnyHashableContainingData() }
938+
DataTests.test("test_AnyHashableCreatedFromNSData") { TestData().test_AnyHashableCreatedFromNSData() }
924939

925940
// XCTest does not have a crash detection, whereas lit does
926941
DataTests.test("bounding failure subdata") {

test/1_stdlib/TestDate.swift

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,22 @@ class TestDate : TestDateSuper {
150150
expectEqual(anyHashables[1], anyHashables[2])
151151
}
152152

153+
func test_AnyHashableCreatedFromNSDate() {
154+
let values: [NSDate] = [
155+
NSDate(timeIntervalSince1970: 1000000000),
156+
NSDate(timeIntervalSince1970: 1000000001),
157+
NSDate(timeIntervalSince1970: 1000000001),
158+
]
159+
let anyHashables = values.map(AnyHashable.init)
160+
expectEqual("Date", String(anyHashables[0].base.dynamicType))
161+
expectEqual("Date", String(anyHashables[1].base.dynamicType))
162+
expectEqual("Date", String(anyHashables[2].base.dynamicType))
163+
expectNotEqual(anyHashables[0], anyHashables[1])
164+
expectEqual(anyHashables[1], anyHashables[2])
165+
}
166+
153167
func test_AnyHashableContainingDateComponents() {
154-
let values = [
168+
let values: [DateComponents] = [
155169
DateComponents(year: 2016),
156170
DateComponents(year: 1995),
157171
DateComponents(year: 1995),
@@ -163,6 +177,25 @@ class TestDate : TestDateSuper {
163177
expectNotEqual(anyHashables[0], anyHashables[1])
164178
expectEqual(anyHashables[1], anyHashables[2])
165179
}
180+
181+
func test_AnyHashableCreatedFromNSDateComponents() {
182+
func makeNSDateComponents(year: Int) -> NSDateComponents {
183+
let result = NSDateComponents()
184+
result.year = year
185+
return result
186+
}
187+
let values: [NSDateComponents] = [
188+
makeNSDateComponents(year: 2016),
189+
makeNSDateComponents(year: 1995),
190+
makeNSDateComponents(year: 1995),
191+
]
192+
let anyHashables = values.map(AnyHashable.init)
193+
expectEqual("DateComponents", String(anyHashables[0].base.dynamicType))
194+
expectEqual("DateComponents", String(anyHashables[1].base.dynamicType))
195+
expectEqual("DateComponents", String(anyHashables[2].base.dynamicType))
196+
expectNotEqual(anyHashables[0], anyHashables[1])
197+
expectEqual(anyHashables[1], anyHashables[2])
198+
}
166199
}
167200

168201
#if !FOUNDATION_XCTEST
@@ -177,6 +210,8 @@ DateTests.test("testEquality") { TestDate().testEquality() }
177210
DateTests.test("testTimeIntervalSinceDate") { TestDate().testTimeIntervalSinceDate() }
178211
DateTests.test("testDateComponents") { TestDate().testDateComponents() }
179212
DateTests.test("test_AnyHashableContainingDate") { TestDate().test_AnyHashableContainingDate() }
213+
DateTests.test("test_AnyHashableCreatedFromNSDate") { TestDate().test_AnyHashableCreatedFromNSDate() }
180214
DateTests.test("test_AnyHashableContainingDateComponents") { TestDate().test_AnyHashableContainingDateComponents() }
215+
DateTests.test("test_AnyHashableCreatedFromNSDateComponents") { TestDate().test_AnyHashableCreatedFromNSDateComponents() }
181216
runAllTests()
182217
#endif

0 commit comments

Comments
 (0)