27
27
builder = GraphIndexBuilder()
28
28
stream = builder.finish()
29
29
contents = stream.read()
30
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n\n", contents)
31
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=0\n\n",
32
34
def test_build_index_empty_two_element_keys(self):
33
35
builder = GraphIndexBuilder(key_elements=2)
34
36
stream = builder.finish()
35
37
contents = stream.read()
36
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\n\n", contents)
39
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=0\n\n",
38
42
def test_build_index_one_reference_list_empty(self):
39
43
builder = GraphIndexBuilder(reference_lists=1)
40
44
stream = builder.finish()
41
45
contents = stream.read()
42
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n\n", contents)
47
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=0\n\n",
44
50
def test_build_index_two_reference_list_empty(self):
45
51
builder = GraphIndexBuilder(reference_lists=2)
46
52
stream = builder.finish()
47
53
contents = stream.read()
48
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\n\n", contents)
55
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=0\n\n",
50
58
def test_build_index_one_node_no_refs(self):
51
59
builder = GraphIndexBuilder()
52
60
builder.add_node(('akey', ), 'data')
53
61
stream = builder.finish()
54
62
contents = stream.read()
55
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n"
64
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
56
65
"akey\x00\x00\x00data\n\n", contents)
58
67
def test_build_index_one_node_no_refs_accepts_empty_reflist(self):
60
69
builder.add_node(('akey', ), 'data', ())
61
70
stream = builder.finish()
62
71
contents = stream.read()
63
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n"
73
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
64
74
"akey\x00\x00\x00data\n\n", contents)
66
76
def test_build_index_one_node_2_element_keys(self):
71
81
builder.add_node(('akey', 'secondpart'), 'data')
72
82
stream = builder.finish()
73
83
contents = stream.read()
74
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\n"
85
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=1\n"
75
86
"akey\x00secondpart\x00\x00\x00data\n\n", contents)
77
88
def test_add_node_empty_value(self):
79
90
builder.add_node(('akey', ), '')
80
91
stream = builder.finish()
81
92
contents = stream.read()
82
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n"
94
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=1\n"
83
95
"akey\x00\x00\x00\n\n", contents)
85
97
def test_build_index_nodes_sorted(self):
93
105
builder.add_node(('2001', ), 'data')
94
106
stream = builder.finish()
95
107
contents = stream.read()
96
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\n"
109
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=1\nlen=3\n"
97
110
"2000\x00\x00\x00data\n"
98
111
"2001\x00\x00\x00data\n"
99
112
"2002\x00\x00\x00data\n"
116
129
builder.add_node(('2001', '2001'), 'data')
117
130
stream = builder.finish()
118
131
contents = stream.read()
119
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\n"
133
"Bazaar Graph Index 1\nnode_ref_lists=0\nkey_elements=2\nlen=9\n"
120
134
"2000\x002000\x00\x00\x00data\n"
121
135
"2000\x002001\x00\x00\x00data\n"
122
136
"2000\x002002\x00\x00\x00data\n"
133
147
builder.add_node(('key', ), 'data', ([], ))
134
148
stream = builder.finish()
135
149
contents = stream.read()
136
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n"
151
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
137
152
"key\x00\x00\x00data\n"
142
157
builder.add_node(('key', 'key2'), 'data', ([], ))
143
158
stream = builder.finish()
144
159
contents = stream.read()
145
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\n"
161
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=2\nlen=1\n"
146
162
"key\x00key2\x00\x00\x00data\n"
151
167
builder.add_node(('key', ), 'data', ([], []))
152
168
stream = builder.finish()
153
169
contents = stream.read()
154
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\n"
171
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
155
172
"key\x00\x00\t\x00data\n"
161
178
builder.add_node(('key', ), 'data', ([('reference', )], ))
162
179
stream = builder.finish()
163
180
contents = stream.read()
164
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n"
165
"key\x00\x0066\x00data\n"
182
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=2\n"
183
"key\x00\x0072\x00data\n"
166
184
"reference\x00\x00\x00data\n"
173
191
builder.add_node(('key', ), 'data', ([('reference', ), ('reference2', )], ))
174
192
stream = builder.finish()
175
193
contents = stream.read()
176
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n"
177
"key\x00\x00071\r088\x00data\n"
195
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=3\n"
196
"key\x00\x00077\r094\x00data\n"
178
197
"reference\x00\x00\x00data\n"
179
198
"reference2\x00\x00\x00data\n"
185
204
builder.add_node(('rey', ), 'data', ([('keference', )], [('keference', )]))
186
205
stream = builder.finish()
187
206
contents = stream.read()
188
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\n"
208
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=2\n"
189
209
"keference\x00\x00\t\x00data\n"
190
"rey\x00\x0053\t53\x00data\n"
210
"rey\x00\x0059\t59\x00data\n"
193
213
def test_add_node_referencing_missing_key_makes_absent(self):
195
215
builder.add_node(('rey', ), 'data', ([('beference', ), ('aeference2', )], ))
196
216
stream = builder.finish()
197
217
contents = stream.read()
198
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n"
219
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
199
220
"aeference2\x00a\x00\x00\n"
200
221
"beference\x00a\x00\x00\n"
201
"rey\x00\x0068\r53\x00data\n"
222
"rey\x00\x00074\r059\x00data\n"
204
225
def test_node_references_three_digits(self):
208
229
builder.add_node(('2-key', ), '', (references, ))
209
230
stream = builder.finish()
210
231
contents = stream.read()
211
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\n"
233
"Bazaar Graph Index 1\nnode_ref_lists=1\nkey_elements=1\nlen=1\n"
212
234
"0\x00a\x00\x00\n"
213
235
"1\x00a\x00\x00\n"
214
236
"2\x00a\x00\x00\n"
215
"2-key\x00\x00145\r139\r133\r127\r121\r115\r065\r059\r053\x00\n"
237
"2-key\x00\x00151\r145\r139\r133\r127\r121\r071\r065\r059\x00\n"
216
238
"3\x00a\x00\x00\n"
217
239
"4\x00a\x00\x00\n"
218
240
"5\x00a\x00\x00\n"
228
250
builder.add_node(('parent', ), '', ([('aail', ), ('zther', )], []))
229
251
stream = builder.finish()
230
252
contents = stream.read()
231
self.assertEqual("Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\n"
254
"Bazaar Graph Index 1\nnode_ref_lists=2\nkey_elements=1\nlen=1\n"
232
255
"aail\x00a\x00\x00\n"
233
"parent\x00\x0053\r78\t\x00\n"
256
"parent\x00\x0059\r84\t\x00\n"
234
257
"zther\x00a\x00\x00\n"
332
355
def make_index(self, ref_lists=0, key_elements=1, nodes=[]):
333
356
builder = GraphIndexBuilder(ref_lists, key_elements=key_elements)
334
for node, value, references in nodes:
335
builder.add_node(node, value, references)
357
for key, value, references in nodes:
358
builder.add_node(key, value, references)
336
359
stream = builder.finish()
337
360
trans = self.get_transport()
338
361
trans.put_file('index', stream)
455
478
(index, ('name', 'fin2'), 'beta', ((), ))]),
456
479
set(index.iter_entries_prefix([('name', None)])))
481
def test_key_count_empty(self):
482
index = self.make_index()
483
self.assertEqual(0, index.key_count())
485
def test_key_count_one(self):
486
index = self.make_index(nodes=[(('name', ), '', ())])
487
self.assertEqual(1, index.key_count())
489
def test_key_count_two(self):
490
index = self.make_index(nodes=[
491
(('name', ), '', ()), (('foo', ), '', ())])
492
self.assertEqual(2, index.key_count())
458
494
def test_validate_bad_index_errors(self):
459
495
trans = self.get_transport()
460
496
trans.put_bytes('name', "not an index\n")
500
536
def make_index(self, name, ref_lists=0, key_elements=1, nodes=[]):
501
537
builder = GraphIndexBuilder(ref_lists, key_elements=key_elements)
502
for node, value, references in nodes:
503
builder.add_node(node, value, references)
538
for key, value, references in nodes:
539
builder.add_node(key, value, references)
504
540
stream = builder.finish()
505
541
trans = self.get_transport()
506
542
trans.put_file(name, stream)
624
660
self.assertEqual([(index1, ('key', ), '')],
625
661
list(index.iter_entries([('key', )])))
663
def test_key_count_empty(self):
664
index1 = self.make_index('1', nodes=[])
665
index2 = self.make_index('2', nodes=[])
666
index = CombinedGraphIndex([index1, index2])
667
self.assertEqual(0, index.key_count())
669
def test_key_count_sums_index_keys(self):
670
index1 = self.make_index('1', nodes=[
673
index2 = self.make_index('2', nodes=[(('1',), '', ())])
674
index = CombinedGraphIndex([index1, index2])
675
self.assertEqual(3, index.key_count())
627
677
def test_validate_bad_child_index_errors(self):
628
678
trans = self.get_transport()
629
679
trans.put_bytes('name', "not an index\n")
745
795
index = self.make_index()
746
796
self.assertEqual([], list(index.iter_entries(['a'])))
798
def test_key_count_empty(self):
799
index = self.make_index()
800
self.assertEqual(0, index.key_count())
802
def test_key_count_one(self):
803
index = self.make_index(nodes=[(('name', ), '')])
804
self.assertEqual(1, index.key_count())
806
def test_key_count_two(self):
807
index = self.make_index(nodes=[(('name', ), ''), (('foo', ), '')])
808
self.assertEqual(2, index.key_count())
748
810
def test_validate_empty(self):
749
811
index = self.make_index()
760
822
result = InMemoryGraphIndex(ref_lists, key_elements=key_elements)
761
823
result.add_nodes(nodes)
763
add_nodes_callback=result.add_nodes
825
add_nodes_callback = result.add_nodes
765
add_nodes_callback=None
827
add_nodes_callback = None
766
828
adapter = GraphIndexPrefixAdapter(result, ('prefix', ), key_elements - 1,
767
829
add_nodes_callback=add_nodes_callback)
768
830
return result, adapter
833
895
(index, ('prefix2', 'key2', ), 'data2', ((('prefix2', 'key1', ),),))]),
834
896
set(adapter.iter_entries_prefix([('prefix2', None)])))
898
def test_key_count_no_matching_keys(self):
899
index, adapter = self.make_index(nodes=[
900
(('notprefix', 'key1'), 'data', ((), ))])
901
self.assertEqual(0, adapter.key_count())
903
def test_key_count_some_keys(self):
904
index, adapter = self.make_index(nodes=[
905
(('notprefix', 'key1'), 'data', ((), )),
906
(('prefix', 'key1'), 'data1', ((), )),
907
(('prefix', 'key2'), 'data2', ((('prefix', 'key1'),),))])
908
self.assertEqual(2, adapter.key_count())
836
910
def test_validate(self):
837
911
index, adapter = self.make_index()