87
90
def test_children_ancestry1(self):
88
91
graph = self.make_known_graph(test_graph.ancestry_1)
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')
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')
97
100
def test_parent_ancestry1(self):
98
101
graph = self.make_known_graph(test_graph.ancestry_1)
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')
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')
107
110
def test_parent_with_ghost(self):
108
111
graph = self.make_known_graph(test_graph.with_ghost)
109
self.assertEqual(None, graph.get_parent_keys(b'g'))
112
self.assertEqual(None, graph.get_parent_keys('g'))
111
114
def test_gdfo_ancestry_1(self):
112
115
graph = self.make_known_graph(test_graph.ancestry_1)
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)
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)
119
122
def test_gdfo_feature_branch(self):
120
123
graph = self.make_known_graph(test_graph.feature_branch)
121
self.assertGDFO(graph, b'rev1', 2)
122
self.assertGDFO(graph, b'rev2b', 3)
123
self.assertGDFO(graph, b'rev3b', 4)
124
self.assertGDFO(graph, 'rev1', 2)
125
self.assertGDFO(graph, 'rev2b', 3)
126
self.assertGDFO(graph, 'rev3b', 4)
125
128
def test_gdfo_extended_history_shortcut(self):
126
129
graph = self.make_known_graph(test_graph.extended_history_shortcut)
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)
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)
134
137
def test_gdfo_with_ghost(self):
135
138
graph = self.make_known_graph(test_graph.with_ghost)
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)
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)
144
147
def test_add_existing_node(self):
145
148
graph = self.make_known_graph(test_graph.ancestry_1)
146
149
# Add a node that already exists with identical content
147
150
# This is a 'no-op'
148
self.assertGDFO(graph, b'rev4', 5)
149
graph.add_node(b'rev4', [b'rev3', b'rev2b'])
150
self.assertGDFO(graph, b'rev4', 5)
151
self.assertGDFO(graph, 'rev4', 5)
152
graph.add_node('rev4', ['rev3', 'rev2b'])
153
self.assertGDFO(graph, 'rev4', 5)
151
154
# This also works if we use a tuple rather than a list
152
graph.add_node(b'rev4', (b'rev3', b'rev2b'))
155
graph.add_node('rev4', ('rev3', 'rev2b'))
154
157
def test_add_existing_node_mismatched_parents(self):
155
158
graph = self.make_known_graph(test_graph.ancestry_1)
156
self.assertRaises(ValueError, graph.add_node, b'rev4',
159
self.assertRaises(ValueError, graph.add_node, 'rev4',
159
162
def test_add_node_with_ghost_parent(self):
160
163
graph = self.make_known_graph(test_graph.ancestry_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)
164
graph.add_node('rev5', ['rev2b', 'revGhost'])
165
self.assertGDFO(graph, 'rev5', 4)
166
self.assertGDFO(graph, 'revGhost', 1)
165
168
def test_add_new_root(self):
166
169
graph = self.make_known_graph(test_graph.ancestry_1)
167
graph.add_node(b'rev5', [])
168
self.assertGDFO(graph, b'rev5', 1)
170
graph.add_node('rev5', [])
171
self.assertGDFO(graph, 'rev5', 1)
170
173
def test_add_with_all_ghost_parents(self):
171
174
graph = self.make_known_graph(test_graph.ancestry_1)
172
graph.add_node(b'rev5', [b'ghost'])
173
self.assertGDFO(graph, b'rev5', 2)
174
self.assertGDFO(graph, b'ghost', 1)
175
graph.add_node('rev5', ['ghost'])
176
self.assertGDFO(graph, 'rev5', 2)
177
self.assertGDFO(graph, 'ghost', 1)
176
179
def test_gdfo_after_add_node(self):
177
180
graph = self.make_known_graph(test_graph.ancestry_1)
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)
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)
192
195
def test_fill_in_ghost(self):
193
196
graph = self.make_known_graph(test_graph.with_ghost)
194
197
# Add in a couple nodes and then fill in the 'ghost' so that it should
195
198
# cause renumbering of children nodes
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)
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)
212
215
class TestKnownGraphHeads(TestCaseWithKnownGraph):
214
scenarios = caching_scenarios() + non_caching_scenarios()
215
do_cache = None # Set by load_tests
217
do_cache = None # Set by load_tests
217
219
def test_heads_null(self):
218
220
graph = self.make_known_graph(test_graph.ancestry_1)
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:')))
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:')))
225
227
def test_heads_one(self):
226
228
# A single node will always be a head
227
229
graph = self.make_known_graph(test_graph.ancestry_1)
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']))
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']))
235
237
def test_heads_single(self):
236
238
graph = self.make_known_graph(test_graph.ancestry_1)
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']))
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']))
247
249
def test_heads_two_heads(self):
248
250
graph = self.make_known_graph(test_graph.ancestry_1)
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']))
251
self.assertEqual(set(['rev2a', 'rev2b']),
252
graph.heads(['rev2a', 'rev2b']))
253
self.assertEqual(set(['rev3', 'rev2b']),
254
graph.heads(['rev3', 'rev2b']))
254
256
def test_heads_criss_cross(self):
255
257
graph = self.make_known_graph(test_graph.criss_cross)
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']))
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']))
283
285
def test_heads_shortcut(self):
284
286
graph = self.make_known_graph(test_graph.history_shortcut)
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']))
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']))
296
298
def test_heads_linear(self):
297
299
graph = self.make_known_graph(test_graph.racing_shortcuts)
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']))
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']))
303
305
def test_heads_alt_merge(self):
304
306
graph = self.make_known_graph(alt_merge)
305
self.assertEqual({b'c'}, graph.heads([b'a', b'c']))
307
self.assertEqual(set(['c']), graph.heads(['a', 'c']))
307
309
def test_heads_with_ghost(self):
308
310
graph = self.make_known_graph(test_graph.with_ghost)
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']))
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']))
318
320
def test_filling_in_ghosts_resets_head_cache(self):
319
321
graph = self.make_known_graph(test_graph.with_ghost)
320
self.assertEqual({b'e', b'g'}, graph.heads([b'e', b'g']))
322
self.assertEqual(set(['e', 'g']), graph.heads(['e', 'g']))
321
323
# 'g' is filled in, and decends from 'e', so the heads result is now
323
graph.add_node(b'g', [b'e'])
324
self.assertEqual({b'g'}, graph.heads([b'e', b'g']))
325
graph.add_node('g', ['e'])
326
self.assertEqual(set(['g']), graph.heads(['e', 'g']))
327
329
class TestKnownGraphTopoSort(TestCaseWithKnownGraph):
879
881
self.assertSorted([('F', 'c'), ('F', 'b'), ('F', 'a'),
880
882
('G', 'c'), ('G', 'b'), ('G', 'a'),
881
883
('Q', 'c'), ('Q', 'b'), ('Q', 'a'),
883
{('F', 'a'): (), ('F', 'b'): (('F', 'a'),),
885
{('F', 'a'):(), ('F', 'b'): (('F', 'a'),),
884
886
('F', 'c'): (('F', 'b'),),
885
('G', 'a'): (), ('G', 'b'): (('G', 'a'),),
887
('G', 'a'):(), ('G', 'b'): (('G', 'a'),),
886
888
('G', 'c'): (('G', 'b'),),
887
('Q', 'a'): (), ('Q', 'b'): (('Q', 'a'),),
889
('Q', 'a'):(), ('Q', 'b'): (('Q', 'a'),),
888
890
('Q', 'c'): (('Q', 'b'),),
891
893
def test_stable_sorting(self):
892
894
# the sort order should be stable even when extra nodes are added
893
895
self.assertSorted(['b', 'c', 'a'],
894
{'a': (), 'b': ('a',), 'c': ('a',)})
895
self.assertSorted(['b', 'c', 'd', 'a'],
896
{'a': (), 'b': ('a',), 'c': ('a',), 'd': ('a',)})
897
self.assertSorted(['b', 'c', 'd', 'a'],
898
{'a': (), 'b': ('a',), 'c': ('a',), 'd': ('a',)})
896
{'a':(), 'b':('a',), 'c':('a',)})
897
self.assertSorted(['b', 'c', 'd', 'a'],
898
{'a':(), 'b':('a',), 'c':('a',), 'd':('a',)})
899
self.assertSorted(['b', 'c', 'd', 'a'],
900
{'a':(), 'b':('a',), 'c':('a',), 'd':('a',)})
899
901
self.assertSorted(['Z', 'b', 'c', 'd', 'a'],
900
{'a': (), 'b': ('a',), 'c': ('a',), 'd': ('a',),
902
{'a':(), 'b':('a',), 'c':('a',), 'd':('a',),
902
904
self.assertSorted(['e', 'b', 'c', 'f', 'Z', 'd', 'a'],
903
{'a': (), 'b': ('a',), 'c': ('a',), 'd': ('a',),
905
'e': ('b', 'c', 'd'),
905
{'a':(), 'b':('a',), 'c':('a',), 'd':('a',),
909
911
def test_skip_ghost(self):
910
912
self.assertSorted(['b', 'c', 'a'],
911
{'a': (), 'b': ('a', 'ghost'), 'c': ('a',)})
913
{'a':(), 'b':('a', 'ghost'), 'c':('a',)})
913
915
def test_skip_mainline_ghost(self):
914
916
self.assertSorted(['b', 'c', 'a'],
915
{'a': (), 'b': ('ghost', 'a'), 'c': ('a',)})
917
{'a':(), 'b':('ghost', 'a'), 'c':('a',)})