@@ -11240,6 +11240,109 @@ test_table_collection_union(void)
1124011240 tsk_table_collection_free (& tables );
1124111241}
1124211242
11243+ static void
11244+ test_table_collection_disjoint_union (void )
11245+ {
11246+ int ret ;
11247+ tsk_id_t ret_id ;
11248+ tsk_table_collection_t tables ;
11249+ tsk_table_collection_t tables1 ;
11250+ tsk_table_collection_t tables2 ;
11251+ tsk_table_collection_t tables12 ;
11252+ tsk_id_t node_mapping [4 ];
11253+
11254+ tsk_memset (node_mapping , 0xff , sizeof (node_mapping ));
11255+
11256+ ret = tsk_table_collection_init (& tables1 , 0 );
11257+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11258+ tables1 .sequence_length = 2 ;
11259+
11260+ // set up nodes, which will be shared
11261+ // flags, time, pop, ind, metadata, metadata_length
11262+ ret_id = tsk_node_table_add_row (
11263+ & tables1 .nodes , TSK_NODE_IS_SAMPLE , 0.0 , TSK_NULL , TSK_NULL , NULL , 0 );
11264+ CU_ASSERT_FATAL (ret_id >= 0 );
11265+ ret_id = tsk_node_table_add_row (
11266+ & tables1 .nodes , TSK_NODE_IS_SAMPLE , 0.0 , TSK_NULL , TSK_NULL , NULL , 0 );
11267+ CU_ASSERT_FATAL (ret_id >= 0 );
11268+ ret_id = tsk_node_table_add_row (& tables1 .nodes , 0 , 0.5 , TSK_NULL , TSK_NULL , NULL , 0 );
11269+ CU_ASSERT_FATAL (ret_id >= 0 );
11270+ ret_id = tsk_node_table_add_row (& tables1 .nodes , 0 , 1.5 , TSK_NULL , TSK_NULL , NULL , 0 );
11271+ CU_ASSERT_FATAL (ret_id >= 0 );
11272+ ret = tsk_table_collection_copy (& tables1 , & tables2 , 0 );
11273+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11274+
11275+ // for tables1:
11276+ // on [0, 1] we have 0, 1 inherit from 2
11277+ // left, right, parent, child, metadata, metadata_length
11278+ ret_id = tsk_edge_table_add_row (& tables1 .edges , 0.0 , 1.0 , 2 , 0 , NULL , 0 );
11279+ CU_ASSERT_FATAL (ret_id >= 0 );
11280+ ret_id = tsk_edge_table_add_row (& tables1 .edges , 0.0 , 1.0 , 2 , 1 , NULL , 0 );
11281+ CU_ASSERT_FATAL (ret_id >= 0 );
11282+ ret_id = tsk_site_table_add_row (& tables1 .sites , 0.4 , "T" , 1 , NULL , 0 );
11283+ CU_ASSERT_FATAL (ret_id >= 0 );
11284+ ret_id = tsk_mutation_table_add_row (
11285+ & tables1 .mutations , ret_id , 0 , TSK_NULL , TSK_UNKNOWN_TIME , NULL , 0 , NULL , 0 );
11286+ CU_ASSERT_FATAL (ret_id >= 0 );
11287+ ret = tsk_table_collection_build_index (& tables1 , 0 );
11288+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11289+ ret = tsk_table_collection_sort (& tables1 , NULL , 0 );
11290+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11291+
11292+ // all this goes in tables12 so far
11293+ ret = tsk_table_collection_copy (& tables1 , & tables12 , 0 );
11294+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11295+
11296+ // for tables2; and need to add to tables12 also:
11297+ // on [1, 2] we have 0, 1 inherit from 3
11298+ // left, right, parent, child, metadata, metadata_length
11299+ ret_id = tsk_edge_table_add_row (& tables2 .edges , 1.0 , 2.0 , 3 , 0 , NULL , 0 );
11300+ CU_ASSERT_FATAL (ret_id >= 0 );
11301+ ret_id = tsk_edge_table_add_row (& tables2 .edges , 1.0 , 2.0 , 3 , 1 , NULL , 0 );
11302+ CU_ASSERT_FATAL (ret_id >= 0 );
11303+ ret_id = tsk_site_table_add_row (& tables2 .sites , 1.4 , "A" , 1 , NULL , 0 );
11304+ CU_ASSERT_FATAL (ret_id >= 0 );
11305+ ret_id = tsk_mutation_table_add_row (
11306+ & tables2 .mutations , ret_id , 1 , TSK_NULL , TSK_UNKNOWN_TIME , "T" , 1 , NULL , 0 );
11307+ CU_ASSERT_FATAL (ret_id >= 0 );
11308+ ret = tsk_table_collection_build_index (& tables2 , 0 );
11309+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11310+ ret = tsk_table_collection_sort (& tables2 , NULL , 0 );
11311+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11312+ // also tables12
11313+ ret_id = tsk_edge_table_add_row (& tables12 .edges , 1.0 , 2.0 , 3 , 0 , NULL , 0 );
11314+ CU_ASSERT_FATAL (ret_id >= 0 );
11315+ ret_id = tsk_edge_table_add_row (& tables12 .edges , 1.0 , 2.0 , 3 , 1 , NULL , 0 );
11316+ CU_ASSERT_FATAL (ret_id >= 0 );
11317+ ret_id = tsk_site_table_add_row (& tables12 .sites , 1.4 , "A" , 1 , NULL , 0 );
11318+ CU_ASSERT_FATAL (ret_id >= 0 );
11319+ ret_id = tsk_mutation_table_add_row (
11320+ & tables12 .mutations , ret_id , 1 , TSK_NULL , TSK_UNKNOWN_TIME , "T" , 1 , NULL , 0 );
11321+ CU_ASSERT_FATAL (ret_id >= 0 );
11322+ ret = tsk_table_collection_build_index (& tables12 , 0 );
11323+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11324+ ret = tsk_table_collection_sort (& tables12 , NULL , 0 );
11325+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11326+
11327+ // now disjoint union-ing tables1 and tables2 should get tables12
11328+ ret = tsk_table_collection_copy (& tables1 , & tables , 0 );
11329+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11330+ node_mapping [0 ] = 0 ;
11331+ node_mapping [1 ] = 1 ;
11332+ node_mapping [2 ] = 2 ;
11333+ node_mapping [3 ] = 3 ;
11334+ ret = tsk_table_collection_union (& tables , & tables2 , node_mapping ,
11335+ TSK_UNION_NO_CHECK_SHARED | TSK_UNION_ALL_EDGES | TSK_UNION_ALL_MUTATIONS );
11336+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
11337+ CU_ASSERT_FATAL (
11338+ tsk_table_collection_equals (& tables , & tables12 , TSK_CMP_IGNORE_PROVENANCE ));
11339+
11340+ tsk_table_collection_free (& tables12 );
11341+ tsk_table_collection_free (& tables2 );
11342+ tsk_table_collection_free (& tables1 );
11343+ tsk_table_collection_free (& tables );
11344+ }
11345+
1124311346static void
1124411347test_table_collection_union_middle_merge (void )
1124511348{
@@ -11836,6 +11939,7 @@ main(int argc, char **argv)
1183611939 test_table_collection_subset_unsorted },
1183711940 { "test_table_collection_subset_errors" , test_table_collection_subset_errors },
1183811941 { "test_table_collection_union" , test_table_collection_union },
11942+ { "test_table_collection_disjoint_union" , test_table_collection_disjoint_union },
1183911943 { "test_table_collection_union_middle_merge" ,
1184011944 test_table_collection_union_middle_merge },
1184111945 { "test_table_collection_union_errors" , test_table_collection_union_errors },
0 commit comments