90
87
    def test_children_ancestry1(self):
 
91
88
        graph = self.make_known_graph(test_graph.ancestry_1)
 
92
 
        self.assertEqual(['rev1'], graph.get_child_keys(NULL_REVISION))
 
93
 
        self.assertEqual(['rev2a', 'rev2b'],
 
94
 
                         sorted(graph.get_child_keys('rev1')))
 
95
 
        self.assertEqual(['rev3'], graph.get_child_keys('rev2a'))
 
96
 
        self.assertEqual(['rev4'], graph.get_child_keys('rev3'))
 
97
 
        self.assertEqual(['rev4'], graph.get_child_keys('rev2b'))
 
98
 
        self.assertRaises(KeyError, graph.get_child_keys, 'not_in_graph')
 
 
89
        self.assertEqual([b'rev1'], graph.get_child_keys(NULL_REVISION))
 
 
90
        self.assertEqual([b'rev2a', b'rev2b'],
 
 
91
                         sorted(graph.get_child_keys(b'rev1')))
 
 
92
        self.assertEqual([b'rev3'], graph.get_child_keys(b'rev2a'))
 
 
93
        self.assertEqual([b'rev4'], graph.get_child_keys(b'rev3'))
 
 
94
        self.assertEqual([b'rev4'], graph.get_child_keys(b'rev2b'))
 
 
95
        self.assertRaises(KeyError, graph.get_child_keys, b'not_in_graph')
 
100
97
    def test_parent_ancestry1(self):
 
101
98
        graph = self.make_known_graph(test_graph.ancestry_1)
 
102
 
        self.assertEqual([NULL_REVISION], graph.get_parent_keys('rev1'))
 
103
 
        self.assertEqual(['rev1'], graph.get_parent_keys('rev2a'))
 
104
 
        self.assertEqual(['rev1'], graph.get_parent_keys('rev2b'))
 
105
 
        self.assertEqual(['rev2a'], graph.get_parent_keys('rev3'))
 
106
 
        self.assertEqual(['rev2b', 'rev3'],
 
107
 
                         sorted(graph.get_parent_keys('rev4')))
 
108
 
        self.assertRaises(KeyError, graph.get_child_keys, 'not_in_graph')
 
 
99
        self.assertEqual([NULL_REVISION], graph.get_parent_keys(b'rev1'))
 
 
100
        self.assertEqual([b'rev1'], graph.get_parent_keys(b'rev2a'))
 
 
101
        self.assertEqual([b'rev1'], graph.get_parent_keys(b'rev2b'))
 
 
102
        self.assertEqual([b'rev2a'], graph.get_parent_keys(b'rev3'))
 
 
103
        self.assertEqual([b'rev2b', b'rev3'],
 
 
104
                         sorted(graph.get_parent_keys(b'rev4')))
 
 
105
        self.assertRaises(KeyError, graph.get_child_keys, b'not_in_graph')
 
110
107
    def test_parent_with_ghost(self):
 
111
108
        graph = self.make_known_graph(test_graph.with_ghost)
 
112
 
        self.assertEqual(None, graph.get_parent_keys('g'))
 
 
109
        self.assertEqual(None, graph.get_parent_keys(b'g'))
 
114
111
    def test_gdfo_ancestry_1(self):
 
115
112
        graph = self.make_known_graph(test_graph.ancestry_1)
 
116
 
        self.assertGDFO(graph, 'rev1', 2)
 
117
 
        self.assertGDFO(graph, 'rev2b', 3)
 
118
 
        self.assertGDFO(graph, 'rev2a', 3)
 
119
 
        self.assertGDFO(graph, 'rev3', 4)
 
120
 
        self.assertGDFO(graph, 'rev4', 5)
 
 
113
        self.assertGDFO(graph, b'rev1', 2)
 
 
114
        self.assertGDFO(graph, b'rev2b', 3)
 
 
115
        self.assertGDFO(graph, b'rev2a', 3)
 
 
116
        self.assertGDFO(graph, b'rev3', 4)
 
 
117
        self.assertGDFO(graph, b'rev4', 5)
 
122
119
    def test_gdfo_feature_branch(self):
 
123
120
        graph = self.make_known_graph(test_graph.feature_branch)
 
124
 
        self.assertGDFO(graph, 'rev1', 2)
 
125
 
        self.assertGDFO(graph, 'rev2b', 3)
 
126
 
        self.assertGDFO(graph, 'rev3b', 4)
 
 
121
        self.assertGDFO(graph, b'rev1', 2)
 
 
122
        self.assertGDFO(graph, b'rev2b', 3)
 
 
123
        self.assertGDFO(graph, b'rev3b', 4)
 
128
125
    def test_gdfo_extended_history_shortcut(self):
 
129
126
        graph = self.make_known_graph(test_graph.extended_history_shortcut)
 
130
 
        self.assertGDFO(graph, 'a', 2)
 
131
 
        self.assertGDFO(graph, 'b', 3)
 
132
 
        self.assertGDFO(graph, 'c', 4)
 
133
 
        self.assertGDFO(graph, 'd', 5)
 
134
 
        self.assertGDFO(graph, 'e', 6)
 
135
 
        self.assertGDFO(graph, 'f', 6)
 
 
127
        self.assertGDFO(graph, b'a', 2)
 
 
128
        self.assertGDFO(graph, b'b', 3)
 
 
129
        self.assertGDFO(graph, b'c', 4)
 
 
130
        self.assertGDFO(graph, b'd', 5)
 
 
131
        self.assertGDFO(graph, b'e', 6)
 
 
132
        self.assertGDFO(graph, b'f', 6)
 
137
134
    def test_gdfo_with_ghost(self):
 
138
135
        graph = self.make_known_graph(test_graph.with_ghost)
 
139
 
        self.assertGDFO(graph, 'f', 2)
 
140
 
        self.assertGDFO(graph, 'e', 3)
 
141
 
        self.assertGDFO(graph, 'g', 1)
 
142
 
        self.assertGDFO(graph, 'b', 4)
 
143
 
        self.assertGDFO(graph, 'd', 4)
 
144
 
        self.assertGDFO(graph, 'a', 5)
 
145
 
        self.assertGDFO(graph, 'c', 5)
 
 
136
        self.assertGDFO(graph, b'f', 2)
 
 
137
        self.assertGDFO(graph, b'e', 3)
 
 
138
        self.assertGDFO(graph, b'g', 1)
 
 
139
        self.assertGDFO(graph, b'b', 4)
 
 
140
        self.assertGDFO(graph, b'd', 4)
 
 
141
        self.assertGDFO(graph, b'a', 5)
 
 
142
        self.assertGDFO(graph, b'c', 5)
 
147
144
    def test_add_existing_node(self):
 
148
145
        graph = self.make_known_graph(test_graph.ancestry_1)
 
149
146
        # Add a node that already exists with identical content
 
150
147
        # This is a 'no-op'
 
151
 
        self.assertGDFO(graph, 'rev4', 5)
 
152
 
        graph.add_node('rev4', ['rev3', 'rev2b'])
 
153
 
        self.assertGDFO(graph, 'rev4', 5)
 
 
148
        self.assertGDFO(graph, b'rev4', 5)
 
 
149
        graph.add_node(b'rev4', [b'rev3', b'rev2b'])
 
 
150
        self.assertGDFO(graph, b'rev4', 5)
 
154
151
        # This also works if we use a tuple rather than a list
 
155
 
        graph.add_node('rev4', ('rev3', 'rev2b'))
 
 
152
        graph.add_node(b'rev4', (b'rev3', b'rev2b'))
 
157
154
    def test_add_existing_node_mismatched_parents(self):
 
158
155
        graph = self.make_known_graph(test_graph.ancestry_1)
 
159
 
        self.assertRaises(ValueError, graph.add_node, 'rev4',
 
 
156
        self.assertRaises(ValueError, graph.add_node, b'rev4',
 
162
159
    def test_add_node_with_ghost_parent(self):
 
163
160
        graph = self.make_known_graph(test_graph.ancestry_1)
 
164
 
        graph.add_node('rev5', ['rev2b', 'revGhost'])
 
165
 
        self.assertGDFO(graph, 'rev5', 4)
 
166
 
        self.assertGDFO(graph, 'revGhost', 1)
 
 
161
        graph.add_node(b'rev5', [b'rev2b', b'revGhost'])
 
 
162
        self.assertGDFO(graph, b'rev5', 4)
 
 
163
        self.assertGDFO(graph, b'revGhost', 1)
 
168
165
    def test_add_new_root(self):
 
169
166
        graph = self.make_known_graph(test_graph.ancestry_1)
 
170
 
        graph.add_node('rev5', [])
 
171
 
        self.assertGDFO(graph, 'rev5', 1)
 
 
167
        graph.add_node(b'rev5', [])
 
 
168
        self.assertGDFO(graph, b'rev5', 1)
 
173
170
    def test_add_with_all_ghost_parents(self):
 
174
171
        graph = self.make_known_graph(test_graph.ancestry_1)
 
175
 
        graph.add_node('rev5', ['ghost'])
 
176
 
        self.assertGDFO(graph, 'rev5', 2)
 
177
 
        self.assertGDFO(graph, 'ghost', 1)
 
 
172
        graph.add_node(b'rev5', [b'ghost'])
 
 
173
        self.assertGDFO(graph, b'rev5', 2)
 
 
174
        self.assertGDFO(graph, b'ghost', 1)
 
179
176
    def test_gdfo_after_add_node(self):
 
180
177
        graph = self.make_known_graph(test_graph.ancestry_1)
 
181
 
        self.assertEqual([], graph.get_child_keys('rev4'))
 
182
 
        graph.add_node('rev5', ['rev4'])
 
183
 
        self.assertEqual(['rev4'], graph.get_parent_keys('rev5'))
 
184
 
        self.assertEqual(['rev5'], graph.get_child_keys('rev4'))
 
185
 
        self.assertEqual([], graph.get_child_keys('rev5'))
 
186
 
        self.assertGDFO(graph, 'rev5', 6)
 
187
 
        graph.add_node('rev6', ['rev2b'])
 
188
 
        graph.add_node('rev7', ['rev6'])
 
189
 
        graph.add_node('rev8', ['rev7', 'rev5'])
 
190
 
        self.assertGDFO(graph, 'rev5', 6)
 
191
 
        self.assertGDFO(graph, 'rev6', 4)
 
192
 
        self.assertGDFO(graph, 'rev7', 5)
 
193
 
        self.assertGDFO(graph, 'rev8', 7)
 
 
178
        self.assertEqual([], graph.get_child_keys(b'rev4'))
 
 
179
        graph.add_node(b'rev5', [b'rev4'])
 
 
180
        self.assertEqual([b'rev4'], graph.get_parent_keys(b'rev5'))
 
 
181
        self.assertEqual([b'rev5'], graph.get_child_keys(b'rev4'))
 
 
182
        self.assertEqual([], graph.get_child_keys(b'rev5'))
 
 
183
        self.assertGDFO(graph, b'rev5', 6)
 
 
184
        graph.add_node(b'rev6', [b'rev2b'])
 
 
185
        graph.add_node(b'rev7', [b'rev6'])
 
 
186
        graph.add_node(b'rev8', [b'rev7', b'rev5'])
 
 
187
        self.assertGDFO(graph, b'rev5', 6)
 
 
188
        self.assertGDFO(graph, b'rev6', 4)
 
 
189
        self.assertGDFO(graph, b'rev7', 5)
 
 
190
        self.assertGDFO(graph, b'rev8', 7)
 
195
192
    def test_fill_in_ghost(self):
 
196
193
        graph = self.make_known_graph(test_graph.with_ghost)
 
197
194
        # Add in a couple nodes and then fill in the 'ghost' so that it should
 
198
195
        # cause renumbering of children nodes
 
199
 
        graph.add_node('x', [])
 
200
 
        graph.add_node('y', ['x'])
 
201
 
        graph.add_node('z', ['y'])
 
202
 
        graph.add_node('g', ['z'])
 
203
 
        self.assertGDFO(graph, 'f', 2)
 
204
 
        self.assertGDFO(graph, 'e', 3)
 
205
 
        self.assertGDFO(graph, 'x', 1)
 
206
 
        self.assertGDFO(graph, 'y', 2)
 
207
 
        self.assertGDFO(graph, 'z', 3)
 
208
 
        self.assertGDFO(graph, 'g', 4)
 
209
 
        self.assertGDFO(graph, 'b', 4)
 
210
 
        self.assertGDFO(graph, 'd', 5)
 
211
 
        self.assertGDFO(graph, 'a', 5)
 
212
 
        self.assertGDFO(graph, 'c', 6)
 
 
196
        graph.add_node(b'x', [])
 
 
197
        graph.add_node(b'y', [b'x'])
 
 
198
        graph.add_node(b'z', [b'y'])
 
 
199
        graph.add_node(b'g', [b'z'])
 
 
200
        self.assertGDFO(graph, b'f', 2)
 
 
201
        self.assertGDFO(graph, b'e', 3)
 
 
202
        self.assertGDFO(graph, b'x', 1)
 
 
203
        self.assertGDFO(graph, b'y', 2)
 
 
204
        self.assertGDFO(graph, b'z', 3)
 
 
205
        self.assertGDFO(graph, b'g', 4)
 
 
206
        self.assertGDFO(graph, b'b', 4)
 
 
207
        self.assertGDFO(graph, b'd', 5)
 
 
208
        self.assertGDFO(graph, b'a', 5)
 
 
209
        self.assertGDFO(graph, b'c', 6)
 
215
212
class TestKnownGraphHeads(TestCaseWithKnownGraph):
 
 
214
    scenarios = caching_scenarios() + non_caching_scenarios()
 
217
215
    do_cache = None # Set by load_tests
 
219
217
    def test_heads_null(self):
 
220
218
        graph = self.make_known_graph(test_graph.ancestry_1)
 
221
 
        self.assertEqual(set(['null:']), graph.heads(['null:']))
 
222
 
        self.assertEqual(set(['rev1']), graph.heads(['null:', 'rev1']))
 
223
 
        self.assertEqual(set(['rev1']), graph.heads(['rev1', 'null:']))
 
224
 
        self.assertEqual(set(['rev1']), graph.heads(set(['rev1', 'null:'])))
 
225
 
        self.assertEqual(set(['rev1']), graph.heads(('rev1', 'null:')))
 
 
219
        self.assertEqual({b'null:'}, graph.heads([b'null:']))
 
 
220
        self.assertEqual({b'rev1'}, graph.heads([b'null:', b'rev1']))
 
 
221
        self.assertEqual({b'rev1'}, graph.heads([b'rev1', b'null:']))
 
 
222
        self.assertEqual({b'rev1'}, graph.heads({b'rev1', b'null:'}))
 
 
223
        self.assertEqual({b'rev1'}, graph.heads((b'rev1', b'null:')))
 
227
225
    def test_heads_one(self):
 
228
226
        # A single node will always be a head
 
229
227
        graph = self.make_known_graph(test_graph.ancestry_1)
 
230
 
        self.assertEqual(set(['null:']), graph.heads(['null:']))
 
231
 
        self.assertEqual(set(['rev1']), graph.heads(['rev1']))
 
232
 
        self.assertEqual(set(['rev2a']), graph.heads(['rev2a']))
 
233
 
        self.assertEqual(set(['rev2b']), graph.heads(['rev2b']))
 
234
 
        self.assertEqual(set(['rev3']), graph.heads(['rev3']))
 
235
 
        self.assertEqual(set(['rev4']), graph.heads(['rev4']))
 
 
228
        self.assertEqual({b'null:'}, graph.heads([b'null:']))
 
 
229
        self.assertEqual({b'rev1'}, graph.heads([b'rev1']))
 
 
230
        self.assertEqual({b'rev2a'}, graph.heads([b'rev2a']))
 
 
231
        self.assertEqual({b'rev2b'}, graph.heads([b'rev2b']))
 
 
232
        self.assertEqual({b'rev3'}, graph.heads([b'rev3']))
 
 
233
        self.assertEqual({b'rev4'}, graph.heads([b'rev4']))
 
237
235
    def test_heads_single(self):
 
238
236
        graph = self.make_known_graph(test_graph.ancestry_1)
 
239
 
        self.assertEqual(set(['rev4']), graph.heads(['null:', 'rev4']))
 
240
 
        self.assertEqual(set(['rev2a']), graph.heads(['rev1', 'rev2a']))
 
241
 
        self.assertEqual(set(['rev2b']), graph.heads(['rev1', 'rev2b']))
 
242
 
        self.assertEqual(set(['rev3']), graph.heads(['rev1', 'rev3']))
 
243
 
        self.assertEqual(set(['rev3']), graph.heads(['rev3', 'rev2a']))
 
244
 
        self.assertEqual(set(['rev4']), graph.heads(['rev1', 'rev4']))
 
245
 
        self.assertEqual(set(['rev4']), graph.heads(['rev2a', 'rev4']))
 
246
 
        self.assertEqual(set(['rev4']), graph.heads(['rev2b', 'rev4']))
 
247
 
        self.assertEqual(set(['rev4']), graph.heads(['rev3', 'rev4']))
 
 
237
        self.assertEqual({b'rev4'}, graph.heads([b'null:', b'rev4']))
 
 
238
        self.assertEqual({b'rev2a'}, graph.heads([b'rev1', b'rev2a']))
 
 
239
        self.assertEqual({b'rev2b'}, graph.heads([b'rev1', b'rev2b']))
 
 
240
        self.assertEqual({b'rev3'}, graph.heads([b'rev1', b'rev3']))
 
 
241
        self.assertEqual({b'rev3'}, graph.heads([b'rev3', b'rev2a']))
 
 
242
        self.assertEqual({b'rev4'}, graph.heads([b'rev1', b'rev4']))
 
 
243
        self.assertEqual({b'rev4'}, graph.heads([b'rev2a', b'rev4']))
 
 
244
        self.assertEqual({b'rev4'}, graph.heads([b'rev2b', b'rev4']))
 
 
245
        self.assertEqual({b'rev4'}, graph.heads([b'rev3', b'rev4']))
 
249
247
    def test_heads_two_heads(self):
 
250
248
        graph = self.make_known_graph(test_graph.ancestry_1)
 
251
 
        self.assertEqual(set(['rev2a', 'rev2b']),
 
252
 
                         graph.heads(['rev2a', 'rev2b']))
 
253
 
        self.assertEqual(set(['rev3', 'rev2b']),
 
254
 
                         graph.heads(['rev3', 'rev2b']))
 
 
249
        self.assertEqual({b'rev2a', b'rev2b'},
 
 
250
                         graph.heads([b'rev2a', b'rev2b']))
 
 
251
        self.assertEqual({b'rev3', b'rev2b'},
 
 
252
                         graph.heads([b'rev3', b'rev2b']))
 
256
254
    def test_heads_criss_cross(self):
 
257
255
        graph = self.make_known_graph(test_graph.criss_cross)
 
258
 
        self.assertEqual(set(['rev2a']),
 
259
 
                         graph.heads(['rev2a', 'rev1']))
 
260
 
        self.assertEqual(set(['rev2b']),
 
261
 
                         graph.heads(['rev2b', 'rev1']))
 
262
 
        self.assertEqual(set(['rev3a']),
 
263
 
                         graph.heads(['rev3a', 'rev1']))
 
264
 
        self.assertEqual(set(['rev3b']),
 
265
 
                         graph.heads(['rev3b', 'rev1']))
 
266
 
        self.assertEqual(set(['rev2a', 'rev2b']),
 
267
 
                         graph.heads(['rev2a', 'rev2b']))
 
268
 
        self.assertEqual(set(['rev3a']),
 
269
 
                         graph.heads(['rev3a', 'rev2a']))
 
270
 
        self.assertEqual(set(['rev3a']),
 
271
 
                         graph.heads(['rev3a', 'rev2b']))
 
272
 
        self.assertEqual(set(['rev3a']),
 
273
 
                         graph.heads(['rev3a', 'rev2a', 'rev2b']))
 
274
 
        self.assertEqual(set(['rev3b']),
 
275
 
                         graph.heads(['rev3b', 'rev2a']))
 
276
 
        self.assertEqual(set(['rev3b']),
 
277
 
                         graph.heads(['rev3b', 'rev2b']))
 
278
 
        self.assertEqual(set(['rev3b']),
 
279
 
                         graph.heads(['rev3b', 'rev2a', 'rev2b']))
 
280
 
        self.assertEqual(set(['rev3a', 'rev3b']),
 
281
 
                         graph.heads(['rev3a', 'rev3b']))
 
282
 
        self.assertEqual(set(['rev3a', 'rev3b']),
 
283
 
                         graph.heads(['rev3a', 'rev3b', 'rev2a', 'rev2b']))
 
 
256
        self.assertEqual({b'rev2a'},
 
 
257
                         graph.heads([b'rev2a', b'rev1']))
 
 
258
        self.assertEqual({b'rev2b'},
 
 
259
                         graph.heads([b'rev2b', b'rev1']))
 
 
260
        self.assertEqual({b'rev3a'},
 
 
261
                         graph.heads([b'rev3a', b'rev1']))
 
 
262
        self.assertEqual({b'rev3b'},
 
 
263
                         graph.heads([b'rev3b', b'rev1']))
 
 
264
        self.assertEqual({b'rev2a', b'rev2b'},
 
 
265
                         graph.heads([b'rev2a', b'rev2b']))
 
 
266
        self.assertEqual({b'rev3a'},
 
 
267
                         graph.heads([b'rev3a', b'rev2a']))
 
 
268
        self.assertEqual({b'rev3a'},
 
 
269
                         graph.heads([b'rev3a', b'rev2b']))
 
 
270
        self.assertEqual({b'rev3a'},
 
 
271
                         graph.heads([b'rev3a', b'rev2a', b'rev2b']))
 
 
272
        self.assertEqual({b'rev3b'},
 
 
273
                         graph.heads([b'rev3b', b'rev2a']))
 
 
274
        self.assertEqual({b'rev3b'},
 
 
275
                         graph.heads([b'rev3b', b'rev2b']))
 
 
276
        self.assertEqual({b'rev3b'},
 
 
277
                         graph.heads([b'rev3b', b'rev2a', b'rev2b']))
 
 
278
        self.assertEqual({b'rev3a', b'rev3b'},
 
 
279
                         graph.heads([b'rev3a', b'rev3b']))
 
 
280
        self.assertEqual({b'rev3a', b'rev3b'},
 
 
281
                         graph.heads([b'rev3a', b'rev3b', b'rev2a', b'rev2b']))
 
285
283
    def test_heads_shortcut(self):
 
286
284
        graph = self.make_known_graph(test_graph.history_shortcut)
 
287
 
        self.assertEqual(set(['rev2a', 'rev2b', 'rev2c']),
 
288
 
                         graph.heads(['rev2a', 'rev2b', 'rev2c']))
 
289
 
        self.assertEqual(set(['rev3a', 'rev3b']),
 
290
 
                         graph.heads(['rev3a', 'rev3b']))
 
291
 
        self.assertEqual(set(['rev3a', 'rev3b']),
 
292
 
                         graph.heads(['rev2a', 'rev3a', 'rev3b']))
 
293
 
        self.assertEqual(set(['rev2a', 'rev3b']),
 
294
 
                         graph.heads(['rev2a', 'rev3b']))
 
295
 
        self.assertEqual(set(['rev2c', 'rev3a']),
 
296
 
                         graph.heads(['rev2c', 'rev3a']))
 
 
285
        self.assertEqual({b'rev2a', b'rev2b', b'rev2c'},
 
 
286
                         graph.heads([b'rev2a', b'rev2b', b'rev2c']))
 
 
287
        self.assertEqual({b'rev3a', b'rev3b'},
 
 
288
                         graph.heads([b'rev3a', b'rev3b']))
 
 
289
        self.assertEqual({b'rev3a', b'rev3b'},
 
 
290
                         graph.heads([b'rev2a', b'rev3a', b'rev3b']))
 
 
291
        self.assertEqual({b'rev2a', b'rev3b'},
 
 
292
                         graph.heads([b'rev2a', b'rev3b']))
 
 
293
        self.assertEqual({b'rev2c', b'rev3a'},
 
 
294
                         graph.heads([b'rev2c', b'rev3a']))
 
298
296
    def test_heads_linear(self):
 
299
297
        graph = self.make_known_graph(test_graph.racing_shortcuts)
 
300
 
        self.assertEqual(set(['w']), graph.heads(['w', 's']))
 
301
 
        self.assertEqual(set(['z']), graph.heads(['w', 's', 'z']))
 
302
 
        self.assertEqual(set(['w', 'q']), graph.heads(['w', 's', 'q']))
 
303
 
        self.assertEqual(set(['z']), graph.heads(['s', 'z']))
 
 
298
        self.assertEqual({b'w'}, graph.heads([b'w', b's']))
 
 
299
        self.assertEqual({b'z'}, graph.heads([b'w', b's', b'z']))
 
 
300
        self.assertEqual({b'w', b'q'}, graph.heads([b'w', b's', b'q']))
 
 
301
        self.assertEqual({b'z'}, graph.heads([b's', b'z']))
 
305
303
    def test_heads_alt_merge(self):
 
306
304
        graph = self.make_known_graph(alt_merge)
 
307
 
        self.assertEqual(set(['c']), graph.heads(['a', 'c']))
 
 
305
        self.assertEqual({b'c'}, graph.heads([b'a', b'c']))
 
309
307
    def test_heads_with_ghost(self):
 
310
308
        graph = self.make_known_graph(test_graph.with_ghost)
 
311
 
        self.assertEqual(set(['e', 'g']), graph.heads(['e', 'g']))
 
312
 
        self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c']))
 
313
 
        self.assertEqual(set(['a', 'g']), graph.heads(['a', 'g']))
 
314
 
        self.assertEqual(set(['f', 'g']), graph.heads(['f', 'g']))
 
315
 
        self.assertEqual(set(['c']), graph.heads(['c', 'g']))
 
316
 
        self.assertEqual(set(['c']), graph.heads(['c', 'b', 'd', 'g']))
 
317
 
        self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c', 'e', 'g']))
 
318
 
        self.assertEqual(set(['a', 'c']), graph.heads(['a', 'c', 'f']))
 
 
309
        self.assertEqual({b'e', b'g'}, graph.heads([b'e', b'g']))
 
 
310
        self.assertEqual({b'a', b'c'}, graph.heads([b'a', b'c']))
 
 
311
        self.assertEqual({b'a', b'g'}, graph.heads([b'a', b'g']))
 
 
312
        self.assertEqual({b'f', b'g'}, graph.heads([b'f', b'g']))
 
 
313
        self.assertEqual({b'c'}, graph.heads([b'c', b'g']))
 
 
314
        self.assertEqual({b'c'}, graph.heads([b'c', b'b', b'd', b'g']))
 
 
315
        self.assertEqual({b'a', b'c'}, graph.heads([b'a', b'c', b'e', b'g']))
 
 
316
        self.assertEqual({b'a', b'c'}, graph.heads([b'a', b'c', b'f']))
 
320
318
    def test_filling_in_ghosts_resets_head_cache(self):
 
321
319
        graph = self.make_known_graph(test_graph.with_ghost)
 
322
 
        self.assertEqual(set(['e', 'g']), graph.heads(['e', 'g']))
 
 
320
        self.assertEqual({b'e', b'g'}, graph.heads([b'e', b'g']))
 
323
321
        # 'g' is filled in, and decends from 'e', so the heads result is now
 
325
 
        graph.add_node('g', ['e'])
 
326
 
        self.assertEqual(set(['g']), graph.heads(['e', 'g']))
 
 
323
        graph.add_node(b'g', [b'e'])
 
 
324
        self.assertEqual({b'g'}, graph.heads([b'e', b'g']))
 
329
327
class TestKnownGraphTopoSort(TestCaseWithKnownGraph):