@@ -4122,6 +4122,9 @@ test_sort_tables_canonical_errors(void)
4122
4122
ret = tsk_table_collection_init (& tables , 0 );
4123
4123
CU_ASSERT_EQUAL_FATAL (ret , 0 );
4124
4124
tables .sequence_length = 1 ;
4125
+ tsk_id_t null_p [] = { -1 };
4126
+ tsk_id_t zero_p [] = { 0 };
4127
+ tsk_id_t one_p [] = { 1 };
4125
4128
4126
4129
ret = tsk_node_table_add_row (& tables .nodes , 0 , 0.0 , TSK_NULL , TSK_NULL , NULL , 0 );
4127
4130
CU_ASSERT_FATAL (ret >= 0 );
@@ -4140,7 +4143,7 @@ test_sort_tables_canonical_errors(void)
4140
4143
CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_MUTATION_PARENT_INCONSISTENT );
4141
4144
4142
4145
ret = tsk_mutation_table_clear (& tables .mutations );
4143
- CU_ASSERT_FATAL (ret > = 0 );
4146
+ CU_ASSERT_FATAL (ret = = 0 );
4144
4147
ret = tsk_mutation_table_add_row (& tables .mutations , 0 , 0 , 2 , 0.0 , "a" , 1 , NULL , 0 );
4145
4148
CU_ASSERT_FATAL (ret >= 0 );
4146
4149
ret = tsk_mutation_table_add_row (& tables .mutations , 0 , 0 , 3 , 0.0 , "b" , 1 , NULL , 0 );
@@ -4153,6 +4156,44 @@ test_sort_tables_canonical_errors(void)
4153
4156
ret = tsk_table_collection_canonicalise (& tables , 0 );
4154
4157
CU_ASSERT_EQUAL_FATAL (ret , 0 );
4155
4158
4159
+ ret = tsk_node_table_add_row (& tables .nodes , 0 , 0.0 , TSK_NULL , 0 , NULL , 0 );
4160
+ CU_ASSERT_FATAL (ret >= 0 );
4161
+ ret = tsk_node_table_add_row (& tables .nodes , 0 , 0.0 , TSK_NULL , 1 , NULL , 0 );
4162
+ CU_ASSERT_FATAL (ret >= 0 );
4163
+ ret = tsk_individual_table_add_row (
4164
+ & tables .individuals , 0 , NULL , 0 , one_p , 1 , NULL , 0 );
4165
+ CU_ASSERT_FATAL (ret >= 0 );
4166
+ ret = tsk_individual_table_add_row (
4167
+ & tables .individuals , 0 , NULL , 0 , zero_p , 1 , NULL , 0 );
4168
+ CU_ASSERT_FATAL (ret >= 0 );
4169
+
4170
+ ret = tsk_table_collection_canonicalise (& tables , 0 );
4171
+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_INDIVIDUAL_PARENT_CYCLE );
4172
+
4173
+ ret = tsk_individual_table_clear (& tables .individuals );
4174
+ CU_ASSERT_FATAL (ret == 0 );
4175
+ ret = tsk_individual_table_add_row (
4176
+ & tables .individuals , 0 , NULL , 0 , zero_p , 1 , NULL , 0 );
4177
+ CU_ASSERT_FATAL (ret >= 0 );
4178
+ ret = tsk_individual_table_add_row (
4179
+ & tables .individuals , 0 , NULL , 0 , zero_p , 1 , NULL , 0 );
4180
+ CU_ASSERT_FATAL (ret >= 0 );
4181
+
4182
+ ret = tsk_table_collection_canonicalise (& tables , 0 );
4183
+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_INDIVIDUAL_SELF_PARENT );
4184
+
4185
+ ret = tsk_individual_table_clear (& tables .individuals );
4186
+ CU_ASSERT_FATAL (ret == 0 );
4187
+ ret = tsk_individual_table_add_row (
4188
+ & tables .individuals , 0 , NULL , 0 , null_p , 1 , NULL , 0 );
4189
+ CU_ASSERT_FATAL (ret >= 0 );
4190
+ ret = tsk_individual_table_add_row (
4191
+ & tables .individuals , 0 , NULL , 0 , zero_p , 1 , NULL , 0 );
4192
+ CU_ASSERT_FATAL (ret >= 0 );
4193
+
4194
+ ret = tsk_table_collection_canonicalise (& tables , 0 );
4195
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
4196
+
4156
4197
tsk_table_collection_free (& tables );
4157
4198
}
4158
4199
@@ -4169,10 +4210,10 @@ test_sort_tables_canonical(void)
4169
4210
"0 1 2 -1\n"
4170
4211
"0 2 -1 2\n"
4171
4212
"0 3 -1 -1\n" ;
4172
- const char * individuals = "0 0.0\n"
4173
- "0 1.0\n"
4174
- "0 2.0\n"
4175
- "0 3.0\n" ;
4213
+ const char * individuals = "0 0.0 1 \n"
4214
+ "0 1.0 -1 \n"
4215
+ "0 2.0 1,3 \n"
4216
+ "0 3.0 -1,1 \n" ;
4176
4217
const char * sites = "0 0\n"
4177
4218
"0.2 0\n"
4178
4219
"0.1 0\n" ;
@@ -4192,9 +4233,9 @@ test_sort_tables_canonical(void)
4192
4233
"0 1 0 -1\n"
4193
4234
"0 2 -1 2\n"
4194
4235
"0 3 -1 -1\n" ;
4195
- const char * individuals_sorted = "0 1.0\n"
4196
- "0 3.0\n"
4197
- "0 2.0\n" ;
4236
+ const char * individuals_sorted = "0 1.0 -1 \n"
4237
+ "0 3.0 -1,0 \n"
4238
+ "0 2.0 0,1 \n" ;
4198
4239
const char * sites_sorted = "0 0\n"
4199
4240
"0.1 0\n"
4200
4241
"0.2 0\n" ;
@@ -4207,10 +4248,10 @@ test_sort_tables_canonical(void)
4207
4248
"2 1 4 4 0.5\n"
4208
4249
"2 1 5 6 0.5\n"
4209
4250
"2 1 6 6 0.5\n" ;
4210
- const char * individuals_sorted_kept = "0 1.0\n"
4211
- "0 3.0\n"
4212
- "0 2.0\n"
4213
- "0 0.0\n" ;
4251
+ const char * individuals_sorted_kept = "0 1.0 -1 \n"
4252
+ "0 3.0 -1,0 \n"
4253
+ "0 2.0 0,1 \n"
4254
+ "0 0.0 0 \n" ;
4214
4255
4215
4256
ret = tsk_table_collection_init (& t1 , 0 );
4216
4257
CU_ASSERT_EQUAL_FATAL (ret , 0 );
@@ -5338,6 +5379,8 @@ test_table_collection_subset_with_options(tsk_flags_t options)
5338
5379
tsk_table_collection_t tables_copy ;
5339
5380
int k ;
5340
5381
tsk_id_t nodes [4 ];
5382
+ tsk_id_t zero_p [] = { 0 };
5383
+ tsk_id_t one_p [] = { 1 };
5341
5384
5342
5385
ret = tsk_table_collection_init (& tables , options );
5343
5386
CU_ASSERT_EQUAL_FATAL (ret , 0 );
@@ -5360,15 +5403,18 @@ test_table_collection_subset_with_options(tsk_flags_t options)
5360
5403
ret = tsk_node_table_add_row (
5361
5404
& tables .nodes , TSK_NODE_IS_SAMPLE , 0.0 , TSK_NULL , 1 , NULL , 0 );
5362
5405
CU_ASSERT_FATAL (ret >= 0 );
5406
+ // unused individual who is the parent of others
5363
5407
ret = tsk_individual_table_add_row (
5364
5408
& tables .individuals , 0 , NULL , 0 , NULL , 0 , NULL , 0 );
5409
+ ret = tsk_individual_table_add_row (
5410
+ & tables .individuals , 0 , NULL , 0 , zero_p , 1 , NULL , 0 );
5365
5411
CU_ASSERT_FATAL (ret >= 0 );
5366
5412
ret = tsk_individual_table_add_row (
5367
- & tables .individuals , 0 , NULL , 0 , NULL , 0 , NULL , 0 );
5413
+ & tables .individuals , 0 , NULL , 0 , one_p , 1 , NULL , 0 );
5368
5414
CU_ASSERT_FATAL (ret >= 0 );
5369
5415
// unused individual
5370
5416
ret = tsk_individual_table_add_row (
5371
- & tables .individuals , 0 , NULL , 0 , NULL , 0 , NULL , 0 );
5417
+ & tables .individuals , 0 , NULL , 0 , one_p , 1 , NULL , 0 );
5372
5418
CU_ASSERT_FATAL (ret >= 0 );
5373
5419
ret = tsk_population_table_add_row (& tables .populations , NULL , 0 );
5374
5420
CU_ASSERT_FATAL (ret >= 0 );
@@ -5425,7 +5471,8 @@ test_table_collection_subset_with_options(tsk_flags_t options)
5425
5471
ret = tsk_table_collection_subset (& tables_copy , NULL , 0 , TSK_KEEP_UNREFERENCED );
5426
5472
CU_ASSERT_EQUAL_FATAL (ret , 0 );
5427
5473
CU_ASSERT_EQUAL_FATAL (tables_copy .nodes .num_rows , 0 );
5428
- CU_ASSERT_EQUAL_FATAL (tables_copy .individuals .num_rows , 3 );
5474
+ CU_ASSERT_FATAL (
5475
+ tsk_individual_table_equals (& tables .individuals , & tables_copy .individuals , 0 ));
5429
5476
CU_ASSERT_EQUAL_FATAL (tables_copy .populations .num_rows , 2 );
5430
5477
CU_ASSERT_EQUAL_FATAL (tables_copy .mutations .num_rows , 0 );
5431
5478
CU_ASSERT_FATAL (tsk_site_table_equals (& tables .sites , & tables_copy .sites , 0 ));
@@ -5437,13 +5484,14 @@ test_table_collection_subset_with_options(tsk_flags_t options)
5437
5484
& tables_copy , NULL , 0 , TSK_KEEP_UNREFERENCED | TSK_NO_CHANGE_POPULATIONS );
5438
5485
CU_ASSERT_EQUAL_FATAL (ret , 0 );
5439
5486
CU_ASSERT_EQUAL_FATAL (tables_copy .nodes .num_rows , 0 );
5440
- CU_ASSERT_EQUAL_FATAL (tables_copy .individuals .num_rows , 3 );
5487
+ CU_ASSERT_FATAL (
5488
+ tsk_individual_table_equals (& tables .individuals , & tables_copy .individuals , 0 ));
5441
5489
CU_ASSERT_EQUAL_FATAL (tables_copy .mutations .num_rows , 0 );
5442
5490
CU_ASSERT_FATAL (
5443
5491
tsk_population_table_equals (& tables .populations , & tables_copy .populations , 0 ));
5444
5492
CU_ASSERT_FATAL (tsk_site_table_equals (& tables .sites , & tables_copy .sites , 0 ));
5445
5493
5446
- // the identity transformation, since unused inds/ pops are at the end
5494
+ // the identity transformation, since unused pops are at the end
5447
5495
for (k = 0 ; k < 4 ; k ++ ) {
5448
5496
nodes [k ] = k ;
5449
5497
}
@@ -5458,14 +5506,16 @@ test_table_collection_subset_with_options(tsk_flags_t options)
5458
5506
CU_ASSERT_EQUAL_FATAL (ret , 0 );
5459
5507
ret = tsk_table_collection_subset (& tables_copy , nodes , 4 , 0 );
5460
5508
CU_ASSERT_EQUAL_FATAL (ret , 0 );
5509
+ ret = tsk_table_collection_check_integrity (& tables_copy , 0 );
5510
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
5461
5511
CU_ASSERT_FATAL (tsk_node_table_equals (& tables .nodes , & tables_copy .nodes , 0 ));
5462
5512
CU_ASSERT_EQUAL_FATAL (tables_copy .individuals .num_rows , 2 );
5463
5513
CU_ASSERT_EQUAL_FATAL (tables_copy .populations .num_rows , 1 );
5464
5514
CU_ASSERT_EQUAL_FATAL (tables_copy .sites .num_rows , 2 );
5465
5515
CU_ASSERT_FATAL (
5466
5516
tsk_mutation_table_equals (& tables .mutations , & tables_copy .mutations , 0 ));
5467
5517
5468
- // reverse twice should get back to the start, since unused inds/ pops are at the end
5518
+ // reverse twice should get back to the start, since unused pops are at the end
5469
5519
for (k = 0 ; k < 4 ; k ++ ) {
5470
5520
nodes [k ] = 3 - k ;
5471
5521
}
@@ -5475,6 +5525,8 @@ test_table_collection_subset_with_options(tsk_flags_t options)
5475
5525
CU_ASSERT_EQUAL_FATAL (ret , 0 );
5476
5526
ret = tsk_table_collection_subset (& tables_copy , nodes , 4 , TSK_KEEP_UNREFERENCED );
5477
5527
CU_ASSERT_EQUAL_FATAL (ret , 0 );
5528
+ ret = tsk_table_collection_check_integrity (& tables_copy , 0 );
5529
+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
5478
5530
CU_ASSERT_FATAL (tsk_table_collection_equals (& tables , & tables_copy , 0 ));
5479
5531
5480
5532
tsk_table_collection_free (& tables_copy );
@@ -5496,6 +5548,7 @@ test_table_collection_subset_unsorted(void)
5496
5548
tsk_table_collection_t tables_copy ;
5497
5549
int k ;
5498
5550
tsk_id_t nodes [3 ];
5551
+ tsk_id_t one_p [] = { 1 };
5499
5552
5500
5553
ret = tsk_table_collection_init (& tables , 0 );
5501
5554
CU_ASSERT_EQUAL_FATAL (ret , 0 );
@@ -5508,10 +5561,14 @@ test_table_collection_subset_unsorted(void)
5508
5561
& tables .nodes , TSK_NODE_IS_SAMPLE , 0.0 , TSK_NULL , TSK_NULL , NULL , 0 );
5509
5562
CU_ASSERT_FATAL (ret >= 0 );
5510
5563
ret = tsk_node_table_add_row (
5511
- & tables .nodes , TSK_NODE_IS_SAMPLE , 0.5 , TSK_NULL , TSK_NULL , NULL , 0 );
5564
+ & tables .nodes , TSK_NODE_IS_SAMPLE , 0.5 , TSK_NULL , 1 , NULL , 0 );
5512
5565
CU_ASSERT_FATAL (ret >= 0 );
5513
- ret = tsk_node_table_add_row (& tables .nodes , 0 , 1.0 , TSK_NULL , TSK_NULL , NULL , 0 );
5566
+ ret = tsk_node_table_add_row (& tables .nodes , 0 , 1.0 , TSK_NULL , 0 , NULL , 0 );
5514
5567
CU_ASSERT_FATAL (ret >= 0 );
5568
+ ret = tsk_individual_table_add_row (
5569
+ & tables .individuals , 0 , NULL , 0 , one_p , 1 , NULL , 0 );
5570
+ ret = tsk_individual_table_add_row (
5571
+ & tables .individuals , 0 , NULL , 0 , NULL , 0 , NULL , 0 );
5515
5572
ret = tsk_edge_table_add_row (& tables .edges , 0.0 , 0.5 , 2 , 1 , NULL , 0 );
5516
5573
CU_ASSERT_FATAL (ret >= 0 );
5517
5574
ret = tsk_edge_table_add_row (& tables .edges , 0.0 , 1.0 , 1 , 0 , NULL , 0 );
0 commit comments