32
32
def test_bad_index_format_signature(self):
33
33
error = _mod_index.BadIndexFormatSignature("foo", "bar")
34
34
self.assertEqual("foo is not an index of type bar.",
37
37
def test_bad_index_data(self):
38
38
error = _mod_index.BadIndexData("foo")
39
39
self.assertEqual("Error in data for index foo.",
42
42
def test_bad_index_duplicate_key(self):
43
43
error = _mod_index.BadIndexDuplicateKey("foo", "bar")
44
44
self.assertEqual("The key 'foo' is already in index 'bar'.",
47
47
def test_bad_index_key(self):
48
48
error = _mod_index.BadIndexKey("foo")
49
49
self.assertEqual("The key 'foo' is not a valid key.",
52
52
def test_bad_index_options(self):
53
53
error = _mod_index.BadIndexOptions("foo")
54
54
self.assertEqual("Could not parse options for index foo.",
57
57
def test_bad_index_value(self):
58
58
error = _mod_index.BadIndexValue("foo")
59
59
self.assertEqual("The value 'foo' is not a valid value.",
63
63
class TestGraphIndexBuilder(tests.TestCaseWithMemoryTransport):
308
309
builder = _mod_index.GraphIndexBuilder()
309
310
for bad_char in bytearray(b'\t\n\x0b\x0c\r\x00 '):
310
311
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
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')
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')
316
317
# not enough length
317
318
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
320
321
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
321
(b'primary', b'secondary'), b'data')
322
(b'primary', b'secondary'), b'data')
322
323
# secondary key elements get checked too:
323
324
builder = _mod_index.GraphIndexBuilder(key_elements=2)
324
325
for bad_char in bytearray(b'\t\n\x0b\x0c\r\x00 '):
325
326
self.assertRaises(_mod_index.BadIndexKey, builder.add_node,
326
(b'prefix', b'a%skey' % int2byte(bad_char)), b'data')
327
(b'prefix', b'a%skey' % int2byte(bad_char)), b'data')
328
329
def test_add_node_bad_data(self):
329
330
builder = _mod_index.GraphIndexBuilder()
330
331
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
332
333
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
335
336
def test_add_node_bad_mismatched_ref_lists_length(self):
336
337
builder = _mod_index.GraphIndexBuilder()
337
338
self.assertRaises(_mod_index.BadIndexValue, builder.add_node, (b'akey', ),
339
340
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
340
341
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', ([], []))
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', ([], []))
346
347
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
347
348
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', ([], [], []))
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', ([], [], []))
354
355
def test_add_node_bad_key_in_reference_lists(self):
355
356
# first list, first key - trivial
356
357
builder = _mod_index.GraphIndexBuilder(reference_lists=1)
357
358
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
358
b'data aa', ([(b'a key', )], ))
359
b'data aa', ([(b'a key', )], ))
359
360
# references keys must be tuples too
360
361
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
361
b'data aa', (['not-a-tuple'], ))
362
b'data aa', (['not-a-tuple'], ))
362
363
# not enough length
363
364
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
364
b'data aa', ([()], ))
365
b'data aa', ([()], ))
366
367
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
367
b'data aa', ([(b'primary', b'secondary')], ))
368
b'data aa', ([(b'primary', b'secondary')], ))
368
369
# need to check more than the first key in the list
369
370
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
370
b'data aa', ([(b'agoodkey', ), (b'that is a bad key', )], ))
371
b'data aa', ([(b'agoodkey', ), (b'that is a bad key', )], ))
371
372
# and if there is more than one list it should be getting checked
373
374
builder = _mod_index.GraphIndexBuilder(reference_lists=2)
374
375
self.assertRaises(_mod_index.BadIndexKey, builder.add_node, (b'akey', ),
375
b'data aa', ([], ['a bad key']))
376
b'data aa', ([], ['a bad key']))
377
378
def test_add_duplicate_key(self):
378
379
builder = _mod_index.GraphIndexBuilder()
392
393
builder.add_node((b'reference', ), b'data', ([],))
394
395
def test_add_key_after_referencing_key_2_elements(self):
395
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
396
builder.add_node((b'k', b'ey'), b'data', ([(b'reference', b'tokey')], ))
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')], ))
397
400
builder.add_node((b'reference', b'tokey'), b'data', ([],))
399
402
def test_set_optimize(self):
400
builder = _mod_index.GraphIndexBuilder(reference_lists=1, key_elements=2)
403
builder = _mod_index.GraphIndexBuilder(
404
reference_lists=1, key_elements=2)
401
405
builder.set_optimize(for_size=True)
402
406
self.assertTrue(builder._optimize_for_size)
403
407
builder.set_optimize(for_size=False)
407
411
class TestGraphIndex(tests.TestCaseWithMemoryTransport):
409
413
def make_key(self, number):
410
return ((b'%d' % number) + b'X'*100,)
414
return ((b'%d' % number) + b'X' * 100,)
412
416
def make_value(self, number):
413
return (b'%d' % number) + b'Y'*100
417
return (b'%d' % number) + b'Y' * 100
415
419
def make_nodes(self, count=64):
416
420
# generate a big enough index that we only read some of it on a typical
417
421
# bisection lookup.
419
423
for counter in range(count):
420
nodes.append((self.make_key(counter), self.make_value(counter), ()))
425
(self.make_key(counter), self.make_value(counter), ()))
423
428
def make_index(self, ref_lists=0, key_elements=1, nodes=[]):
424
builder = _mod_index.GraphIndexBuilder(ref_lists, key_elements=key_elements)
429
builder = _mod_index.GraphIndexBuilder(
430
ref_lists, key_elements=key_elements)
425
431
for key, value, references in nodes:
426
432
builder.add_node(key, value, references)
427
433
stream = builder.finish()
762
769
def test_iter_all_entries_simple(self):
763
770
index = self.make_index(nodes=[((b'name', ), b'data', ())])
764
771
self.assertEqual([(index, (b'name', ), b'data')],
765
list(index.iter_all_entries()))
772
list(index.iter_all_entries()))
767
774
def test_iter_all_entries_simple_2_elements(self):
768
775
index = self.make_index(key_elements=2,
769
nodes=[((b'name', b'surname'), b'data', ())])
776
nodes=[((b'name', b'surname'), b'data', ())])
770
777
self.assertEqual([(index, (b'name', b'surname'), b'data')],
771
list(index.iter_all_entries()))
778
list(index.iter_all_entries()))
773
780
def test_iter_all_entries_references_resolved(self):
774
781
index = self.make_index(1, nodes=[
775
782
((b'name', ), b'data', ([(b'ref', )], )),
776
783
((b'ref', ), b'refdata', ([], ))])
777
784
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
778
(index, (b'ref', ), b'refdata', ((), ))},
779
set(index.iter_all_entries()))
785
(index, (b'ref', ), b'refdata', ((), ))},
786
set(index.iter_all_entries()))
781
788
def test_iter_entries_buffers_once(self):
782
789
index = self.make_index(nodes=self.make_nodes(2))
825
832
((b'name', ), b'data', ([(b'ref', ), (b'ref', )], )),
826
833
((b'ref', ), b'refdata', ([], ))])
827
834
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',)])))
835
(index, (b'ref', ), b'refdata', ((), ))},
836
set(index.iter_entries([(b'name',), (b'ref',)])))
831
838
def test_iter_entries_references_2_refs_resolved(self):
832
839
index = self.make_index(2, nodes=[
833
840
((b'name', ), b'data', ([(b'ref', )], [(b'ref', )])),
834
841
((b'ref', ), b'refdata', ([], []))])
835
842
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',)])))
843
(index, (b'ref', ), b'refdata', ((), ()))},
844
set(index.iter_entries([(b'name',), (b'ref',)])))
839
846
def test_iteration_absent_skipped(self):
840
847
index = self.make_index(1, nodes=[
841
848
((b'name', ), b'data', ([(b'ref', )], ))])
842
849
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
843
set(index.iter_all_entries()))
850
set(index.iter_all_entries()))
844
851
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
845
set(index.iter_entries([(b'name', )])))
852
set(index.iter_entries([(b'name', )])))
846
853
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
848
855
def test_iteration_absent_skipped_2_element_keys(self):
849
856
index = self.make_index(1, key_elements=2, nodes=[
850
857
((b'name', b'fin'), b'data', ([(b'ref', b'erence')], ))])
851
858
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
852
list(index.iter_all_entries()))
859
list(index.iter_all_entries()))
853
860
self.assertEqual([(index, (b'name', b'fin'), b'data', (((b'ref', b'erence'),),))],
854
list(index.iter_entries([(b'name', b'fin')])))
861
list(index.iter_entries([(b'name', b'fin')])))
855
862
self.assertEqual([], list(index.iter_entries([(b'ref', b'erence')])))
857
864
def test_iter_all_keys(self):
859
866
((b'name', ), b'data', ([(b'ref', )], )),
860
867
((b'ref', ), b'refdata', ([], ))])
861
868
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
862
(index, (b'ref', ), b'refdata', ((), ))},
863
set(index.iter_entries([(b'name', ), (b'ref', )])))
869
(index, (b'ref', ), b'refdata', ((), ))},
870
set(index.iter_entries([(b'name', ), (b'ref', )])))
865
872
def test_iter_nothing_empty(self):
866
873
index = self.make_index()
878
885
def test_iter_key_prefix_1_element_key_None(self):
879
886
index = self.make_index()
880
887
self.assertRaises(_mod_index.BadIndexKey, list,
881
index.iter_entries_prefix([(None, )]))
888
index.iter_entries_prefix([(None, )]))
883
890
def test_iter_key_prefix_wrong_length(self):
884
891
index = self.make_index()
885
892
self.assertRaises(_mod_index.BadIndexKey, list,
886
index.iter_entries_prefix([(b'foo', None)]))
893
index.iter_entries_prefix([(b'foo', None)]))
887
894
index = self.make_index(key_elements=2)
888
895
self.assertRaises(_mod_index.BadIndexKey, list,
889
index.iter_entries_prefix([(b'foo', )]))
896
index.iter_entries_prefix([(b'foo', )]))
890
897
self.assertRaises(_mod_index.BadIndexKey, list,
891
index.iter_entries_prefix([(b'foo', None, None)]))
898
index.iter_entries_prefix([(b'foo', None, None)]))
893
900
def test_iter_key_prefix_1_key_element_no_refs(self):
894
index = self.make_index( nodes=[
901
index = self.make_index(nodes=[
895
902
((b'name', ), b'data', ()),
896
903
((b'ref', ), b'refdata', ())])
897
904
self.assertEqual({(index, (b'name', ), b'data'),
898
(index, (b'ref', ), b'refdata')},
899
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
905
(index, (b'ref', ), b'refdata')},
906
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
901
908
def test_iter_key_prefix_1_key_element_refs(self):
902
909
index = self.make_index(1, nodes=[
903
910
((b'name', ), b'data', ([(b'ref', )], )),
904
911
((b'ref', ), b'refdata', ([], ))])
905
912
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', )])))
913
(index, (b'ref', ), b'refdata', ((), ))},
914
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
909
916
def test_iter_key_prefix_2_key_element_no_refs(self):
910
917
index = self.make_index(key_elements=2, nodes=[
912
919
((b'name', b'fin2'), b'beta', ()),
913
920
((b'ref', b'erence'), b'refdata', ())])
914
921
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')])))
922
(index, (b'ref', b'erence'), b'refdata')},
923
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
917
924
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)])))
925
(index, (b'name', b'fin2'), b'beta')},
926
set(index.iter_entries_prefix([(b'name', None)])))
921
928
def test_iter_key_prefix_2_key_element_refs(self):
922
929
index = self.make_index(1, key_elements=2, nodes=[
924
931
((b'name', b'fin2'), b'beta', ([], )),
925
932
((b'ref', b'erence'), b'refdata', ([], ))])
926
933
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')])))
934
(index, (b'ref', b'erence'), b'refdata', ((), ))},
935
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
929
936
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)])))
937
(index, (b'name', b'fin2'), b'beta', ((), ))},
938
set(index.iter_entries_prefix([(b'name', None)])))
933
940
def test_key_count_empty(self):
934
941
index = self.make_index()
1219
1229
def test_iter_key_prefix_2_key_element_refs(self):
1220
1230
idx1 = self.make_index('1', 1, key_elements=2, nodes=[
1221
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], ))])
1231
((b'name', b'fin1'), b'data', ([(b'ref', b'erence')], ))])
1222
1232
idx2 = self.make_index('2', 1, key_elements=2, nodes=[
1223
((b'name', b'fin2'), b'beta', ([], )),
1224
((b'ref', b'erence'), b'refdata', ([], ))])
1233
((b'name', b'fin2'), b'beta', ([], )),
1234
((b'ref', b'erence'), b'refdata', ([], ))])
1225
1235
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1226
1236
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1227
(((b'ref', b'erence'),),)),
1228
(idx2, (b'ref', b'erence'), b'refdata', ((), ))},
1237
(((b'ref', b'erence'),),)),
1238
(idx2, (b'ref', b'erence'), b'refdata', ((), ))},
1229
1239
set(idx.iter_entries_prefix([(b'name', b'fin1'),
1230
(b'ref', b'erence')])))
1240
(b'ref', b'erence')])))
1231
1241
self.assertEqual({(idx1, (b'name', b'fin1'), b'data',
1232
(((b'ref', b'erence'),),)),
1233
(idx2, (b'name', b'fin2'), b'beta', ((), ))},
1242
(((b'ref', b'erence'),),)),
1243
(idx2, (b'name', b'fin2'), b'beta', ((), ))},
1234
1244
set(idx.iter_entries_prefix([(b'name', None)])))
1236
1246
def test_iter_nothing_empty(self):
1245
1255
def test_iter_all_keys(self):
1246
1256
idx1 = self.make_index('1', 1, nodes=[((b'name', ), b'data',
1247
1257
([(b'ref', )], ))])
1248
idx2 = self.make_index('2', 1, nodes=[((b'ref', ), b'refdata', ((), ))])
1258
idx2 = self.make_index(
1259
'2', 1, nodes=[((b'ref', ), b'refdata', ((), ))])
1249
1260
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1250
1261
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref', ), ), )),
1251
(idx2, (b'ref', ), b'refdata', ((), ))},
1262
(idx2, (b'ref', ), b'refdata', ((), ))},
1252
1263
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1254
1265
def test_iter_all_keys_dup_entry(self):
1255
1266
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', ([], ))])
1268
((b'ref', ), b'refdata', ([], ))])
1269
idx2 = self.make_index(
1270
'2', 1, nodes=[((b'ref', ), b'refdata', ([], ))])
1259
1271
idx = _mod_index.CombinedGraphIndex([idx1, idx2])
1260
1272
self.assertEqual({(idx1, (b'name', ), b'data', (((b'ref',),),)),
1261
(idx1, (b'ref', ), b'refdata', ((), ))},
1273
(idx1, (b'ref', ), b'refdata', ((), ))},
1262
1274
set(idx.iter_entries([(b'name', ), (b'ref', )])))
1264
1276
def test_iter_missing_entry_empty(self):
1587
1599
def test_add_nodes(self):
1588
1600
index = self.make_index(1)
1589
1601
index.add_nodes([((b'name', ), b'data', ([],))])
1590
index.add_nodes([((b'name2', ), b'', ([],)), ((b'name3', ), b'', ([(b'r', )],))])
1602
index.add_nodes([((b'name2', ), b'', ([],)),
1603
((b'name3', ), b'', ([(b'r', )],))])
1591
1604
self.assertEqual({
1592
1605
(index, (b'name', ), b'data', ((),)),
1593
1606
(index, (b'name2', ), b'', ((),)),
1601
1614
def test_iter_all_entries_simple(self):
1602
1615
index = self.make_index(nodes=[((b'name', ), b'data')])
1603
1616
self.assertEqual([(index, (b'name', ), b'data')],
1604
list(index.iter_all_entries()))
1617
list(index.iter_all_entries()))
1606
1619
def test_iter_all_entries_references(self):
1607
1620
index = self.make_index(1, nodes=[
1608
1621
((b'name', ), b'data', ([(b'ref', )], )),
1609
1622
((b'ref', ), b'refdata', ([], ))])
1610
1623
self.assertEqual({(index, (b'name', ), b'data', (((b'ref', ),),)),
1611
(index, (b'ref', ), b'refdata', ((), ))},
1612
set(index.iter_all_entries()))
1624
(index, (b'ref', ), b'refdata', ((), ))},
1625
set(index.iter_all_entries()))
1614
1627
def test_iteration_absent_skipped(self):
1615
1628
index = self.make_index(1, nodes=[
1616
1629
((b'name', ), b'data', ([(b'ref', )], ))])
1617
1630
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1618
set(index.iter_all_entries()))
1631
set(index.iter_all_entries()))
1619
1632
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),))},
1620
set(index.iter_entries([(b'name', )])))
1633
set(index.iter_entries([(b'name', )])))
1621
1634
self.assertEqual([], list(index.iter_entries([(b'ref', )])))
1623
1636
def test_iter_all_keys(self):
1625
1638
((b'name', ), b'data', ([(b'ref', )], )),
1626
1639
((b'ref', ), b'refdata', ([], ))])
1627
1640
self.assertEqual({(index, (b'name', ), b'data', (((b'ref',),),)),
1628
(index, (b'ref', ), b'refdata', ((), ))},
1629
set(index.iter_entries([(b'name', ), (b'ref', )])))
1641
(index, (b'ref', ), b'refdata', ((), ))},
1642
set(index.iter_entries([(b'name', ), (b'ref', )])))
1631
1644
def test_iter_key_prefix_1_key_element_no_refs(self):
1632
index = self.make_index( nodes=[
1645
index = self.make_index(nodes=[
1633
1646
((b'name', ), b'data'),
1634
1647
((b'ref', ), b'refdata')])
1635
1648
self.assertEqual({(index, (b'name', ), b'data'),
1636
(index, (b'ref', ), b'refdata')},
1637
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1649
(index, (b'ref', ), b'refdata')},
1650
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1639
1652
def test_iter_key_prefix_1_key_element_refs(self):
1640
1653
index = self.make_index(1, nodes=[
1641
1654
((b'name', ), b'data', ([(b'ref', )], )),
1642
1655
((b'ref', ), b'refdata', ([], ))])
1643
1656
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', )])))
1657
(index, (b'ref', ), b'refdata', ((), ))},
1658
set(index.iter_entries_prefix([(b'name', ), (b'ref', )])))
1647
1660
def test_iter_key_prefix_2_key_element_no_refs(self):
1648
1661
index = self.make_index(key_elements=2, nodes=[
1650
1663
((b'name', b'fin2'), b'beta'),
1651
1664
((b'ref', b'erence'), b'refdata')])
1652
1665
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')])))
1666
(index, (b'ref', b'erence'), b'refdata')},
1667
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1655
1668
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)])))
1669
(index, (b'name', b'fin2'), b'beta')},
1670
set(index.iter_entries_prefix([(b'name', None)])))
1659
1672
def test_iter_key_prefix_2_key_element_refs(self):
1660
1673
index = self.make_index(1, key_elements=2, nodes=[
1662
1675
((b'name', b'fin2'), b'beta', ([], )),
1663
1676
((b'ref', b'erence'), b'refdata', ([], ))])
1664
1677
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')])))
1678
(index, (b'ref', b'erence'), b'refdata', ((), ))},
1679
set(index.iter_entries_prefix([(b'name', b'fin1'), (b'ref', b'erence')])))
1667
1680
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)])))
1681
(index, (b'name', b'fin2'), b'beta', ((), ))},
1682
set(index.iter_entries_prefix([(b'name', None)])))
1671
1684
def test_iter_nothing_empty(self):
1672
1685
index = self.make_index()
1751
1766
((b'prefix', b'key1'), b'data1', ((), )),
1752
1767
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1753
1768
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1754
(index, (b'key2', ), b'data2', (((b'key1',),),))},
1755
set(adapter.iter_all_entries()))
1769
(index, (b'key2', ), b'data2', (((b'key1',),),))},
1770
set(adapter.iter_all_entries()))
1757
1772
def test_iter_entries(self):
1758
1773
index, adapter = self.make_index(nodes=[
1761
1776
((b'prefix', b'key2'), b'data2', (((b'prefix', b'key1'),),))])
1762
1777
# ask for many - get all
1763
1778
self.assertEqual({(index, (b'key1', ), b'data1', ((),)),
1764
(index, (b'key2', ), b'data2', (((b'key1', ),),))},
1765
set(adapter.iter_entries([(b'key1', ), (b'key2', )])))
1779
(index, (b'key2', ), b'data2', (((b'key1', ),),))},
1780
set(adapter.iter_entries([(b'key1', ), (b'key2', )])))
1766
1781
# ask for one, get one
1767
1782
self.assertEqual({(index, (b'key1', ), b'data1', ((),))},
1768
set(adapter.iter_entries([(b'key1', )])))
1783
set(adapter.iter_entries([(b'key1', )])))
1769
1784
# ask for missing, get none
1770
1785
self.assertEqual(set(),
1771
set(adapter.iter_entries([(b'key3', )])))
1786
set(adapter.iter_entries([(b'key3', )])))
1773
1788
def test_iter_entries_prefix(self):
1774
1789
index, adapter = self.make_index(key_elements=3, nodes=[
1777
1792
((b'prefix', b'prefix2', b'key2'), b'data2', (((b'prefix', b'prefix2', b'key1'),),))])
1778
1793
# ask for a prefix, get the results for just that prefix, adjusted.
1779
1794
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)])))
1795
(index, (b'prefix2', b'key2', ), b'data2', (((b'prefix2', b'key1', ),),))},
1796
set(adapter.iter_entries_prefix([(b'prefix2', None)])))
1783
1798
def test_key_count_no_matching_keys(self):
1784
1799
index, adapter = self.make_index(nodes=[