157
156
# use three values of each key element, to have a good chance of
158
157
# glitching dictionary hash lookups etc. Insert in randomish order that
159
158
# is not correct and not the reverse of the correct order.
160
builder.add_node((b'2002', b'2002'), b'data')
161
builder.add_node((b'2002', b'2000'), b'data')
162
builder.add_node((b'2002', b'2001'), b'data')
163
builder.add_node((b'2000', b'2002'), b'data')
164
builder.add_node((b'2000', b'2000'), b'data')
165
builder.add_node((b'2000', b'2001'), b'data')
166
builder.add_node((b'2001', b'2002'), b'data')
167
builder.add_node((b'2001', b'2000'), b'data')
168
builder.add_node((b'2001', b'2001'), b'data')
159
builder.add_node(('2002', '2002'), 'data')
160
builder.add_node(('2002', '2000'), 'data')
161
builder.add_node(('2002', '2001'), 'data')
162
builder.add_node(('2000', '2002'), 'data')
163
builder.add_node(('2000', '2000'), 'data')
164
builder.add_node(('2000', '2001'), 'data')
165
builder.add_node(('2001', '2002'), 'data')
166
builder.add_node(('2001', '2000'), 'data')
167
builder.add_node(('2001', '2001'), 'data')
169
168
stream = builder.finish()
170
169
contents = stream.read()
171
170
self.assertEqual(
172
b"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=9\n"
173
b"2000\x002000\x00\x00\x00data\n"
174
b"2000\x002001\x00\x00\x00data\n"
175
b"2000\x002002\x00\x00\x00data\n"
176
b"2001\x002000\x00\x00\x00data\n"
177
b"2001\x002001\x00\x00\x00data\n"
178
b"2001\x002002\x00\x00\x00data\n"
179
b"2002\x002000\x00\x00\x00data\n"
180
b"2002\x002001\x00\x00\x00data\n"
181
b"2002\x002002\x00\x00\x00data\n"
171
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=9\n"
172
"2000\x002000\x00\x00\x00data\n"
173
"2000\x002001\x00\x00\x00data\n"
174
"2000\x002002\x00\x00\x00data\n"
175
"2001\x002000\x00\x00\x00data\n"
176
"2001\x002001\x00\x00\x00data\n"
177
"2001\x002002\x00\x00\x00data\n"
178
"2002\x002000\x00\x00\x00data\n"
179
"2002\x002001\x00\x00\x00data\n"
180
"2002\x002002\x00\x00\x00data\n"
184
183
def test_build_index_reference_lists_are_included_one(self):
185
184
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
186
builder.add_node((b'key', ), b'data', ([], ))
185
builder.add_node(('key', ), 'data', ([], ))
187
186
stream = builder.finish()
188
187
contents = stream.read()
189
188
self.assertEqual(
190
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
191
b"key\x00\x00\x00data\n"
189
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
190
"key\x00\x00\x00data\n"
194
193
def test_build_index_reference_lists_with_2_element_keys(self):
195
builder = _mod_index.GraphIndexBuilder(
196
reference_lists=1, key_elements=2)
197
builder.add_node((b'key', b'key2'), b'data', ([], ))
194
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
195
builder.add_node(('key', 'key2'), 'data', ([], ))
198
196
stream = builder.finish()
199
197
contents = stream.read()
200
198
self.assertEqual(
201
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\nlen=1\n"
202
b"key\x00key2\x00\x00\x00data\n"
199
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\nlen=1\n"
200
"key\x00key2\x00\x00\x00data\n"
205
203
def test_build_index_reference_lists_are_included_two(self):
206
204
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
207
builder.add_node((b'key', ), b'data', ([], []))
205
builder.add_node(('key', ), 'data', ([], []))
208
206
stream = builder.finish()
209
207
contents = stream.read()
210
208
self.assertEqual(
211
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
212
b"key\x00\x00\t\x00data\n"
209
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
210
"key\x00\x00\t\x00data\n"
215
213
def test_clear_cache(self):
216
214
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
220
218
def test_node_references_are_byte_offsets(self):
221
219
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
222
builder.add_node((b'reference', ), b'data', ([], ))
223
builder.add_node((b'key', ), b'data', ([(b'reference', )], ))
220
builder.add_node(('reference', ), 'data', ([], ))
221
builder.add_node(('key', ), 'data', ([('reference', )], ))
224
222
stream = builder.finish()
225
223
contents = stream.read()
226
224
self.assertEqual(
227
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=2\n"
228
b"key\x00\x0072\x00data\n"
229
b"reference\x00\x00\x00data\n"
225
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=2\n"
226
"key\x00\x0072\x00data\n"
227
"reference\x00\x00\x00data\n"
232
230
def test_node_references_are_cr_delimited(self):
233
231
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
234
builder.add_node((b'reference', ), b'data', ([], ))
235
builder.add_node((b'reference2', ), b'data', ([], ))
236
builder.add_node((b'key', ), b'data',
237
([(b'reference', ), (b'reference2', )], ))
232
builder.add_node(('reference', ), 'data', ([], ))
233
builder.add_node(('reference2', ), 'data', ([], ))
234
builder.add_node(('key', ), 'data',
235
([('reference', ), ('reference2', )], ))
238
236
stream = builder.finish()
239
237
contents = stream.read()
240
238
self.assertEqual(
241
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=3\n"
242
b"key\x00\x00077\r094\x00data\n"
243
b"reference\x00\x00\x00data\n"
244
b"reference2\x00\x00\x00data\n"
239
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=3\n"
240
"key\x00\x00077\r094\x00data\n"
241
"reference\x00\x00\x00data\n"
242
"reference2\x00\x00\x00data\n"
247
245
def test_multiple_reference_lists_are_tab_delimited(self):
248
246
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
249
builder.add_node((b'keference', ), b'data', ([], []))
250
builder.add_node((b'rey', ), b'data',
251
([(b'keference', )], [(b'keference', )]))
247
builder.add_node(('keference', ), 'data', ([], []))
248
builder.add_node(('rey', ), 'data',
249
([('keference', )], [('keference', )]))
252
250
stream = builder.finish()
253
251
contents = stream.read()
254
252
self.assertEqual(
255
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=2\n"
256
b"keference\x00\x00\t\x00data\n"
257
b"rey\x00\x0059\t59\x00data\n"
253
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=2\n"
254
"keference\x00\x00\t\x00data\n"
255
"rey\x00\x0059\t59\x00data\n"
260
258
def test_add_node_referencing_missing_key_makes_absent(self):
261
259
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
262
builder.add_node((b'rey', ), b'data',
263
([(b'beference', ), (b'aeference2', )], ))
260
builder.add_node(('rey', ), 'data',
261
([('beference', ), ('aeference2', )], ))
264
262
stream = builder.finish()
265
263
contents = stream.read()
266
264
self.assertEqual(
267
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
268
b"aeference2\x00a\x00\x00\n"
269
b"beference\x00a\x00\x00\n"
270
b"rey\x00\x00074\r059\x00data\n"
265
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
266
"aeference2\x00a\x00\x00\n"
267
"beference\x00a\x00\x00\n"
268
"rey\x00\x00074\r059\x00data\n"
273
271
def test_node_references_three_digits(self):
274
272
# test the node digit expands as needed.
275
273
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
276
references = [((b"%d" % val), ) for val in range(8, -1, -1)]
277
builder.add_node((b'2-key', ), b'', (references, ))
274
references = [(str(val), ) for val in range(8, -1, -1)]
275
builder.add_node(('2-key', ), '', (references, ))
278
276
stream = builder.finish()
279
277
contents = stream.read()
280
278
self.assertEqualDiff(
281
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
285
b"2-key\x00\x00151\r145\r139\r133\r127\r121\r071\r065\r059\x00\n"
279
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
283
"2-key\x00\x00151\r145\r139\r133\r127\r121\r071\r065\r059\x00\n"
294
292
def test_absent_has_no_reference_overhead(self):
295
293
# the offsets after an absent record should be correct when there are
296
294
# >1 reference lists.
297
295
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
298
builder.add_node((b'parent', ), b'', ([(b'aail', ), (b'zther', )], []))
296
builder.add_node(('parent', ), '', ([('aail', ), ('zther', )], []))
299
297
stream = builder.finish()
300
298
contents = stream.read()
301
299
self.assertEqual(
302
b"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
303
b"aail\x00a\x00\x00\n"
304
b"parent\x00\x0059\r84\t\x00\n"
305
b"zther\x00a\x00\x00\n"
300
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
301
"aail\x00a\x00\x00\n"
302
"parent\x00\x0059\r84\t\x00\n"
303
"zther\x00a\x00\x00\n"
308
306
def test_add_node_bad_key(self):
309
307
builder = _mod_index.GraphIndexBuilder()
310
for bad_char in bytearray(b'\t\n\x0b\x0c\r\x00 '):
308
for bad_char in '\t\n\x0b\x0c\r\x00 ':
311
309
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
312
(b'a%skey' % int2byte(bad_char), ), b'data')
313
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
315
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
316
b'not-a-tuple', b'data')
310
('a%skey' % bad_char, ), 'data')
311
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
313
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
314
'not-a-tuple', 'data')
317
315
# not enough length
318
316
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
321
319
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
322
(b'primary', b'secondary'), b'data')
320
('primary', 'secondary'), 'data')
323
321
# secondary key elements get checked too:
324
322
builder = _mod_index.GraphIndexBuilder(key_elements=2)
325
for bad_char in bytearray(b'\t\n\x0b\x0c\r\x00 '):
323
for bad_char in '\t\n\x0b\x0c\r\x00 ':
326
324
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
327
(b'prefix', b'a%skey' % int2byte(bad_char)), b'data')
325
('prefix', 'a%skey' % bad_char), 'data')
329
327
def test_add_node_bad_data(self):
330
328
builder = _mod_index.GraphIndexBuilder()
331
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
333
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
329
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
331
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
336
334
def test_add_node_bad_mismatched_ref_lists_length(self):
337
335
builder = _mod_index.GraphIndexBuilder()
338
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
336
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
340
338
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
341
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
343
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
345
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
346
b'data aa', ([], []))
339
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
341
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
343
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
347
345
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
348
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
350
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
352
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
353
b'data aa', ([], [], []))
346
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
348
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
350
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, ('akey', ),
351
'data aa', ([], [], []))
355
353
def test_add_node_bad_key_in_reference_lists(self):
356
354
# first list, first key - trivial
357
355
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
358
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
359
b'data aa', ([(b'a key', )], ))
356
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
357
'data aa', ([('a key', )], ))
360
358
# references keys must be tuples too
361
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
362
b'data aa', (['not-a-tuple'], ))
359
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
360
'data aa', (['not-a-tuple'], ))
363
361
# not enough length
364
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
365
b'data aa', ([()], ))
362
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
367
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
368
b'data aa', ([(b'primary', b'secondary')], ))
365
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
366
'data aa', ([('primary', 'secondary')], ))
369
367
# need to check more than the first key in the list
370
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
371
b'data aa', ([(b'agoodkey', ), (b'that is a bad key', )], ))
368
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
369
'data aa', ([('agoodkey', ), ('that is a bad key', )], ))
372
370
# and if there is more than one list it should be getting checked
374
372
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
375
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
376
b'data aa', ([], ['a bad key']))
373
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, ('akey', ),
374
'data aa', ([], ['a bad key']))
378
376
def test_add_duplicate_key(self):
379
377
builder = _mod_index.GraphIndexBuilder()
380
builder.add_node((b'key', ), b'data')
378
builder.add_node(('key', ), 'data')
381
379
self.assertRaises(_mod_index.BadIndexDuplicateKey,
382
builder.add_node, (b'key', ), b'data')
380
builder.add_node, ('key', ), 'data')
384
382
def test_add_duplicate_key_2_elements(self):
385
383
builder = _mod_index.GraphIndexBuilder(key_elements=2)
386
builder.add_node((b'key', b'key'), b'data')
384
builder.add_node(('key', 'key'), 'data')
387
385
self.assertRaises(_mod_index.BadIndexDuplicateKey, builder.add_node,
388
(b'key', b'key'), b'data')
386
('key', 'key'), 'data')
390
388
def test_add_key_after_referencing_key(self):
391
389
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
392
builder.add_node((b'key', ), b'data', ([(b'reference', )], ))
393
builder.add_node((b'reference', ), b'data', ([],))
390
builder.add_node(('key', ), 'data', ([('reference', )], ))
391
builder.add_node(('reference', ), 'data', ([],))
395
393
def test_add_key_after_referencing_key_2_elements(self):
396
builder = _mod_index.GraphIndexBuilder(
397
reference_lists=1, key_elements=2)
398
builder.add_node((b'k', b'ey'), b'data',
399
([(b'reference', b'tokey')], ))
400
builder.add_node((b'reference', b'tokey'), b'data', ([],))
394
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
395
builder.add_node(('k', 'ey'), 'data', ([('reference', 'tokey')], ))
396
builder.add_node(('reference', 'tokey'), 'data', ([],))
402
398
def test_set_optimize(self):
403
builder = _mod_index.GraphIndexBuilder(
404
reference_lists=1, key_elements=2)
399
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
405
400
builder.set_optimize(for_size=True)
406
401
self.assertTrue(builder._optimize_for_size)
407
402
builder.set_optimize(for_size=False)
830
822
def test_iter_entries_references_resolved(self):
831
823
index = self.make_index(1, nodes=[
832
((b'name', ), b'data', ([(b'ref', ), (b'ref', )], )),
833
((b'ref', ), b'refdata', ([], ))])
834
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',), (b'ref',)),)),
835
(index, (b'ref', ), b'refdata', ((), ))},
836
set(index.iter_entries([(b'name',), (b'ref',)])))
824
(('name', ), 'data', ([('ref', ), ('ref', )], )),
825
(('ref', ), 'refdata', ([], ))])
826
self.assertEqual({(index, ('name', ), 'data', ((('ref',), ('ref',)),)),
827
(index, ('ref', ), 'refdata', ((), ))},
828
set(index.iter_entries([('name',), ('ref',)])))
838
830
def test_iter_entries_references_2_refs_resolved(self):
839
831
index = self.make_index(2, nodes=[
840
((b'name', ), b'data', ([(b'ref', )], [(b'ref', )])),
841
((b'ref', ), b'refdata', ([], []))])
842
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),), ((b'ref',),))),
843
(index, (b'ref', ), b'refdata', ((), ()))},
844
set(index.iter_entries([(b'name',), (b'ref',)])))
832
(('name', ), 'data', ([('ref', )], [('ref', )])),
833
(('ref', ), 'refdata', ([], []))])
834
self.assertEqual({(index, ('name', ), 'data', ((('ref',),), (('ref',),))),
835
(index, ('ref', ), 'refdata', ((), ()))},
836
set(index.iter_entries([('name',), ('ref',)])))
846
838
def test_iteration_absent_skipped(self):
847
839
index = self.make_index(1, nodes=[
848
((b'name', ), b'data', ([(b'ref', )], ))])
849
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
850
set(index.iter_all_entries()))
851
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
852
set(index.iter_entries([(b'name', )])))
853
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
840
(('name', ), 'data', ([('ref', )], ))])
841
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
842
set(index.iter_all_entries()))
843
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
844
set(index.iter_entries([('name', )])))
845
self.assertEqual([], list(index.iter_entries([('ref', )])))
855
847
def test_iteration_absent_skipped_2_element_keys(self):
856
848
index = self.make_index(1, key_elements=2, nodes=[
857
((b'name', b'fin'), b'data', ([(b'ref', b'erence')], ))])
858
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
859
list(index.iter_all_entries()))
860
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
861
list(index.iter_entries([(b'name', b'fin')])))
862
self.assertEqual([], list(index.iter_entries([(b'ref', b'erence')])))
849
(('name', 'fin'), 'data', ([('ref', 'erence')], ))])
850
self.assertEqual({(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))},
851
set(index.iter_all_entries()))
852
self.assertEqual({(index, ('name', 'fin'), 'data', ((('ref', 'erence'),),))},
853
set(index.iter_entries([('name', 'fin')])))
854
self.assertEqual([], list(index.iter_entries([('ref', 'erence')])))
864
856
def test_iter_all_keys(self):
865
857
index = self.make_index(1, nodes=[
866
((b'name', ), b'data', ([(b'ref', )], )),
867
((b'ref', ), b'refdata', ([], ))])
868
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
869
(index, (b'ref', ), b'refdata', ((), ))},
870
set(index.iter_entries([(b'name', ), (b'ref', )])))
858
(('name', ), 'data', ([('ref', )], )),
859
(('ref', ), 'refdata', ([], ))])
860
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
861
(index, ('ref', ), 'refdata', ((), ))},
862
set(index.iter_entries([('name', ), ('ref', )])))
872
864
def test_iter_nothing_empty(self):
873
865
index = self.make_index()
876
868
def test_iter_missing_entry_empty(self):
877
869
index = self.make_index()
878
self.assertEqual([], list(index.iter_entries([(b'a', )])))
870
self.assertEqual([], list(index.iter_entries([('a', )])))
880
872
def test_iter_missing_entry_empty_no_size(self):
881
873
idx = self.make_index()
882
874
idx = _mod_index.GraphIndex(idx._transport, 'index', None)
883
self.assertEqual([], list(idx.iter_entries([(b'a', )])))
875
self.assertEqual([], list(idx.iter_entries([('a', )])))
885
877
def test_iter_key_prefix_1_element_key_None(self):
886
878
index = self.make_index()
887
879
self.assertRaises(_mod_index.BadIndexKey, list,
888
index.iter_entries_prefix([(None, )]))
880
index.iter_entries_prefix([(None, )]))
890
882
def test_iter_key_prefix_wrong_length(self):
891
883
index = self.make_index()
892
884
self.assertRaises(_mod_index.BadIndexKey, list,
893
index.iter_entries_prefix([(b'foo', None)]))
885
index.iter_entries_prefix([('foo', None)]))
894
886
index = self.make_index(key_elements=2)
895
887
self.assertRaises(_mod_index.BadIndexKey, list,
896
index.iter_entries_prefix([(b'foo', )]))
888
index.iter_entries_prefix([('foo', )]))
897
889
self.assertRaises(_mod_index.BadIndexKey, list,
898
index.iter_entries_prefix([(b'foo', None, None)]))
890
index.iter_entries_prefix([('foo', None, None)]))
900
892
def test_iter_key_prefix_1_key_element_no_refs(self):
901
index = self.make_index(nodes=[
902
((b'name', ), b'data', ()),
903
((b'ref', ), b'refdata', ())])
904
self.assertEqual({(index, (b'name', ), b'data'),
905
(index, (b'ref', ), b'refdata')},
906
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
893
index = self.make_index( nodes=[
894
(('name', ), 'data', ()),
895
(('ref', ), 'refdata', ())])
896
self.assertEqual({(index, ('name', ), 'data'),
897
(index, ('ref', ), 'refdata')},
898
set(index.iter_entries_prefix([('name', ), ('ref', )])))
908
900
def test_iter_key_prefix_1_key_element_refs(self):
909
901
index = self.make_index(1, nodes=[
910
((b'name', ), b'data', ([(b'ref', )], )),
911
((b'ref', ), b'refdata', ([], ))])
912
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
913
(index, (b'ref', ), b'refdata', ((), ))},
914
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
902
(('name', ), 'data', ([('ref', )], )),
903
(('ref', ), 'refdata', ([], ))])
904
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
905
(index, ('ref', ), 'refdata', ((), ))},
906
set(index.iter_entries_prefix([('name', ), ('ref', )])))
916
908
def test_iter_key_prefix_2_key_element_no_refs(self):
917
909
index = self.make_index(key_elements=2, nodes=[
918
((b'name', b'fin1'), b'data', ()),
919
((b'name', b'fin2'), b'beta', ()),
920
((b'ref', b'erence'), b'refdata', ())])
921
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
922
(index, (b'ref', b'erence'), b'refdata')},
923
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
924
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
925
(index, (b'name', b'fin2'), b'beta')},
926
set(index.iter_entries_prefix([(b'name', None)])))
910
(('name', 'fin1'), 'data', ()),
911
(('name', 'fin2'), 'beta', ()),
912
(('ref', 'erence'), 'refdata', ())])
913
self.assertEqual({(index, ('name', 'fin1'), 'data'),
914
(index, ('ref', 'erence'), 'refdata')},
915
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
916
self.assertEqual({(index, ('name', 'fin1'), 'data'),
917
(index, ('name', 'fin2'), 'beta')},
918
set(index.iter_entries_prefix([('name', None)])))
928
920
def test_iter_key_prefix_2_key_element_refs(self):
929
921
index = self.make_index(1, key_elements=2, nodes=[
930
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
931
((b'name', b'fin2'), b'beta', ([], )),
932
((b'ref', b'erence'), b'refdata', ([], ))])
933
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
934
(index, (b'ref', b'erence'), b'refdata', ((), ))},
935
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
936
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
937
(index, (b'name', b'fin2'), b'beta', ((), ))},
938
set(index.iter_entries_prefix([(b'name', None)])))
922
(('name', 'fin1'), 'data', ([('ref', 'erence')], )),
923
(('name', 'fin2'), 'beta', ([], )),
924
(('ref', 'erence'), 'refdata', ([], ))])
925
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
926
(index, ('ref', 'erence'), 'refdata', ((), ))},
927
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
928
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
929
(index, ('name', 'fin2'), 'beta', ((), ))},
930
set(index.iter_entries_prefix([('name', None)])))
940
932
def test_key_count_empty(self):
941
933
index = self.make_index()
942
934
self.assertEqual(0, index.key_count())
944
936
def test_key_count_one(self):
945
index = self.make_index(nodes=[((b'name', ), b'', ())])
937
index = self.make_index(nodes=[(('name', ), '', ())])
946
938
self.assertEqual(1, index.key_count())
948
940
def test_key_count_two(self):
949
941
index = self.make_index(nodes=[
950
((b'name', ), b'', ()), ((b'foo', ), b'', ())])
942
(('name', ), '', ()), (('foo', ), '', ())])
951
943
self.assertEqual(2, index.key_count())
953
945
def test_read_and_parse_tracks_real_read_value(self):
1021
1013
def test_external_references_no_results(self):
1022
1014
index = self.make_index(ref_lists=1, nodes=[
1023
((b'key',), b'value', ([],))])
1015
(('key',), 'value', ([],))])
1024
1016
self.assertEqual(set(), index.external_references(0))
1026
1018
def test_external_references_missing_ref(self):
1027
missing_key = (b'missing',)
1019
missing_key = ('missing',)
1028
1020
index = self.make_index(ref_lists=1, nodes=[
1029
((b'key',), b'value', ([missing_key],))])
1021
(('key',), 'value', ([missing_key],))])
1030
1022
self.assertEqual({missing_key}, index.external_references(0))
1032
1024
def test_external_references_multiple_ref_lists(self):
1033
missing_key = (b'missing',)
1025
missing_key = ('missing',)
1034
1026
index = self.make_index(ref_lists=2, nodes=[
1035
((b'key',), b'value', ([], [missing_key]))])
1027
(('key',), 'value', ([], [missing_key]))])
1036
1028
self.assertEqual(set([]), index.external_references(0))
1037
1029
self.assertEqual({missing_key}, index.external_references(1))
1039
1031
def test_external_references_two_records(self):
1040
1032
index = self.make_index(ref_lists=1, nodes=[
1041
((b'key-1',), b'value', ([(b'key-2',)],)),
1042
((b'key-2',), b'value', ([],)),
1033
(('key-1',), 'value', ([('key-2',)],)),
1034
(('key-2',), 'value', ([],)),
1044
1036
self.assertEqual(set([]), index.external_references(0))
1046
1038
def test__find_ancestors(self):
1049
1041
index = self.make_index(ref_lists=1, key_elements=1, nodes=[
1050
(key1, b'value', ([key2],)),
1051
(key2, b'value', ([],)),
1042
(key1, 'value', ([key2],)),
1043
(key2, 'value', ([],)),
1053
1045
parent_map = {}
1054
1046
missing_keys = set()
1055
search_keys = index._find_ancestors(
1056
[key1], 0, parent_map, missing_keys)
1047
search_keys = index._find_ancestors([key1], 0, parent_map, missing_keys)
1057
1048
self.assertEqual({key1: (key2,)}, parent_map)
1058
1049
self.assertEqual(set(), missing_keys)
1059
1050
self.assertEqual({key2}, search_keys)
1199
1188
self.assertEqual([], list(idx.iter_all_entries()))
1201
1190
def test_iter_all_entries_simple(self):
1202
idx1 = self.make_index('name', nodes=[((b'name', ), b'data', ())])
1191
idx1 = self.make_index('name', nodes=[(('name', ), 'data', ())])
1203
1192
idx = _mod_index.CombinedGraphIndex([idx1])
1204
self.assertEqual([(idx1, (b'name', ), b'data')],
1205
list(idx.iter_all_entries()))
1193
self.assertEqual([(idx1, ('name', ), 'data')],
1194
list(idx.iter_all_entries()))
1207
1196
def test_iter_all_entries_two_indices(self):
1208
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1209
idx2 = self.make_index('name2', nodes=[((b'2', ), b'', ())])
1197
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1198
idx2 = self.make_index('name2', nodes=[(('2', ), '', ())])
1210
1199
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1211
self.assertEqual([(idx1, (b'name', ), b'data'),
1212
(idx2, (b'2', ), b'')],
1200
self.assertEqual([(idx1, ('name', ), 'data'),
1201
(idx2, ('2', ), '')],
1213
1202
list(idx.iter_all_entries()))
1215
1204
def test_iter_entries_two_indices_dup_key(self):
1216
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1217
idx2 = self.make_index('name2', nodes=[((b'name', ), b'data', ())])
1205
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1206
idx2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1218
1207
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1219
self.assertEqual([(idx1, (b'name', ), b'data')],
1220
list(idx.iter_entries([(b'name', )])))
1208
self.assertEqual([(idx1, ('name', ), 'data')],
1209
list(idx.iter_entries([('name', )])))
1222
1211
def test_iter_all_entries_two_indices_dup_key(self):
1223
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1224
idx2 = self.make_index('name2', nodes=[((b'name', ), b'data', ())])
1212
idx1 = self.make_index('name1', nodes=[(('name', ), 'data', ())])
1213
idx2 = self.make_index('name2', nodes=[(('name', ), 'data', ())])
1225
1214
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1226
self.assertEqual([(idx1, (b'name', ), b'data')],
1215
self.assertEqual([(idx1, ('name', ), 'data')],
1227
1216
list(idx.iter_all_entries()))
1229
1218
def test_iter_key_prefix_2_key_element_refs(self):
1230
1219
idx1 = self.make_index('1', 1, key_elements=2, nodes=[
1231
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], ))])
1220
(('name', 'fin1'), 'data', ([('ref', 'erence')], ))])
1232
1221
idx2 = self.make_index('2', 1, key_elements=2, nodes=[
1233
((b'name', b'fin2'), b'beta', ([], )),
1234
((b'ref', b'erence'), b'refdata', ([], ))])
1222
(('name', 'fin2'), 'beta', ([], )),
1223
(('ref', 'erence'), 'refdata', ([], ))])
1235
1224
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1236
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1237
(((b'ref', b'erence'),),)),
1238
(idx2, (b'ref', b'erence'), b'refdata', ((), ))},
1239
set(idx.iter_entries_prefix([(b'name', b'fin1'),
1240
(b'ref', b'erence')])))
1241
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1242
(((b'ref', b'erence'),),)),
1243
(idx2, (b'name', b'fin2'), b'beta', ((), ))},
1244
set(idx.iter_entries_prefix([(b'name', None)])))
1225
self.assertEqual({(idx1, ('name', 'fin1'), 'data',
1226
((('ref', 'erence'),),)),
1227
(idx2, ('ref', 'erence'), 'refdata', ((), ))},
1228
set(idx.iter_entries_prefix([('name', 'fin1'),
1229
('ref', 'erence')])))
1230
self.assertEqual({(idx1, ('name', 'fin1'), 'data',
1231
((('ref', 'erence'),),)),
1232
(idx2, ('name', 'fin2'), 'beta', ((), ))},
1233
set(idx.iter_entries_prefix([('name', None)])))
1246
1235
def test_iter_nothing_empty(self):
1247
1236
idx = _mod_index.CombinedGraphIndex([])
1253
1242
self.assertEqual([], list(idx.iter_entries([])))
1255
1244
def test_iter_all_keys(self):
1256
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1258
idx2 = self.make_index(
1259
'2', 1, nodes=[((b'ref', ), b'refdata', ((), ))])
1245
idx1 = self.make_index('1', 1, nodes=[(('name', ), 'data',
1247
idx2 = self.make_index('2', 1, nodes=[(('ref', ), 'refdata', ((), ))])
1260
1248
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1261
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref', ), ), )),
1262
(idx2, (b'ref', ), b'refdata', ((), ))},
1263
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1249
self.assertEqual({(idx1, ('name', ), 'data', ((('ref', ), ), )),
1250
(idx2, ('ref', ), 'refdata', ((), ))},
1251
set(idx.iter_entries([('name', ), ('ref', )])))
1265
1253
def test_iter_all_keys_dup_entry(self):
1266
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1268
((b'ref', ), b'refdata', ([], ))])
1269
idx2 = self.make_index(
1270
'2', 1, nodes=[((b'ref', ), b'refdata', ([], ))])
1254
idx1 = self.make_index('1', 1, nodes=[(('name', ), 'data',
1256
(('ref', ), 'refdata', ([], ))])
1257
idx2 = self.make_index('2', 1, nodes=[(('ref', ), 'refdata', ([], ))])
1271
1258
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1272
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref',),),)),
1273
(idx1, (b'ref', ), b'refdata', ((), ))},
1274
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1259
self.assertEqual({(idx1, ('name', ), 'data', ((('ref',),),)),
1260
(idx1, ('ref', ), 'refdata', ((), ))},
1261
set(idx.iter_entries([('name', ), ('ref', )])))
1276
1263
def test_iter_missing_entry_empty(self):
1277
1264
idx = _mod_index.CombinedGraphIndex([])
1571
1559
idx = self.make_index('test', ref_lists=1, key_elements=1, nodes=[])
1572
1560
parent_map = {}
1573
1561
missing_keys = set()
1574
search_keys = idx._find_ancestors([(b'one',), (b'two',)], 0, parent_map,
1562
search_keys = idx._find_ancestors([('one',), ('two',)], 0, parent_map,
1576
1564
self.assertEqual(set(), search_keys)
1577
1565
self.assertEqual({}, parent_map)
1578
self.assertEqual({(b'one',), (b'two',)}, missing_keys)
1566
self.assertEqual({('one',), ('two',)}, missing_keys)
1581
1569
class TestInMemoryGraphIndex(tests.TestCaseWithMemoryTransport):
1583
1571
def make_index(self, ref_lists=0, key_elements=1, nodes=[]):
1584
result = _mod_index.InMemoryGraphIndex(
1585
ref_lists, key_elements=key_elements)
1572
result = _mod_index.InMemoryGraphIndex(ref_lists, key_elements=key_elements)
1586
1573
result.add_nodes(nodes)
1589
1576
def test_add_nodes_no_refs(self):
1590
1577
index = self.make_index(0)
1591
index.add_nodes([((b'name', ), b'data')])
1592
index.add_nodes([((b'name2', ), b''), ((b'name3', ), b'')])
1578
index.add_nodes([(('name', ), 'data')])
1579
index.add_nodes([(('name2', ), ''), (('name3', ), '')])
1593
1580
self.assertEqual({
1594
(index, (b'name', ), b'data'),
1595
(index, (b'name2', ), b''),
1596
(index, (b'name3', ), b''),
1581
(index, ('name', ), 'data'),
1582
(index, ('name2', ), ''),
1583
(index, ('name3', ), ''),
1597
1584
}, set(index.iter_all_entries()))
1599
1586
def test_add_nodes(self):
1600
1587
index = self.make_index(1)
1601
index.add_nodes([((b'name', ), b'data', ([],))])
1602
index.add_nodes([((b'name2', ), b'', ([],)),
1603
((b'name3', ), b'', ([(b'r', )],))])
1588
index.add_nodes([(('name', ), 'data', ([],))])
1589
index.add_nodes([(('name2', ), '', ([],)), (('name3', ), '', ([('r', )],))])
1604
1590
self.assertEqual({
1605
(index, (b'name', ), b'data', ((),)),
1606
(index, (b'name2', ), b'', ((),)),
1607
(index, (b'name3', ), b'', (((b'r', ), ), )),
1591
(index, ('name', ), 'data', ((),)),
1592
(index, ('name2', ), '', ((),)),
1593
(index, ('name3', ), '', ((('r', ), ), )),
1608
1594
}, set(index.iter_all_entries()))
1610
1596
def test_iter_all_entries_empty(self):
1612
1598
self.assertEqual([], list(index.iter_all_entries()))
1614
1600
def test_iter_all_entries_simple(self):
1615
index = self.make_index(nodes=[((b'name', ), b'data')])
1616
self.assertEqual([(index, (b'name', ), b'data')],
1617
list(index.iter_all_entries()))
1601
index = self.make_index(nodes=[(('name', ), 'data')])
1602
self.assertEqual([(index, ('name', ), 'data')],
1603
list(index.iter_all_entries()))
1619
1605
def test_iter_all_entries_references(self):
1620
1606
index = self.make_index(1, nodes=[
1621
((b'name', ), b'data', ([(b'ref', )], )),
1622
((b'ref', ), b'refdata', ([], ))])
1623
self.assertEqual({(index, (b'name', ), b'data', (((b'ref', ),),)),
1624
(index, (b'ref', ), b'refdata', ((), ))},
1625
set(index.iter_all_entries()))
1607
(('name', ), 'data', ([('ref', )], )),
1608
(('ref', ), 'refdata', ([], ))])
1609
self.assertEqual({(index, ('name', ), 'data', ((('ref', ),),)),
1610
(index, ('ref', ), 'refdata', ((), ))},
1611
set(index.iter_all_entries()))
1627
1613
def test_iteration_absent_skipped(self):
1628
1614
index = self.make_index(1, nodes=[
1629
((b'name', ), b'data', ([(b'ref', )], ))])
1630
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1631
set(index.iter_all_entries()))
1632
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1633
set(index.iter_entries([(b'name', )])))
1634
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
1615
(('name', ), 'data', ([('ref', )], ))])
1616
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
1617
set(index.iter_all_entries()))
1618
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
1619
set(index.iter_entries([('name', )])))
1620
self.assertEqual([], list(index.iter_entries([('ref', )])))
1636
1622
def test_iter_all_keys(self):
1637
1623
index = self.make_index(1, nodes=[
1638
((b'name', ), b'data', ([(b'ref', )], )),
1639
((b'ref', ), b'refdata', ([], ))])
1640
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1641
(index, (b'ref', ), b'refdata', ((), ))},
1642
set(index.iter_entries([(b'name', ), (b'ref', )])))
1624
(('name', ), 'data', ([('ref', )], )),
1625
(('ref', ), 'refdata', ([], ))])
1626
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
1627
(index, ('ref', ), 'refdata', ((), ))},
1628
set(index.iter_entries([('name', ), ('ref', )])))
1644
1630
def test_iter_key_prefix_1_key_element_no_refs(self):
1645
index = self.make_index(nodes=[
1646
((b'name', ), b'data'),
1647
((b'ref', ), b'refdata')])
1648
self.assertEqual({(index, (b'name', ), b'data'),
1649
(index, (b'ref', ), b'refdata')},
1650
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1631
index = self.make_index( nodes=[
1632
(('name', ), 'data'),
1633
(('ref', ), 'refdata')])
1634
self.assertEqual({(index, ('name', ), 'data'),
1635
(index, ('ref', ), 'refdata')},
1636
set(index.iter_entries_prefix([('name', ), ('ref', )])))
1652
1638
def test_iter_key_prefix_1_key_element_refs(self):
1653
1639
index = self.make_index(1, nodes=[
1654
((b'name', ), b'data', ([(b'ref', )], )),
1655
((b'ref', ), b'refdata', ([], ))])
1656
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1657
(index, (b'ref', ), b'refdata', ((), ))},
1658
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1640
(('name', ), 'data', ([('ref', )], )),
1641
(('ref', ), 'refdata', ([], ))])
1642
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),)),
1643
(index, ('ref', ), 'refdata', ((), ))},
1644
set(index.iter_entries_prefix([('name', ), ('ref', )])))
1660
1646
def test_iter_key_prefix_2_key_element_no_refs(self):
1661
1647
index = self.make_index(key_elements=2, nodes=[
1662
((b'name', b'fin1'), b'data'),
1663
((b'name', b'fin2'), b'beta'),
1664
((b'ref', b'erence'), b'refdata')])
1665
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
1666
(index, (b'ref', b'erence'), b'refdata')},
1667
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1668
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
1669
(index, (b'name', b'fin2'), b'beta')},
1670
set(index.iter_entries_prefix([(b'name', None)])))
1648
(('name', 'fin1'), 'data'),
1649
(('name', 'fin2'), 'beta'),
1650
(('ref', 'erence'), 'refdata')])
1651
self.assertEqual({(index, ('name', 'fin1'), 'data'),
1652
(index, ('ref', 'erence'), 'refdata')},
1653
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
1654
self.assertEqual({(index, ('name', 'fin1'), 'data'),
1655
(index, ('name', 'fin2'), 'beta')},
1656
set(index.iter_entries_prefix([('name', None)])))
1672
1658
def test_iter_key_prefix_2_key_element_refs(self):
1673
1659
index = self.make_index(1, key_elements=2, nodes=[
1674
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
1675
((b'name', b'fin2'), b'beta', ([], )),
1676
((b'ref', b'erence'), b'refdata', ([], ))])
1677
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
1678
(index, (b'ref', b'erence'), b'refdata', ((), ))},
1679
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1680
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
1681
(index, (b'name', b'fin2'), b'beta', ((), ))},
1682
set(index.iter_entries_prefix([(b'name', None)])))
1660
(('name', 'fin1'), 'data', ([('ref', 'erence')], )),
1661
(('name', 'fin2'), 'beta', ([], )),
1662
(('ref', 'erence'), 'refdata', ([], ))])
1663
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
1664
(index, ('ref', 'erence'), 'refdata', ((), ))},
1665
set(index.iter_entries_prefix([('name', 'fin1'), ('ref', 'erence')])))
1666
self.assertEqual({(index, ('name', 'fin1'), 'data', ((('ref', 'erence'),),)),
1667
(index, ('name', 'fin2'), 'beta', ((), ))},
1668
set(index.iter_entries_prefix([('name', None)])))
1684
1670
def test_iter_nothing_empty(self):
1685
1671
index = self.make_index()
1715
1701
def make_index(self, ref_lists=1, key_elements=2, nodes=[],
1716
1702
add_callback=False):
1717
result = _mod_index.InMemoryGraphIndex(
1718
ref_lists, key_elements=key_elements)
1703
result = _mod_index.InMemoryGraphIndex(ref_lists, key_elements=key_elements)
1719
1704
result.add_nodes(nodes)
1720
1705
if add_callback:
1721
1706
add_nodes_callback = result.add_nodes
1723
1708
add_nodes_callback = None
1724
1709
adapter = _mod_index.GraphIndexPrefixAdapter(
1725
result, (b'prefix', ), key_elements - 1,
1710
result, ('prefix', ), key_elements - 1,
1726
1711
add_nodes_callback=add_nodes_callback)
1727
1712
return result, adapter
1729
1714
def test_add_node(self):
1730
1715
index, adapter = self.make_index(add_callback=True)
1731
adapter.add_node((b'key',), b'value', (((b'ref',),),))
1732
self.assertEqual({(index, (b'prefix', b'key'), b'value',
1733
(((b'prefix', b'ref'),),))},
1734
set(index.iter_all_entries()))
1716
adapter.add_node(('key',), 'value', ((('ref',),),))
1717
self.assertEqual({(index, ('prefix', 'key'), 'value',
1718
((('prefix', 'ref'),),))},
1719
set(index.iter_all_entries()))
1736
1721
def test_add_nodes(self):
1737
1722
index, adapter = self.make_index(add_callback=True)
1738
1723
adapter.add_nodes((
1739
((b'key',), b'value', (((b'ref',),),)),
1740
((b'key2',), b'value2', ((),)),
1724
(('key',), 'value', ((('ref',),),)),
1725
(('key2',), 'value2', ((),)),
1742
1727
self.assertEqual({
1743
(index, (b'prefix', b'key2'), b'value2', ((),)),
1744
(index, (b'prefix', b'key'), b'value', (((b'prefix', b'ref'),),))
1728
(index, ('prefix', 'key2'), 'value2', ((),)),
1729
(index, ('prefix', 'key'), 'value', ((('prefix', 'ref'),),))
1746
1731
set(index.iter_all_entries()))
1748
1733
def test_construct(self):
1749
1734
idx = _mod_index.InMemoryGraphIndex()
1750
adapter = _mod_index.GraphIndexPrefixAdapter(idx, (b'prefix', ), 1)
1735
adapter = _mod_index.GraphIndexPrefixAdapter(idx, ('prefix', ), 1)
1752
1737
def test_construct_with_callback(self):
1753
1738
idx = _mod_index.InMemoryGraphIndex()
1754
adapter = _mod_index.GraphIndexPrefixAdapter(idx, (b'prefix', ), 1,
1739
adapter = _mod_index.GraphIndexPrefixAdapter(idx, ('prefix', ), 1,
1757
1742
def test_iter_all_entries_cross_prefix_map_errors(self):
1758
1743
index, adapter = self.make_index(nodes=[
1759
((b'prefix', b'key1'), b'data1', (((b'prefixaltered', b'key2'),),))])
1760
self.assertRaises(_mod_index.BadIndexData, list,
1761
adapter.iter_all_entries())
1744
(('prefix', 'key1'), 'data1', ((('prefixaltered', 'key2'),),))])
1745
self.assertRaises(_mod_index.BadIndexData, list, adapter.iter_all_entries())
1763
1747
def test_iter_all_entries(self):
1764
1748
index, adapter = self.make_index(nodes=[
1765
((b'notprefix', b'key1'), b'data', ((), )),
1766
((b'prefix', b'key1'), b'data1', ((), )),
1767
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1768
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1769
(index, (b'key2', ), b'data2', (((b'key1',),),))},
1770
set(adapter.iter_all_entries()))
1749
(('notprefix', 'key1'), 'data', ((), )),
1750
(('prefix', 'key1'), 'data1', ((), )),
1751
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1752
self.assertEqual({(index, ('key1', ), 'data1', ((),)),
1753
(index, ('key2', ), 'data2', ((('key1',),),))},
1754
set(adapter.iter_all_entries()))
1772
1756
def test_iter_entries(self):
1773
1757
index, adapter = self.make_index(nodes=[
1774
((b'notprefix', b'key1'), b'data', ((), )),
1775
((b'prefix', b'key1'), b'data1', ((), )),
1776
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1758
(('notprefix', 'key1'), 'data', ((), )),
1759
(('prefix', 'key1'), 'data1', ((), )),
1760
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1777
1761
# ask for many - get all
1778
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1779
(index, (b'key2', ), b'data2', (((b'key1', ),),))},
1780
set(adapter.iter_entries([(b'key1', ), (b'key2', )])))
1762
self.assertEqual({(index, ('key1', ), 'data1', ((),)),
1763
(index, ('key2', ), 'data2', ((('key1', ),),))},
1764
set(adapter.iter_entries([('key1', ), ('key2', )])))
1781
1765
# ask for one, get one
1782
self.assertEqual({(index, (b'key1', ), b'data1', ((),))},
1783
set(adapter.iter_entries([(b'key1', )])))
1766
self.assertEqual({(index, ('key1', ), 'data1', ((),))},
1767
set(adapter.iter_entries([('key1', )])))
1784
1768
# ask for missing, get none
1785
1769
self.assertEqual(set(),
1786
set(adapter.iter_entries([(b'key3', )])))
1770
set(adapter.iter_entries([('key3', )])))
1788
1772
def test_iter_entries_prefix(self):
1789
1773
index, adapter = self.make_index(key_elements=3, nodes=[
1790
((b'notprefix', b'foo', b'key1'), b'data', ((), )),
1791
((b'prefix', b'prefix2', b'key1'), b'data1', ((), )),
1792
((b'prefix', b'prefix2', b'key2'), b'data2', (((b'prefix', b'prefix2', b'key1'),),))])
1774
(('notprefix', 'foo', 'key1'), 'data', ((), )),
1775
(('prefix', 'prefix2', 'key1'), 'data1', ((), )),
1776
(('prefix', 'prefix2', 'key2'), 'data2', ((('prefix', 'prefix2', 'key1'),),))])
1793
1777
# ask for a prefix, get the results for just that prefix, adjusted.
1794
self.assertEqual({(index, (b'prefix2', b'key1', ), b'data1', ((),)),
1795
(index, (b'prefix2', b'key2', ), b'data2', (((b'prefix2', b'key1', ),),))},
1796
set(adapter.iter_entries_prefix([(b'prefix2', None)])))
1778
self.assertEqual({(index, ('prefix2', 'key1', ), 'data1', ((),)),
1779
(index, ('prefix2', 'key2', ), 'data2', ((('prefix2', 'key1', ),),))},
1780
set(adapter.iter_entries_prefix([('prefix2', None)])))
1798
1782
def test_key_count_no_matching_keys(self):
1799
1783
index, adapter = self.make_index(nodes=[
1800
((b'notprefix', b'key1'), b'data', ((), ))])
1784
(('notprefix', 'key1'), 'data', ((), ))])
1801
1785
self.assertEqual(0, adapter.key_count())
1803
1787
def test_key_count_some_keys(self):
1804
1788
index, adapter = self.make_index(nodes=[
1805
((b'notprefix', b'key1'), b'data', ((), )),
1806
((b'prefix', b'key1'), b'data1', ((), )),
1807
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1789
(('notprefix', 'key1'), 'data', ((), )),
1790
(('prefix', 'key1'), 'data1', ((), )),
1791
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1808
1792
self.assertEqual(2, adapter.key_count())
1810
1794
def test_validate(self):
1811
1795
index, adapter = self.make_index()
1814
1797
def validate():
1815
1798
calls.append('called')
1816
1799
index.validate = validate