@@ -190,6 +190,7 @@ private void testMergeCandidatesOnce() {
190
190
// test merge where one array contains either exact duplicates, or duplicate scores, of the other
191
191
int maxSize = 1 + getRandom ().nextInt (5 );
192
192
193
+ // fill arr1 with nodes from 0..size, with random scores assigned (so random order of nodes)
193
194
NeighborArray arr1 = new NeighborArray (maxSize );
194
195
int a1Size ;
195
196
if (getRandom ().nextBoolean ()) {
@@ -201,6 +202,10 @@ private void testMergeCandidatesOnce() {
201
202
arr1 .insertSorted (i , getRandom ().nextFloat ());
202
203
}
203
204
205
+ // arr2 (smaller or same size as arr1) contains either
206
+ // -- an exact duplicates of the corresponding node in arr1, or
207
+ // -- a random score chosen from arr1
208
+ // this is designed to maximize the need for correct handling of corner cases in the merge
204
209
NeighborArray arr2 = new NeighborArray (maxSize );
205
210
int a2Size ;
206
211
if (getRandom ().nextBoolean ()) {
@@ -227,14 +232,38 @@ private void testMergeCandidatesOnce() {
227
232
}
228
233
}
229
234
235
+ // merge!
230
236
var merged = ConcurrentNeighborSet .mergeNeighbors (arr1 , arr2 );
237
+
238
+ // sanity check
231
239
assert merged .size <= arr1 .size () + arr2 .size ();
232
240
assert merged .size >= Math .max (arr1 .size (), arr2 .size ());
233
241
var uniqueNodes = new HashSet <>();
242
+
243
+ // results should be sorted by score, and not contain duplicates
234
244
for (int i = 0 ; i < merged .size - 1 ; i ++) {
235
245
assertTrue (merged .score [i ] >= merged .score [i + 1 ]);
236
246
assertTrue (uniqueNodes .add (merged .node [i ]));
237
247
}
248
+ assertTrue (uniqueNodes .add (merged .node [merged .size - 1 ]));
249
+
250
+ // results should contain all the nodes that were in the source arrays
251
+ for (int i = 0 ; i < arr1 .size (); i ++) {
252
+ assertTrue (String .format ("%s missing%na1: %s%na2: %s%nmerged: %s%n" ,
253
+ arr1 .node [i ],
254
+ Arrays .toString (arr1 .node ),
255
+ Arrays .toString (arr2 .node ),
256
+ Arrays .toString (merged .node )),
257
+ uniqueNodes .contains (arr1 .node [i ]));
258
+ }
259
+ for (int i = 0 ; i < arr2 .size (); i ++) {
260
+ assertTrue (String .format ("%s missing%na1: %s%na2: %s%nmerged: %s%n" ,
261
+ arr2 .node [i ],
262
+ Arrays .toString (arr1 .node ),
263
+ Arrays .toString (arr2 .node ),
264
+ Arrays .toString (merged .node )),
265
+ uniqueNodes .contains (arr2 .node [i ]));
266
+ }
238
267
}
239
268
240
269
@ Test
0 commit comments