156
157
# use three values of each key element, to have a good chance of
157
158
# glitching dictionary hash lookups etc. Insert in randomish order that
158
159
# 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')
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')
168
169
stream = builder.finish()
169
170
contents = stream.read()
170
171
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"
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"
183
184
def test_build_index_reference_lists_are_included_one(self):
184
185
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
185
builder.add_node(('key', ), 'data', ([], ))
186
builder.add_node((b'key', ), b'data', ([], ))
186
187
stream = builder.finish()
187
188
contents = stream.read()
188
189
self.assertEqual(
189
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
190
"key\x00\x00\x00data\n"
190
b"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
191
b"key\x00\x00\x00data\n"
193
194
def test_build_index_reference_lists_with_2_element_keys(self):
194
195
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
195
builder.add_node(('key', 'key2'), 'data', ([], ))
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' % int2byte(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' % int2byte(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
395
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', ([],))
396
builder.add_node((b'k', b'ey'), b'data', ([(b'reference', b'tokey')], ))
397
builder.add_node((b'reference', b'tokey'), b'data', ([],))
398
399
def test_set_optimize(self):
399
400
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
822
823
def test_iter_entries_references_resolved(self):
823
824
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',)])))
825
((b'name', ), b'data', ([(b'ref', ), (b'ref', )], )),
826
((b'ref', ), b'refdata', ([], ))])
827
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',), (b'ref',)),)),
828
(index, (b'ref', ), b'refdata', ((), ))},
829
set(index.iter_entries([(b'name',), (b'ref',)])))
830
831
def test_iter_entries_references_2_refs_resolved(self):
831
832
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',)])))
833
((b'name', ), b'data', ([(b'ref', )], [(b'ref', )])),
834
((b'ref', ), b'refdata', ([], []))])
835
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),), ((b'ref',),))),
836
(index, (b'ref', ), b'refdata', ((), ()))},
837
set(index.iter_entries([(b'name',), (b'ref',)])))
838
839
def test_iteration_absent_skipped(self):
839
840
index = self.make_index(1, nodes=[
840
(('name', ), 'data', ([('ref', )], ))])
841
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
841
((b'name', ), b'data', ([(b'ref', )], ))])
842
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
842
843
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', )])))
844
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
845
set(index.iter_entries([(b'name', )])))
846
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
847
848
def test_iteration_absent_skipped_2_element_keys(self):
848
849
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')])))
850
((b'name', b'fin'), b'data', ([(b'ref', b'erence')], ))])
851
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
852
list(index.iter_all_entries()))
853
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
854
list(index.iter_entries([(b'name', b'fin')])))
855
self.assertEqual([], list(index.iter_entries([(b'ref', b'erence')])))
856
857
def test_iter_all_keys(self):
857
858
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', )])))
859
((b'name', ), b'data', ([(b'ref', )], )),
860
((b'ref', ), b'refdata', ([], ))])
861
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
862
(index, (b'ref', ), b'refdata', ((), ))},
863
set(index.iter_entries([(b'name', ), (b'ref', )])))
864
865
def test_iter_nothing_empty(self):
865
866
index = self.make_index()
882
883
def test_iter_key_prefix_wrong_length(self):
883
884
index = self.make_index()
884
885
self.assertRaises(_mod_index.BadIndexKey, list,
885
index.iter_entries_prefix([('foo', None)]))
886
index.iter_entries_prefix([(b'foo', None)]))
886
887
index = self.make_index(key_elements=2)
887
888
self.assertRaises(_mod_index.BadIndexKey, list,
888
index.iter_entries_prefix([('foo', )]))
889
index.iter_entries_prefix([(b'foo', )]))
889
890
self.assertRaises(_mod_index.BadIndexKey, list,
890
index.iter_entries_prefix([('foo', None, None)]))
891
index.iter_entries_prefix([(b'foo', None, None)]))
892
893
def test_iter_key_prefix_1_key_element_no_refs(self):
893
894
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', )])))
895
((b'name', ), b'data', ()),
896
((b'ref', ), b'refdata', ())])
897
self.assertEqual({(index, (b'name', ), b'data'),
898
(index, (b'ref', ), b'refdata')},
899
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
900
901
def test_iter_key_prefix_1_key_element_refs(self):
901
902
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', )])))
903
((b'name', ), b'data', ([(b'ref', )], )),
904
((b'ref', ), b'refdata', ([], ))])
905
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
906
(index, (b'ref', ), b'refdata', ((), ))},
907
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
908
909
def test_iter_key_prefix_2_key_element_no_refs(self):
909
910
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)])))
911
((b'name', b'fin1'), b'data', ()),
912
((b'name', b'fin2'), b'beta', ()),
913
((b'ref', b'erence'), b'refdata', ())])
914
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
915
(index, (b'ref', b'erence'), b'refdata')},
916
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
917
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
918
(index, (b'name', b'fin2'), b'beta')},
919
set(index.iter_entries_prefix([(b'name', None)])))
920
921
def test_iter_key_prefix_2_key_element_refs(self):
921
922
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)])))
923
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
924
((b'name', b'fin2'), b'beta', ([], )),
925
((b'ref', b'erence'), b'refdata', ([], ))])
926
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
927
(index, (b'ref', b'erence'), b'refdata', ((), ))},
928
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
929
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
930
(index, (b'name', b'fin2'), b'beta', ((), ))},
931
set(index.iter_entries_prefix([(b'name', None)])))
932
933
def test_key_count_empty(self):
933
934
index = self.make_index()
934
935
self.assertEqual(0, index.key_count())
936
937
def test_key_count_one(self):
937
index = self.make_index(nodes=[(('name', ), '', ())])
938
index = self.make_index(nodes=[((b'name', ), b'', ())])
938
939
self.assertEqual(1, index.key_count())
940
941
def test_key_count_two(self):
941
942
index = self.make_index(nodes=[
942
(('name', ), '', ()), (('foo', ), '', ())])
943
((b'name', ), b'', ()), ((b'foo', ), b'', ())])
943
944
self.assertEqual(2, index.key_count())
945
946
def test_read_and_parse_tracks_real_read_value(self):
1188
1189
self.assertEqual([], list(idx.iter_all_entries()))
1190
1191
def test_iter_all_entries_simple(self):
1191
idx1 = self.make_index('name', nodes=[(('name', ), 'data', ())])
1192
idx1 = self.make_index('name', nodes=[((b'name', ), b'data', ())])
1192
1193
idx = _mod_index.CombinedGraphIndex([idx1])
1193
self.assertEqual([(idx1, ('name', ), 'data')],
1194
self.assertEqual([(idx1, (b'name', ), b'data')],
1194
1195
list(idx.iter_all_entries()))
1196
1197
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', ), '', ())])
1198
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1199
idx2 = self.make_index('name2', nodes=[((b'2', ), b'', ())])
1199
1200
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1200
self.assertEqual([(idx1, ('name', ), 'data'),
1201
(idx2, ('2', ), '')],
1201
self.assertEqual([(idx1, (b'name', ), b'data'),
1202
(idx2, (b'2', ), b'')],
1202
1203
list(idx.iter_all_entries()))
1204
1205
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', ())])
1206
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1207
idx2 = self.make_index('name2', nodes=[((b'name', ), b'data', ())])
1207
1208
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1208
self.assertEqual([(idx1, ('name', ), 'data')],
1209
list(idx.iter_entries([('name', )])))
1209
self.assertEqual([(idx1, (b'name', ), b'data')],
1210
list(idx.iter_entries([(b'name', )])))
1211
1212
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', ())])
1213
idx1 = self.make_index('name1', nodes=[((b'name', ), b'data', ())])
1214
idx2 = self.make_index('name2', nodes=[((b'name', ), b'data', ())])
1214
1215
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1215
self.assertEqual([(idx1, ('name', ), 'data')],
1216
self.assertEqual([(idx1, (b'name', ), b'data')],
1216
1217
list(idx.iter_all_entries()))
1218
1219
def test_iter_key_prefix_2_key_element_refs(self):
1219
1220
idx1 = self.make_index('1', 1, key_elements=2, nodes=[
1220
(('name', 'fin1'), 'data', ([('ref', 'erence')], ))])
1221
idx2 = self.make_index('2', 1, key_elements=2, nodes=[
1222
(('name', 'fin2'), 'beta', ([], )),
1223
(('ref', 'erence'), 'refdata', ([], ))])
1221
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], ))])
1222
idx2 = self.make_index(b'2', 1, key_elements=2, nodes=[
1223
((b'name', b'fin2'), b'beta', ([], )),
1224
((b'ref', b'erence'), b'refdata', ([], ))])
1224
1225
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)])))
1226
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1227
(((b'ref', b'erence'),),)),
1228
(idx2, (b'ref', b'erence'), b'refdata', ((), ))},
1229
set(idx.iter_entries_prefix([(b'name', b'fin1'),
1230
(b'ref', b'erence')])))
1231
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1232
(((b'ref', b'erence'),),)),
1233
(idx2, (b'name', b'fin2'), b'beta', ((), ))},
1234
set(idx.iter_entries_prefix([(b'name', None)])))
1235
1236
def test_iter_nothing_empty(self):
1236
1237
idx = _mod_index.CombinedGraphIndex([])
1242
1243
self.assertEqual([], list(idx.iter_entries([])))
1244
1245
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', ((), ))])
1246
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1248
idx2 = self.make_index('2', 1, nodes=[((b'ref', ), b'refdata', ((), ))])
1248
1249
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1249
self.assertEqual({(idx1, ('name', ), 'data', ((('ref', ), ), )),
1250
(idx2, ('ref', ), 'refdata', ((), ))},
1251
set(idx.iter_entries([('name', ), ('ref', )])))
1250
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref', ), ), )),
1251
(idx2, (b'ref', ), b'refdata', ((), ))},
1252
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1253
1254
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', ([], ))])
1255
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1257
((b'ref', ), b'refdata', ([], ))])
1258
idx2 = self.make_index('2', 1, nodes=[((b'ref', ), b'refdata', ([], ))])
1258
1259
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1259
self.assertEqual({(idx1, ('name', ), 'data', ((('ref',),),)),
1260
(idx1, ('ref', ), 'refdata', ((), ))},
1261
set(idx.iter_entries([('name', ), ('ref', )])))
1260
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref',),),)),
1261
(idx1, (b'ref', ), b'refdata', ((), ))},
1262
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1263
1264
def test_iter_missing_entry_empty(self):
1264
1265
idx = _mod_index.CombinedGraphIndex([])
1576
1577
def test_add_nodes_no_refs(self):
1577
1578
index = self.make_index(0)
1578
index.add_nodes([(('name', ), 'data')])
1579
index.add_nodes([(('name2', ), ''), (('name3', ), '')])
1579
index.add_nodes([((b'name', ), b'data')])
1580
index.add_nodes([((b'name2', ), b''), ((b'name3', ), b'')])
1580
1581
self.assertEqual({
1581
(index, ('name', ), 'data'),
1582
(index, ('name2', ), ''),
1583
(index, ('name3', ), ''),
1582
(index, (b'name', ), b'data'),
1583
(index, (b'name2', ), b''),
1584
(index, (b'name3', ), b''),
1584
1585
}, set(index.iter_all_entries()))
1586
1587
def test_add_nodes(self):
1587
1588
index = self.make_index(1)
1588
index.add_nodes([(('name', ), 'data', ([],))])
1589
index.add_nodes([(('name2', ), '', ([],)), (('name3', ), '', ([('r', )],))])
1589
index.add_nodes([((b'name', ), b'data', ([],))])
1590
index.add_nodes([((b'name2', ), b'', ([],)), ((b'name3', ), b'', ([(b'r', )],))])
1590
1591
self.assertEqual({
1591
(index, ('name', ), 'data', ((),)),
1592
(index, ('name2', ), '', ((),)),
1593
(index, ('name3', ), '', ((('r', ), ), )),
1592
(index, (b'name', ), b'data', ((),)),
1593
(index, (b'name2', ), b'', ((),)),
1594
(index, (b'name3', ), b'', (((b'r', ), ), )),
1594
1595
}, set(index.iter_all_entries()))
1596
1597
def test_iter_all_entries_empty(self):
1598
1599
self.assertEqual([], list(index.iter_all_entries()))
1600
1601
def test_iter_all_entries_simple(self):
1601
index = self.make_index(nodes=[(('name', ), 'data')])
1602
self.assertEqual([(index, ('name', ), 'data')],
1602
index = self.make_index(nodes=[((b'name', ), b'data')])
1603
self.assertEqual([(index, (b'name', ), b'data')],
1603
1604
list(index.iter_all_entries()))
1605
1606
def test_iter_all_entries_references(self):
1606
1607
index = self.make_index(1, nodes=[
1607
(('name', ), 'data', ([('ref', )], )),
1608
(('ref', ), 'refdata', ([], ))])
1609
self.assertEqual({(index, ('name', ), 'data', ((('ref', ),),)),
1610
(index, ('ref', ), 'refdata', ((), ))},
1608
((b'name', ), b'data', ([(b'ref', )], )),
1609
((b'ref', ), b'refdata', ([], ))])
1610
self.assertEqual({(index, (b'name', ), b'data', (((b'ref', ),),)),
1611
(index, (b'ref', ), b'refdata', ((), ))},
1611
1612
set(index.iter_all_entries()))
1613
1614
def test_iteration_absent_skipped(self):
1614
1615
index = self.make_index(1, nodes=[
1615
(('name', ), 'data', ([('ref', )], ))])
1616
self.assertEqual({(index, ('name', ), 'data', ((('ref',),),))},
1616
((b'name', ), b'data', ([(b'ref', )], ))])
1617
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1617
1618
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', )])))
1619
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1620
set(index.iter_entries([(b'name', )])))
1621
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
1622
1623
def test_iter_all_keys(self):
1623
1624
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', )])))
1625
((b'name', ), b'data', ([(b'ref', )], )),
1626
((b'ref', ), b'refdata', ([], ))])
1627
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1628
(index, (b'ref', ), b'refdata', ((), ))},
1629
set(index.iter_entries([(b'name', ), (b'ref', )])))
1630
1631
def test_iter_key_prefix_1_key_element_no_refs(self):
1631
1632
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', )])))
1633
((b'name', ), b'data'),
1634
((b'ref', ), b'refdata')])
1635
self.assertEqual({(index, (b'name', ), b'data'),
1636
(index, (b'ref', ), b'refdata')},
1637
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1638
1639
def test_iter_key_prefix_1_key_element_refs(self):
1639
1640
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', )])))
1641
((b'name', ), b'data', ([(b'ref', )], )),
1642
((b'ref', ), b'refdata', ([], ))])
1643
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1644
(index, (b'ref', ), b'refdata', ((), ))},
1645
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1646
1647
def test_iter_key_prefix_2_key_element_no_refs(self):
1647
1648
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)])))
1649
((b'name', b'fin1'), b'data'),
1650
((b'name', b'fin2'), b'beta'),
1651
((b'ref', b'erence'), b'refdata')])
1652
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
1653
(index, (b'ref', b'erence'), b'refdata')},
1654
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1655
self.assertEqual({(index, (b'name', b'fin1'), b'data'),
1656
(index, (b'name', b'fin2'), b'beta')},
1657
set(index.iter_entries_prefix([(b'name', None)])))
1658
1659
def test_iter_key_prefix_2_key_element_refs(self):
1659
1660
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)])))
1661
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], )),
1662
((b'name', b'fin2'), b'beta', ([], )),
1663
((b'ref', b'erence'), b'refdata', ([], ))])
1664
self.assertEqual({(index, (b'name', b'fin1'), b'data', (((b'ref', b'erence'),),)),
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', (((b'ref', b'erence'),),)),
1668
(index, (b'name', b'fin2'), b'beta', ((), ))},
1669
set(index.iter_entries_prefix([(b'name', None)])))
1670
1671
def test_iter_nothing_empty(self):
1671
1672
index = self.make_index()
1708
1709
add_nodes_callback = None
1709
1710
adapter = _mod_index.GraphIndexPrefixAdapter(
1710
result, ('prefix', ), key_elements - 1,
1711
result, (b'prefix', ), key_elements - 1,
1711
1712
add_nodes_callback=add_nodes_callback)
1712
1713
return result, adapter
1714
1715
def test_add_node(self):
1715
1716
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'),),))},
1717
adapter.add_node((b'key',), b'value', (((b'ref',),),))
1718
self.assertEqual({(index, (b'prefix', b'key'), b'value',
1719
(((b'prefix', b'ref'),),))},
1719
1720
set(index.iter_all_entries()))
1721
1722
def test_add_nodes(self):
1722
1723
index, adapter = self.make_index(add_callback=True)
1723
1724
adapter.add_nodes((
1724
(('key',), 'value', ((('ref',),),)),
1725
(('key2',), 'value2', ((),)),
1725
((b'key',), b'value', (((b'ref',),),)),
1726
((b'key2',), b'value2', ((),)),
1727
1728
self.assertEqual({
1728
(index, ('prefix', 'key2'), 'value2', ((),)),
1729
(index, ('prefix', 'key'), 'value', ((('prefix', 'ref'),),))
1729
(index, (b'prefix', b'key2'), b'value2', ((),)),
1730
(index, (b'prefix', b'key'), b'value', (((b'prefix', b'ref'),),))
1731
1732
set(index.iter_all_entries()))
1733
1734
def test_construct(self):
1734
1735
idx = _mod_index.InMemoryGraphIndex()
1735
adapter = _mod_index.GraphIndexPrefixAdapter(idx, ('prefix', ), 1)
1736
adapter = _mod_index.GraphIndexPrefixAdapter(idx, (b'prefix', ), 1)
1737
1738
def test_construct_with_callback(self):
1738
1739
idx = _mod_index.InMemoryGraphIndex()
1739
adapter = _mod_index.GraphIndexPrefixAdapter(idx, ('prefix', ), 1,
1740
adapter = _mod_index.GraphIndexPrefixAdapter(idx, (b'prefix', ), 1,
1742
1743
def test_iter_all_entries_cross_prefix_map_errors(self):
1743
1744
index, adapter = self.make_index(nodes=[
1744
(('prefix', 'key1'), 'data1', ((('prefixaltered', 'key2'),),))])
1745
((b'prefix', b'key1'), b'data1', (((b'prefixaltered', b'key2'),),))])
1745
1746
self.assertRaises(_mod_index.BadIndexData, list, adapter.iter_all_entries())
1747
1748
def test_iter_all_entries(self):
1748
1749
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',),),))},
1750
((b'notprefix', b'key1'), b'data', ((), )),
1751
((b'prefix', b'key1'), b'data1', ((), )),
1752
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1753
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1754
(index, (b'key2', ), b'data2', (((b'key1',),),))},
1754
1755
set(adapter.iter_all_entries()))
1756
1757
def test_iter_entries(self):
1757
1758
index, adapter = self.make_index(nodes=[
1758
(('notprefix', 'key1'), 'data', ((), )),
1759
(('prefix', 'key1'), 'data1', ((), )),
1760
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1759
((b'notprefix', b'key1'), b'data', ((), )),
1760
((b'prefix', b'key1'), b'data1', ((), )),
1761
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1761
1762
# ask for many - get all
1762
self.assertEqual({(index, ('key1', ), 'data1', ((),)),
1763
(index, ('key2', ), 'data2', ((('key1', ),),))},
1764
set(adapter.iter_entries([('key1', ), ('key2', )])))
1763
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1764
(index, (b'key2', ), b'data2', (((b'key1', ),),))},
1765
set(adapter.iter_entries([(b'key1', ), (b'key2', )])))
1765
1766
# ask for one, get one
1766
self.assertEqual({(index, ('key1', ), 'data1', ((),))},
1767
set(adapter.iter_entries([('key1', )])))
1767
self.assertEqual({(index, (b'key1', ), b'data1', ((),))},
1768
set(adapter.iter_entries([(b'key1', )])))
1768
1769
# ask for missing, get none
1769
1770
self.assertEqual(set(),
1770
set(adapter.iter_entries([('key3', )])))
1771
set(adapter.iter_entries([(b'key3', )])))
1772
1773
def test_iter_entries_prefix(self):
1773
1774
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'),),))])
1775
((b'notprefix', b'foo', b'key1'), b'data', ((), )),
1776
((b'prefix', b'prefix2', b'key1'), b'data1', ((), )),
1777
((b'prefix', b'prefix2', b'key2'), b'data2', (((b'prefix', b'prefix2', b'key1'),),))])
1777
1778
# 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)])))
1779
self.assertEqual({(index, (b'prefix2', b'key1', ), b'data1', ((),)),
1780
(index, (b'prefix2', b'key2', ), b'data2', (((b'prefix2', b'key1', ),),))},
1781
set(adapter.iter_entries_prefix([(b'prefix2', None)])))
1782
1783
def test_key_count_no_matching_keys(self):
1783
1784
index, adapter = self.make_index(nodes=[
1784
(('notprefix', 'key1'), 'data', ((), ))])
1785
((b'notprefix', b'key1'), b'data', ((), ))])
1785
1786
self.assertEqual(0, adapter.key_count())
1787
1788
def test_key_count_some_keys(self):
1788
1789
index, adapter = self.make_index(nodes=[
1789
(('notprefix', 'key1'), 'data', ((), )),
1790
(('prefix', 'key1'), 'data1', ((), )),
1791
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
1790
((b'notprefix', b'key1'), b'data', ((), )),
1791
((b'prefix', b'key1'), b'data1', ((), )),
1792
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1792
1793
self.assertEqual(2, adapter.key_count())
1794
1795
def test_validate(self):