@@ -73,4 +73,173 @@ final class CapsuleSmokeTests: CollectionTestCase {
73
73
74
74
expectEqual ( inoutHasher. finalize ( ) , expectedHashValue)
75
75
}
76
+
77
+ func testCompactionWhenDeletingFromHashCollisionNode1( ) {
78
+ let map : HashMap < CollidableInt , CollidableInt > = [ : ]
79
+
80
+
81
+ var res1 = map
82
+ res1 [ CollidableInt ( 11 , 1 ) ] = CollidableInt ( 11 , 1 )
83
+ res1 [ CollidableInt ( 12 , 1 ) ] = CollidableInt ( 12 , 1 )
84
+
85
+ expectEqual ( res1. count, 2 )
86
+ expectTrue ( res1. contains ( CollidableInt ( 11 , 1 ) ) )
87
+ expectTrue ( res1. contains ( CollidableInt ( 12 , 1 ) ) )
88
+
89
+
90
+ var res2 = res1
91
+ res2 [ CollidableInt ( 12 , 1 ) ] = nil
92
+ expectTrue ( res2. contains ( CollidableInt ( 11 , 1 ) ) )
93
+ expectFalse ( res2. contains ( CollidableInt ( 12 , 1 ) ) )
94
+
95
+ expectEqual ( res2. count, 1 )
96
+ // expectEqual(HashMap.init([CollidableInt(11, 1) : CollidableInt(11, 1)]), res2)
97
+
98
+
99
+ var res3 = res1
100
+ res3 [ CollidableInt ( 11 , 1 ) ] = nil
101
+ expectFalse ( res3. contains ( CollidableInt ( 11 , 1 ) ) )
102
+ expectTrue ( res3. contains ( CollidableInt ( 12 , 1 ) ) )
103
+
104
+ expectEqual ( res3. count, 1 )
105
+ // expectEqual(HashMap.init([CollidableInt(12, 1) : CollidableInt(12, 1)]), res3)
106
+
107
+
108
+ var resX = res1
109
+ resX [ CollidableInt ( 32769 ) ] = CollidableInt ( 32769 )
110
+ resX [ CollidableInt ( 12 , 1 ) ] = nil
111
+ expectTrue ( resX. contains ( CollidableInt ( 11 , 1 ) ) )
112
+ expectFalse ( resX. contains ( CollidableInt ( 12 , 1 ) ) )
113
+ expectTrue ( resX. contains ( CollidableInt ( 32769 ) ) )
114
+
115
+ expectEqual ( resX. count, 2 )
116
+ // expectEqual(HashMap.init([CollidableInt(11, 1) : CollidableInt(11, 1), CollidableInt(32769) : CollidableInt(32769)]), resX)
117
+ }
118
+
119
+ func testCompactionWhenDeletingFromHashCollisionNode2( ) {
120
+ let map : HashMap < CollidableInt , CollidableInt > = [ : ]
121
+
122
+
123
+ var res1 = map
124
+ res1 [ CollidableInt ( 32769_1 , 32769 ) ] = CollidableInt ( 32769_1 , 32769 )
125
+ res1 [ CollidableInt ( 32769_2 , 32769 ) ] = CollidableInt ( 32769_2 , 32769 )
126
+
127
+ expectEqual ( res1. count, 2 )
128
+ expectTrue ( res1. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
129
+ expectTrue ( res1. contains ( CollidableInt ( 32769_2 , 32769 ) ) )
130
+
131
+
132
+ var res2 = res1
133
+ res2 [ CollidableInt ( 1 ) ] = CollidableInt ( 1 )
134
+
135
+ expectEqual ( res2. count, 3 )
136
+ expectTrue ( res2. contains ( CollidableInt ( 1 ) ) )
137
+ expectTrue ( res2. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
138
+ expectTrue ( res2. contains ( CollidableInt ( 32769_2 , 32769 ) ) )
139
+
140
+
141
+ var res3 = res2
142
+ res3 [ CollidableInt ( 32769_2 , 32769 ) ] = nil
143
+
144
+ expectEqual ( res3. count, 2 )
145
+ expectTrue ( res3. contains ( CollidableInt ( 1 ) ) )
146
+ expectTrue ( res3. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
147
+
148
+
149
+ // expectEqual(HashMap.init([CollidableInt(1) : CollidableInt(1), CollidableInt(32769_2, 32769) : CollidableInt(32769_2, 32769)]), res3)
150
+ }
151
+
152
+ func testCompactionWhenDeletingFromHashCollisionNode3( ) {
153
+ let map : HashMap < CollidableInt , CollidableInt > = [ : ]
154
+
155
+
156
+ var res1 = map
157
+ res1 [ CollidableInt ( 32769_1 , 32769 ) ] = CollidableInt ( 32769_1 , 32769 )
158
+ res1 [ CollidableInt ( 32769_2 , 32769 ) ] = CollidableInt ( 32769_2 , 32769 )
159
+
160
+ expectEqual ( res1. count, 2 )
161
+ expectTrue ( res1. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
162
+ expectTrue ( res1. contains ( CollidableInt ( 32769_2 , 32769 ) ) )
163
+
164
+
165
+ var res2 = res1
166
+ res2 [ CollidableInt ( 1 ) ] = CollidableInt ( 1 )
167
+
168
+ expectEqual ( res2. count, 3 )
169
+ expectTrue ( res2. contains ( CollidableInt ( 1 ) ) )
170
+ expectTrue ( res2. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
171
+ expectTrue ( res2. contains ( CollidableInt ( 32769_2 , 32769 ) ) )
172
+
173
+
174
+ var res3 = res2
175
+ res3 [ CollidableInt ( 1 ) ] = nil
176
+
177
+ expectEqual ( res3. count, 2 )
178
+ expectTrue ( res3. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
179
+ expectTrue ( res3. contains ( CollidableInt ( 32769_2 , 32769 ) ) )
180
+
181
+
182
+ // expectEqual(HashMap.init([CollidableInt(32769_1, 32769) : CollidableInt(32769_1, 32769), CollidableInt(32769_2, 32769) : CollidableInt(32769_2, 32769)]), res3)
183
+
184
+ }
185
+
186
+ func testCompactionWhenDeletingFromHashCollisionNode4( ) {
187
+ let map : HashMap < CollidableInt , CollidableInt > = [ : ]
188
+
189
+
190
+ var res1 = map
191
+ res1 [ CollidableInt ( 32769_1 , 32769 ) ] = CollidableInt ( 32769_1 , 32769 )
192
+ res1 [ CollidableInt ( 32769_2 , 32769 ) ] = CollidableInt ( 32769_2 , 32769 )
193
+
194
+ expectEqual ( res1. count, 2 )
195
+ expectTrue ( res1. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
196
+ expectTrue ( res1. contains ( CollidableInt ( 32769_2 , 32769 ) ) )
197
+
198
+
199
+ var res2 = res1
200
+ res2 [ CollidableInt ( 5 ) ] = CollidableInt ( 5 )
201
+
202
+ expectEqual ( res2. count, 3 )
203
+ expectTrue ( res2. contains ( CollidableInt ( 5 ) ) )
204
+ expectTrue ( res2. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
205
+ expectTrue ( res2. contains ( CollidableInt ( 32769_2 , 32769 ) ) )
206
+
207
+
208
+ var res3 = res2
209
+ res3 [ CollidableInt ( 5 ) ] = nil
210
+
211
+ expectEqual ( res3. count, 2 )
212
+ expectTrue ( res3. contains ( CollidableInt ( 32769_1 , 32769 ) ) )
213
+ expectTrue ( res3. contains ( CollidableInt ( 32769_2 , 32769 ) ) )
214
+
215
+
216
+ // expectEqual(res1, res3)
217
+ }
218
+ }
219
+
220
+ fileprivate final class CollidableInt : CustomStringConvertible , Equatable , Hashable {
221
+ let value : Int
222
+ let hashValue : Int
223
+
224
+ fileprivate init ( _ value: Int ) {
225
+ self . value = value
226
+ self . hashValue = value
227
+ }
228
+
229
+ fileprivate init ( _ value: Int , _ hashValue: Int ) {
230
+ self . value = value
231
+ self . hashValue = hashValue
232
+ }
233
+
234
+ var description : String {
235
+ return " \( value) [hash = \( hashValue) ] "
236
+ }
237
+
238
+ func hash( into hasher: inout Hasher ) {
239
+ hasher. combine ( hashValue)
240
+ }
241
+
242
+ static func == ( lhs: CollidableInt , rhs: CollidableInt ) -> Bool {
243
+ return lhs. value == rhs. value
244
+ }
76
245
}
0 commit comments