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