@@ -175,6 +175,97 @@ verify_individual_nodes(tsk_treeseq_t *ts)
175
175
}
176
176
}
177
177
178
+ static void
179
+ verify_tree_pos (const tsk_treeseq_t * ts , tsk_size_t num_trees , tsk_id_t * tree_parents )
180
+ {
181
+ int ret ;
182
+ const tsk_size_t N = tsk_treeseq_get_num_nodes (ts );
183
+ const tsk_id_t * edges_parent = ts -> tables -> edges .parent ;
184
+ const tsk_id_t * edges_child = ts -> tables -> edges .child ;
185
+ tsk_tree_position_t tree_pos ;
186
+ tsk_id_t * known_parent ;
187
+ tsk_id_t * parent = tsk_malloc (N * sizeof (* parent ));
188
+ tsk_id_t u , index , j , e ;
189
+ bool valid ;
190
+
191
+ CU_ASSERT_FATAL (parent != NULL );
192
+
193
+ ret = tsk_tree_position_init (& tree_pos , ts , 0 );
194
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
195
+
196
+ for (u = 0 ; u < (tsk_id_t ) N ; u ++ ) {
197
+ parent [u ] = TSK_NULL ;
198
+ }
199
+
200
+ for (index = 0 ; index < (tsk_id_t ) num_trees ; index ++ ) {
201
+ known_parent = tree_parents + N * (tsk_size_t ) index ;
202
+
203
+ valid = tsk_tree_position_next (& tree_pos );
204
+ CU_ASSERT_TRUE (valid );
205
+ CU_ASSERT_EQUAL (index , tree_pos .index );
206
+
207
+ for (j = tree_pos .out .start ; j < tree_pos .out .stop ; j ++ ) {
208
+ e = tree_pos .out .order [j ];
209
+ parent [edges_child [e ]] = TSK_NULL ;
210
+ }
211
+
212
+ for (j = tree_pos .in .start ; j < tree_pos .in .stop ; j ++ ) {
213
+ e = tree_pos .in .order [j ];
214
+ parent [edges_child [e ]] = edges_parent [e ];
215
+ }
216
+
217
+ for (u = 0 ; u < (tsk_id_t ) N ; u ++ ) {
218
+ CU_ASSERT_EQUAL (parent [u ], known_parent [u ]);
219
+ }
220
+ }
221
+
222
+ valid = tsk_tree_position_next (& tree_pos );
223
+ CU_ASSERT_FALSE (valid );
224
+ for (j = tree_pos .out .start ; j < tree_pos .out .stop ; j ++ ) {
225
+ e = tree_pos .out .order [j ];
226
+ parent [edges_child [e ]] = TSK_NULL ;
227
+ }
228
+ for (u = 0 ; u < (tsk_id_t ) N ; u ++ ) {
229
+ CU_ASSERT_EQUAL (parent [u ], TSK_NULL );
230
+ }
231
+
232
+ for (index = (tsk_id_t ) num_trees - 1 ; index >= 0 ; index -- ) {
233
+ known_parent = tree_parents + N * (tsk_size_t ) index ;
234
+
235
+ valid = tsk_tree_position_prev (& tree_pos );
236
+ CU_ASSERT_TRUE (valid );
237
+ CU_ASSERT_EQUAL (index , tree_pos .index );
238
+
239
+ for (j = tree_pos .out .start ; j > tree_pos .out .stop ; j -- ) {
240
+ e = tree_pos .out .order [j ];
241
+ parent [edges_child [e ]] = TSK_NULL ;
242
+ }
243
+
244
+ for (j = tree_pos .in .start ; j > tree_pos .in .stop ; j -- ) {
245
+ CU_ASSERT_FATAL (j >= 0 );
246
+ e = tree_pos .in .order [j ];
247
+ parent [edges_child [e ]] = edges_parent [e ];
248
+ }
249
+
250
+ for (u = 0 ; u < (tsk_id_t ) N ; u ++ ) {
251
+ CU_ASSERT_EQUAL (parent [u ], known_parent [u ]);
252
+ }
253
+ }
254
+
255
+ valid = tsk_tree_position_prev (& tree_pos );
256
+ CU_ASSERT_FALSE (valid );
257
+ for (j = tree_pos .out .start ; j > tree_pos .out .stop ; j -- ) {
258
+ e = tree_pos .out .order [j ];
259
+ parent [edges_child [e ]] = TSK_NULL ;
260
+ }
261
+ for (u = 0 ; u < (tsk_id_t ) N ; u ++ ) {
262
+ CU_ASSERT_EQUAL (parent [u ], TSK_NULL );
263
+ }
264
+
265
+ tsk_tree_position_free (& tree_pos );
266
+ tsk_safe_free (parent );
267
+ }
268
+
178
269
static void
179
270
verify_trees (tsk_treeseq_t * ts , tsk_size_t num_trees , tsk_id_t * parents )
180
271
{
@@ -233,6 +324,8 @@ verify_trees(tsk_treeseq_t *ts, tsk_size_t num_trees, tsk_id_t *parents)
233
324
CU_ASSERT_EQUAL (tsk_treeseq_get_sequence_length (ts ), breakpoints [j ]);
234
325
235
326
tsk_tree_free (& tree );
327
+
328
+ verify_tree_pos (ts , num_trees , parents );
236
329
}
237
330
238
331
static tsk_tree_t *
@@ -5233,6 +5326,65 @@ test_single_tree_tracked_samples(void)
5233
5326
tsk_tree_free (& tree );
5234
5327
}
5235
5328
5329
+ static void
5330
+ test_single_tree_tree_pos (void )
5331
+ {
5332
+ tsk_treeseq_t ts ;
5333
+ tsk_tree_position_t tree_pos ;
5334
+ bool valid ;
5335
+ int ret ;
5336
+
5337
+ tsk_treeseq_from_text (& ts , 1 , single_tree_ex_nodes , single_tree_ex_edges , NULL , NULL ,
5338
+ NULL , NULL , NULL , 0 );
5339
+
5340
+ ret = tsk_tree_position_init (& tree_pos , & ts , 0 );
5341
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
5342
+ valid = tsk_tree_position_next (& tree_pos );
5343
+ CU_ASSERT_FATAL (valid );
5344
+
5345
+ CU_ASSERT_EQUAL_FATAL (tree_pos .interval .left , 0 );
5346
+ CU_ASSERT_EQUAL_FATAL (tree_pos .interval .right , 1 );
5347
+ CU_ASSERT_EQUAL_FATAL (tree_pos .in .start , 0 );
5348
+ CU_ASSERT_EQUAL_FATAL (tree_pos .in .stop , 6 );
5349
+ CU_ASSERT_EQUAL_FATAL (tree_pos .in .order , ts .tables -> indexes .edge_insertion_order );
5350
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .start , 0 );
5351
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .stop , 0 );
5352
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .order , ts .tables -> indexes .edge_removal_order );
5353
+
5354
+ valid = tsk_tree_position_next (& tree_pos );
5355
+ CU_ASSERT_FATAL (!valid );
5356
+
5357
+ tsk_tree_position_print_state (& tree_pos , _devnull );
5358
+
5359
+ CU_ASSERT_EQUAL_FATAL (tree_pos .index , -1 );
5360
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .start , 0 );
5361
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .stop , 6 );
5362
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .order , ts .tables -> indexes .edge_removal_order );
5363
+
5364
+ valid = tsk_tree_position_prev (& tree_pos );
5365
+ CU_ASSERT_FATAL (valid );
5366
+
5367
+ CU_ASSERT_EQUAL_FATAL (tree_pos .interval .left , 0 );
5368
+ CU_ASSERT_EQUAL_FATAL (tree_pos .interval .right , 1 );
5369
+ CU_ASSERT_EQUAL_FATAL (tree_pos .in .start , 5 );
5370
+ CU_ASSERT_EQUAL_FATAL (tree_pos .in .stop , -1 );
5371
+ CU_ASSERT_EQUAL_FATAL (tree_pos .in .order , ts .tables -> indexes .edge_removal_order );
5372
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .start , 5 );
5373
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .stop , 5 );
5374
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .order , ts .tables -> indexes .edge_insertion_order );
5375
+
5376
+ valid = tsk_tree_position_prev (& tree_pos );
5377
+ CU_ASSERT_FATAL (!valid );
5378
+
5379
+ CU_ASSERT_EQUAL_FATAL (tree_pos .index , -1 );
5380
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .start , 5 );
5381
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .stop , -1 );
5382
+ CU_ASSERT_EQUAL_FATAL (tree_pos .out .order , ts .tables -> indexes .edge_insertion_order );
5383
+
5384
+ tsk_tree_position_free (& tree_pos );
5385
+ tsk_treeseq_free (& ts );
5386
+ }
5387
+
5236
5388
/*=======================================================
5237
5389
* Multi tree tests.
5238
5390
*======================================================*/
@@ -8185,6 +8337,7 @@ main(int argc, char **argv)
8185
8337
{ "test_single_tree_map_mutations_internal_samples" ,
8186
8338
test_single_tree_map_mutations_internal_samples },
8187
8339
{ "test_single_tree_tracked_samples" , test_single_tree_tracked_samples },
8340
+ { "test_single_tree_tree_pos" , test_single_tree_tree_pos },
8188
8341
8189
8342
/* Multi tree tests */
8190
8343
{ "test_simple_multi_tree" , test_simple_multi_tree },
0 commit comments