Skip to content

AnyHashable tests for Foundation types: add tests for bridging back to Swift types + fixes that make tests pass #3785

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 28, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/AffineTransform.swift
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,8 @@ extension AffineTransform : _ObjectiveCBridgeable {
}

extension NSAffineTransform : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as AffineTransform)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/Calendar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1129,6 +1129,8 @@ extension Calendar : _ObjectiveCBridgeable {
}

extension NSCalendar : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as Calendar)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/CharacterSet.swift
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,8 @@ extension CharacterSet : _ObjectiveCBridgeable {
}

extension NSCharacterSet : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as CharacterSet)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/Data.swift
Original file line number Diff line number Diff line change
Expand Up @@ -730,6 +730,8 @@ extension Data : _ObjectiveCBridgeable {
}

extension NSData : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as Data)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/Date.swift
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,8 @@ extension Date : _ObjectiveCBridgeable {
}

extension NSDate : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as Date)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/DateComponents.swift
Original file line number Diff line number Diff line change
Expand Up @@ -346,6 +346,8 @@ extension DateComponents : _ObjectiveCBridgeable {
}

extension NSDateComponents : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as DateComponents)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/DateInterval.swift
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,8 @@ extension DateInterval : _ObjectiveCBridgeable {

@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
extension NSDateInterval : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as DateInterval)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/Foundation.swift
Original file line number Diff line number Diff line change
Expand Up @@ -937,6 +937,8 @@ extension Set : _ObjectiveCBridgeable {
/*
FIXME(id-as-any): uncomment this when we can cast NSSet to Set<AnyHashable>.
extension NSSet : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
var builder = _SetBuilder<Element>(count: s!.count)
// FIXME(id-as-any): how to get the Hashable conformance here?
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/IndexPath.swift
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,8 @@ extension IndexPath : _ObjectiveCBridgeable {
}

extension NSIndexPath : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as IndexPath)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/IndexSet.swift
Original file line number Diff line number Diff line change
Expand Up @@ -885,6 +885,8 @@ extension IndexSet : _ObjectiveCBridgeable {
}

extension NSIndexSet : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as IndexSet)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/Locale.swift
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,8 @@ extension Locale : _ObjectiveCBridgeable {
}

extension NSLocale : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as Locale)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/Measurement.swift
Original file line number Diff line number Diff line change
Expand Up @@ -294,6 +294,8 @@ FIXME(id-as-any): can't write this code because of:

@available(OSX 10.12, iOS 10.0, watchOS 3.0, tvOS 10.0, *)
extension NSMeasurement : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as Measurement)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/Notification.swift
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,8 @@ extension Notification : _ObjectiveCBridgeable {
}

extension NSNotification : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as Notification)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/PersonNameComponents.swift
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ extension PersonNameComponents : _ObjectiveCBridgeable {

@available(OSX 10.11, iOS 9.0, *)
extension NSPersonNameComponents : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as PersonNameComponents)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/TimeZone.swift
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,8 @@ extension TimeZone : _ObjectiveCBridgeable {
}

extension NSTimeZone : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as TimeZone)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/URL.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1168,6 +1168,8 @@ extension URL : CustomStringConvertible, CustomDebugStringConvertible {
}

extension NSURL : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as URL)
}
Expand Down
4 changes: 4 additions & 0 deletions stdlib/public/SDK/Foundation/URLComponents.swift
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,8 @@ extension URLComponents : _ObjectiveCBridgeable {
}

extension NSURLComponents : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as URLComponents)
}
Expand Down Expand Up @@ -463,6 +465,8 @@ extension URLQueryItem : _ObjectiveCBridgeable {

@available(OSX 10.10, iOS 8.0, *)
extension NSURLQueryItem : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as URLQueryItem)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/URLRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,8 @@ extension URLRequest : _ObjectiveCBridgeable {
}

extension NSURLRequest : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as URLRequest)
}
Expand Down
2 changes: 2 additions & 0 deletions stdlib/public/SDK/Foundation/UUID.swift
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,8 @@ extension UUID : _ObjectiveCBridgeable {
}

extension NSUUID : _HasCustomAnyHashableRepresentation {
// Must be @nonobjc to avoid infinite recursion during bridging.
@nonobjc
public func _toCustomAnyHashable() -> AnyHashable? {
return AnyHashable(self as UUID)
}
Expand Down
22 changes: 21 additions & 1 deletion test/1_stdlib/TestAffineTransform.swift
Original file line number Diff line number Diff line change
Expand Up @@ -331,7 +331,7 @@ class TestAffineTransform : TestAffineTransformSuper {
}

func test_AnyHashableContainingAffineTransform() {
let values = [
let values: [AffineTransform] = [
AffineTransform.identity,
AffineTransform(m11: -55.66, m12: 22.7, m21: 1.5, m22: 0.0, tX: -22, tY: -33),
AffineTransform(m11: -55.66, m12: 22.7, m21: 1.5, m22: 0.0, tX: -22, tY: -33)
Expand All @@ -343,6 +343,25 @@ class TestAffineTransform : TestAffineTransformSuper {
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}

func test_AnyHashableCreatedFromNSAffineTransform() {
func makeNSAffineTransform(rotatedByDegrees angle: CGFloat) -> NSAffineTransform {
let result = NSAffineTransform()
result.rotate(byDegrees: angle)
return result
}
let values: [NSAffineTransform] = [
makeNSAffineTransform(rotatedByDegrees: 0),
makeNSAffineTransform(rotatedByDegrees: 10),
makeNSAffineTransform(rotatedByDegrees: 10),
]
let anyHashables = values.map(AnyHashable.init)
expectEqual("AffineTransform", String(anyHashables[0].base.dynamicType))
expectEqual("AffineTransform", String(anyHashables[1].base.dynamicType))
expectEqual("AffineTransform", String(anyHashables[2].base.dynamicType))
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}
}

#if !FOUNDATION_XCTEST
Expand All @@ -364,6 +383,7 @@ AffineTransformTests.test("test_TransformComposition") { TestAffineTransform().t
AffineTransformTests.test("test_hashing_identity") { TestAffineTransform().test_hashing_identity() }
AffineTransformTests.test("test_hashing_values") { TestAffineTransform().test_hashing_values() }
AffineTransformTests.test("test_AnyHashableContainingAffineTransform") { TestAffineTransform().test_AnyHashableContainingAffineTransform() }
AffineTransformTests.test("test_AnyHashableCreatedFromNSAffineTransform") { TestAffineTransform().test_AnyHashableCreatedFromNSAffineTransform() }
runAllTests()
#endif

Expand Down
19 changes: 18 additions & 1 deletion test/1_stdlib/TestCalendar.swift
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ class TestCalendar : TestCalendarSuper {
}

func test_AnyHashableContainingCalendar() {
let values = [
let values: [Calendar] = [
Calendar(identifier: .gregorian),
Calendar(identifier: .japanese),
Calendar(identifier: .japanese)
Expand All @@ -269,6 +269,22 @@ class TestCalendar : TestCalendarSuper {
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}

func test_AnyHashableCreatedFromNSCalendar() {
if #available(iOS 8.0, *) {
let values: [NSCalendar] = [
NSCalendar(identifier: .gregorian)!,
NSCalendar(identifier: .japanese)!,
NSCalendar(identifier: .japanese)!,
]
let anyHashables = values.map(AnyHashable.init)
expectEqual("Calendar", String(anyHashables[0].base.dynamicType))
expectEqual("Calendar", String(anyHashables[1].base.dynamicType))
expectEqual("Calendar", String(anyHashables[2].base.dynamicType))
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}
}
}

#if !FOUNDATION_XCTEST
Expand All @@ -278,5 +294,6 @@ CalendarTests.test("test_bridgingAutoupdating") { TestCalendar().test_bridgingAu
CalendarTests.test("test_equality") { TestCalendar().test_equality() }
CalendarTests.test("test_properties") { TestCalendar().test_properties() }
CalendarTests.test("test_AnyHashableContainingCalendar") { TestCalendar().test_AnyHashableContainingCalendar() }
CalendarTests.test("test_AnyHashableCreatedFromNSCalendar") { TestCalendar().test_AnyHashableCreatedFromNSCalendar() }
runAllTests()
#endif
17 changes: 16 additions & 1 deletion test/1_stdlib/TestCharacterSet.swift
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ class TestCharacterSet : TestCharacterSetSuper {
}

func test_AnyHashableContainingCharacterSet() {
let values = [
let values: [CharacterSet] = [
CharacterSet(charactersIn: "ABC"),
CharacterSet(charactersIn: "XYZ"),
CharacterSet(charactersIn: "XYZ")
Expand All @@ -166,6 +166,20 @@ class TestCharacterSet : TestCharacterSetSuper {
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}

func test_AnyHashableCreatedFromNSCharacterSet() {
let values: [NSCharacterSet] = [
NSCharacterSet(charactersIn: "ABC"),
NSCharacterSet(charactersIn: "XYZ"),
NSCharacterSet(charactersIn: "XYZ"),
]
let anyHashables = values.map(AnyHashable.init)
expectEqual("CharacterSet", String(anyHashables[0].base.dynamicType))
expectEqual("CharacterSet", String(anyHashables[1].base.dynamicType))
expectEqual("CharacterSet", String(anyHashables[2].base.dynamicType))
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}
}


Expand All @@ -180,6 +194,7 @@ CharacterSetTests.test("testInsertAndRemove") { TestCharacterSet().testInsertAnd
CharacterSetTests.test("testBasics") { TestCharacterSet().testBasics() }
CharacterSetTests.test("test_classForCoder") { TestCharacterSet().test_classForCoder() }
CharacterSetTests.test("test_AnyHashableContainingCharacterSet") { TestCharacterSet().test_AnyHashableContainingCharacterSet() }
CharacterSetTests.test("test_AnyHashableCreatedFromNSCharacterSet") { TestCharacterSet().test_AnyHashableCreatedFromNSCharacterSet() }
runAllTests()
#endif

17 changes: 16 additions & 1 deletion test/1_stdlib/TestData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -867,7 +867,7 @@ class TestData : TestDataSuper {
}

func test_AnyHashableContainingData() {
let values = [
let values: [Data] = [
Data(base64Encoded: "AAAA")!,
Data(base64Encoded: "AAAB")!,
Data(base64Encoded: "AAAB")!,
Expand All @@ -879,6 +879,20 @@ class TestData : TestDataSuper {
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}

func test_AnyHashableCreatedFromNSData() {
let values: [NSData] = [
NSData(base64Encoded: "AAAA")!,
NSData(base64Encoded: "AAAB")!,
NSData(base64Encoded: "AAAB")!,
]
let anyHashables = values.map(AnyHashable.init)
expectEqual("Data", String(anyHashables[0].base.dynamicType))
expectEqual("Data", String(anyHashables[1].base.dynamicType))
expectEqual("Data", String(anyHashables[2].base.dynamicType))
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}
}

#if !FOUNDATION_XCTEST
Expand Down Expand Up @@ -921,6 +935,7 @@ DataTests.test("test_passing") { TestData().test_passing() }
DataTests.test("test_bufferSizeCalculation") { TestData().test_bufferSizeCalculation() }
DataTests.test("test_classForCoder") { TestData().test_classForCoder() }
DataTests.test("test_AnyHashableContainingData") { TestData().test_AnyHashableContainingData() }
DataTests.test("test_AnyHashableCreatedFromNSData") { TestData().test_AnyHashableCreatedFromNSData() }

// XCTest does not have a crash detection, whereas lit does
DataTests.test("bounding failure subdata") {
Expand Down
37 changes: 36 additions & 1 deletion test/1_stdlib/TestDate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -150,8 +150,22 @@ class TestDate : TestDateSuper {
expectEqual(anyHashables[1], anyHashables[2])
}

func test_AnyHashableCreatedFromNSDate() {
let values: [NSDate] = [
NSDate(timeIntervalSince1970: 1000000000),
NSDate(timeIntervalSince1970: 1000000001),
NSDate(timeIntervalSince1970: 1000000001),
]
let anyHashables = values.map(AnyHashable.init)
expectEqual("Date", String(anyHashables[0].base.dynamicType))
expectEqual("Date", String(anyHashables[1].base.dynamicType))
expectEqual("Date", String(anyHashables[2].base.dynamicType))
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}

func test_AnyHashableContainingDateComponents() {
let values = [
let values: [DateComponents] = [
DateComponents(year: 2016),
DateComponents(year: 1995),
DateComponents(year: 1995),
Expand All @@ -163,6 +177,25 @@ class TestDate : TestDateSuper {
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}

func test_AnyHashableCreatedFromNSDateComponents() {
func makeNSDateComponents(year: Int) -> NSDateComponents {
let result = NSDateComponents()
result.year = year
return result
}
let values: [NSDateComponents] = [
makeNSDateComponents(year: 2016),
makeNSDateComponents(year: 1995),
makeNSDateComponents(year: 1995),
]
let anyHashables = values.map(AnyHashable.init)
expectEqual("DateComponents", String(anyHashables[0].base.dynamicType))
expectEqual("DateComponents", String(anyHashables[1].base.dynamicType))
expectEqual("DateComponents", String(anyHashables[2].base.dynamicType))
expectNotEqual(anyHashables[0], anyHashables[1])
expectEqual(anyHashables[1], anyHashables[2])
}
}

#if !FOUNDATION_XCTEST
Expand All @@ -177,6 +210,8 @@ DateTests.test("testEquality") { TestDate().testEquality() }
DateTests.test("testTimeIntervalSinceDate") { TestDate().testTimeIntervalSinceDate() }
DateTests.test("testDateComponents") { TestDate().testDateComponents() }
DateTests.test("test_AnyHashableContainingDate") { TestDate().test_AnyHashableContainingDate() }
DateTests.test("test_AnyHashableCreatedFromNSDate") { TestDate().test_AnyHashableCreatedFromNSDate() }
DateTests.test("test_AnyHashableContainingDateComponents") { TestDate().test_AnyHashableContainingDateComponents() }
DateTests.test("test_AnyHashableCreatedFromNSDateComponents") { TestDate().test_AnyHashableCreatedFromNSDateComponents() }
runAllTests()
#endif
Loading