13
13
// RUN: %empty-directory(%t)
14
14
//
15
15
// RUN: %target-clang %S/Inputs/SwiftObjectNSObject/SwiftObjectNSObject.m -c -o %t/SwiftObjectNSObject.o -g
16
- // RUN: %target-build-swift %s -I %S/Inputs/SwiftObjectNSObject/ -Xlinker %t/SwiftObjectNSObject.o -o %t/SwiftObjectNSObject
16
+ // RUN: %target-build-swift %s -g - I %S/Inputs/SwiftObjectNSObject/ -Xlinker %t/SwiftObjectNSObject.o -o %t/SwiftObjectNSObject
17
17
// RUN: %target-codesign %t/SwiftObjectNSObject
18
18
// RUN: %target-run %t/SwiftObjectNSObject 2> %t/log.txt
19
19
// RUN: %FileCheck %s < %t/log.txt
@@ -39,24 +39,75 @@ class D : C {
39
39
@objc override class func cClassOverride( ) -> Int { return 8 }
40
40
}
41
41
42
- class E : Equatable {
42
+ class E : Equatable , CustomStringConvertible {
43
43
var i : Int
44
44
static func == ( lhs: E , rhs: E ) -> Bool { lhs. i == rhs. i }
45
45
init ( i: Int ) { self . i = i }
46
+ var description : String { " \( type ( of: self ) ) (i: \( self . i) ) " }
46
47
}
47
48
48
- class H : Hashable {
49
+ class E1 : E {
50
+ }
51
+
52
+ class E2 : E {
53
+ }
54
+
55
+ class F : CustomStringConvertible {
49
56
var i : Int
57
+ init ( i: Int ) { self . i = i }
58
+ var description : String { " \( type ( of: self ) ) (i: \( self . i) ) " }
59
+ }
60
+
61
+ class F1 : F , Equatable {
62
+ static func == ( lhs: F1 , rhs: F1 ) -> Bool { lhs. i == rhs. i }
63
+ }
64
+
65
+ class F2 : F , Equatable {
66
+ static func == ( lhs: F2 , rhs: F2 ) -> Bool { lhs. i == rhs. i }
67
+ }
68
+
69
+ class H : E , Hashable {
50
70
static func == ( lhs: H , rhs: H ) -> Bool { lhs. i == rhs. i }
51
71
func hash( into hasher: inout Hasher ) { hasher. combine ( i + 17 ) }
52
- init ( i: Int ) { self . i = i }
53
72
}
54
73
55
- @_silgen_name ( " TestSwiftObjectNSObject " )
56
- func TestSwiftObjectNSObject(
57
- _ c: C , _ d: D ,
58
- _ e1a: E , _ e1b: E , _ e2: E ,
59
- _ h1a: H , _ h1b: H , _ h2: H , _ hash1: UInt , _ hash2: UInt )
74
+ @_silgen_name ( " TestSwiftObjectNSObject " )
75
+ func TestSwiftObjectNSObject( _ c: C , _ d: D )
76
+ @_silgen_name( " TestSwiftObjectNSObjectEquals" )
77
+ func TestSwiftObjectNSObjectEquals( _: AnyObject , _: AnyObject )
78
+ @_silgen_name( " TestSwiftObjectNSObjectNotEquals" )
79
+ func TestSwiftObjectNSObjectNotEquals( _: AnyObject , _: AnyObject )
80
+ @_silgen_name( " TestSwiftObjectNSObjectHashValue" )
81
+ func TestSwiftObjectNSObjectHashValue( _: AnyObject , _: Int )
82
+ @_silgen_name( " TestSwiftObjectNSObjectAssertNoErrors" )
83
+ func TestSwiftObjectNSObjectAssertNoErrors()
84
+
85
+ // Verify that Obj-C isEqual: provides same answer as Swift ==
86
+ func TestEquatableEquals<T: Equatable & AnyObject>(_ e1: T, _ e2: T) {
87
+ if e1 == e2 {
88
+ TestSwiftObjectNSObjectEquals(e1, e2)
89
+ } else {
90
+ TestSwiftObjectNSObjectNotEquals(e1, e2)
91
+ }
92
+ }
93
+
94
+ func TestNonEquatableEquals(_ e1: AnyObject, _ e2: AnyObject) {
95
+ TestSwiftObjectNSObjectNotEquals(e1, e2)
96
+ }
97
+
98
+ // Verify that Obj-C hashValue matches Swift hashValue for Hashable types
99
+ func TestHashable(_ h: H)
100
+ {
101
+ TestSwiftObjectNSObjectHashValue(h, h.hashValue)
102
+ }
103
+
104
+ // Test Obj-C hashValue for Swift types that are not Hashable
105
+ func TestNonHashableHash(_ e: AnyObject)
106
+ {
107
+ // Non-Hashable type should always have the
108
+ // same hash value in Obj-C
109
+ TestSwiftObjectNSObjectHashValue(e, 1)
110
+ }
60
111
61
112
// This check is for NSLog() output from TestSwiftObjectNSObject().
62
113
// CHECK: c ##SwiftObjectNSObject.C##
@@ -66,10 +117,61 @@ func TestSwiftObjectNSObject(
66
117
// Temporarily disable this test on older OSes until we have time to
67
118
// look into why it's failing there. rdar://problem/47870743
68
119
if #available(OSX 10.12, iOS 10.0, *) {
69
- TestSwiftObjectNSObject ( C ( ) , D ( ) ,
70
- E ( i: 1 ) , E ( i: 1 ) , E ( i: 2 ) ,
71
- H ( i: 1 ) , H ( i: 1 ) , H ( i: 2 ) , UInt ( H ( i: 1 ) . hashValue) , UInt ( H ( i: 2 ) . hashValue) )
72
- // does not return
120
+ // Test a large number of Obj-C APIs
121
+ TestSwiftObjectNSObject(C(), D())
122
+
123
+ // ** Equatable types with an Equatable parent class
124
+ // Same type and class
125
+ TestEquatableEquals(E(i: 1), E(i: 1))
126
+ TestEquatableEquals(E(i: 790), E(i: 790))
127
+ TestEquatableEquals(E1(i: 1), E1(i: 1))
128
+ TestEquatableEquals(E1(i: 18), E1(i: 18))
129
+ TestEquatableEquals(E2(i: 1), E2(i: 1))
130
+ TestEquatableEquals(E2(i: 2), E2(i: 2))
131
+ // Different class
132
+ TestEquatableEquals(E1(i: 1), E2(i: 1))
133
+ TestEquatableEquals(E1(i: 1), E(i: 1))
134
+ TestEquatableEquals(E2(i: 1), E(i: 1))
135
+ // Different value
136
+ TestEquatableEquals(E(i: 1), E(i: 2))
137
+ TestEquatableEquals(E1(i: 1), E1(i: 2))
138
+ TestEquatableEquals(E2(i: 1), E2(i: 2))
139
+
140
+ // ** Non-Equatable parent class
141
+ // Same class and value
142
+ TestEquatableEquals(F1(i: 1), F1(i: 1))
143
+ TestEquatableEquals(F1(i: 1), F1(i: 2))
144
+ TestEquatableEquals(F2(i: 1), F2(i: 1))
145
+ TestEquatableEquals(F2(i: 1), F2(i: 2))
146
+
147
+ // Different class and/or value
148
+ TestNonEquatableEquals(F(i: 1), F(i: 2))
149
+ TestNonEquatableEquals(F(i: 1), F(i: 1))
150
+ TestNonEquatableEquals(F1(i: 1), F2(i: 1))
151
+ TestNonEquatableEquals(F1(i: 1), F(i: 1))
152
+
153
+ // Two equatable types with no common parent class
154
+ TestNonEquatableEquals(F1(i: 1), E(i: 1))
155
+ TestEquatableEquals(H(i:1), E(i:1))
156
+
157
+ // Non-Hashable: alway have the same Obj-C hashValue
158
+ TestNonHashableHash(E(i: 1))
159
+ TestNonHashableHash(E1(i: 3))
160
+ TestNonHashableHash(E2(i: 8))
161
+ TestNonHashableHash(C())
162
+ TestNonHashableHash(D())
163
+
164
+ // Hashable types are also Equatable
165
+ TestEquatableEquals(H(i:1), H(i:1))
166
+ TestEquatableEquals(H(i:1), H(i:2))
167
+ TestEquatableEquals(H(i:2), H(i:1))
168
+
169
+ // Verify Obj-C hash value agrees with Swift
170
+ TestHashable(H(i:1))
171
+ TestHashable(H(i:2))
172
+ TestHashable(H(i:18))
173
+
174
+ TestSwiftObjectNSObjectAssertNoErrors()
73
175
} else {
74
176
// Horrible hack to satisfy FileCheck
75
177
fputs( " c ##SwiftObjectNSObject. C##\n" , stderr)
0 commit comments