@@ -2898,6 +2898,320 @@ test_column_overflow(void)
28982898 tsk_table_collection_free (& tables );
28992899}
29002900
2901+ static void
2902+ test_table_collection_check_integrity (void )
2903+ {
2904+ int ret ;
2905+ tsk_table_collection_t tables ;
2906+
2907+ ret = tsk_table_collection_init (& tables , 0 );
2908+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2909+ tables .sequence_length = 1 ;
2910+
2911+ /* nodes */
2912+ ret = tsk_node_table_add_row (
2913+ & tables .nodes , TSK_NODE_IS_SAMPLE , INFINITY , TSK_NULL , TSK_NULL , NULL , 0 );
2914+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2915+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2916+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_TIME_NONFINITE );
2917+
2918+ ret = tsk_node_table_clear (& tables .nodes );
2919+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2920+ ret = tsk_node_table_add_row (
2921+ & tables .nodes , TSK_NODE_IS_SAMPLE , 0.0 , 0 , TSK_NULL , NULL , 0 );
2922+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2923+ ret = tsk_table_collection_check_integrity (& tables , TSK_NO_CHECK_POPULATION_REFS );
2924+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2925+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2926+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_POPULATION_OUT_OF_BOUNDS );
2927+
2928+ ret = tsk_node_table_clear (& tables .nodes );
2929+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2930+ ret = tsk_node_table_add_row (
2931+ & tables .nodes , TSK_NODE_IS_SAMPLE , 0.0 , TSK_NULL , 0 , NULL , 0 );
2932+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2933+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2934+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_INDIVIDUAL_OUT_OF_BOUNDS );
2935+
2936+ ret = tsk_node_table_clear (& tables .nodes );
2937+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2938+ ret = tsk_node_table_add_row (
2939+ & tables .nodes , TSK_NODE_IS_SAMPLE , 0.0 , TSK_NULL , TSK_NULL , NULL , 0 );
2940+ CU_ASSERT_FATAL (ret >= 0 );
2941+ ret = tsk_node_table_add_row (
2942+ & tables .nodes , TSK_NODE_IS_SAMPLE , 1.0 , TSK_NULL , TSK_NULL , NULL , 0 );
2943+ CU_ASSERT_FATAL (ret >= 0 );
2944+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2945+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2946+
2947+ /* edges */
2948+ ret = tsk_edge_table_add_row (& tables .edges , 0.0 , 1.0 , TSK_NULL , 0 , NULL , 0 );
2949+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2950+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2951+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_NULL_PARENT );
2952+
2953+ ret = tsk_edge_table_clear (& tables .edges );
2954+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2955+ ret = tsk_edge_table_add_row (& tables .edges , 0.0 , 1.0 , 2 , 0 , NULL , 0 );
2956+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2957+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2958+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_NODE_OUT_OF_BOUNDS );
2959+
2960+ ret = tsk_edge_table_clear (& tables .edges );
2961+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2962+ ret = tsk_edge_table_add_row (& tables .edges , 0.0 , 1.0 , 1 , TSK_NULL , NULL , 0 );
2963+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2964+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2965+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_NULL_CHILD );
2966+
2967+ ret = tsk_edge_table_clear (& tables .edges );
2968+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2969+ ret = tsk_edge_table_add_row (& tables .edges , 0.0 , 1.0 , 1 , 2 , NULL , 0 );
2970+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2971+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2972+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_NODE_OUT_OF_BOUNDS );
2973+
2974+ ret = tsk_edge_table_clear (& tables .edges );
2975+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2976+ ret = tsk_edge_table_add_row (& tables .edges , 0.0 , INFINITY , 1 , 0 , NULL , 0 );
2977+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2978+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2979+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_GENOME_COORDS_NONFINITE );
2980+
2981+ ret = tsk_edge_table_clear (& tables .edges );
2982+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2983+ ret = tsk_edge_table_add_row (& tables .edges , -1.0 , 1.0 , 1 , 0 , NULL , 0 );
2984+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2985+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2986+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_LEFT_LESS_ZERO );
2987+
2988+ ret = tsk_edge_table_clear (& tables .edges );
2989+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2990+ ret = tsk_edge_table_add_row (& tables .edges , 0.0 , 1.1 , 1 , 0 , NULL , 0 );
2991+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2992+ ret = tsk_table_collection_check_integrity (& tables , 0 );
2993+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_RIGHT_GREATER_SEQ_LENGTH );
2994+
2995+ ret = tsk_edge_table_clear (& tables .edges );
2996+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2997+ ret = tsk_edge_table_add_row (& tables .edges , 0.5 , 0.1 , 1 , 0 , NULL , 0 );
2998+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
2999+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3000+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_EDGE_INTERVAL );
3001+
3002+ ret = tsk_edge_table_clear (& tables .edges );
3003+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3004+ ret = tsk_edge_table_add_row (& tables .edges , 0.0 , 0.5 , 0 , 1 , NULL , 0 );
3005+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3006+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3007+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_NODE_TIME_ORDERING );
3008+
3009+ ret = tsk_edge_table_clear (& tables .edges );
3010+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3011+
3012+ /* sites */
3013+ ret = tsk_site_table_add_row (& tables .sites , INFINITY , "A" , 1 , NULL , 0 );
3014+ CU_ASSERT_FATAL (ret >= 0 );
3015+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3016+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_SITE_POSITION );
3017+
3018+ ret = tsk_site_table_clear (& tables .sites );
3019+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3020+ ret = tsk_site_table_add_row (& tables .sites , -0.5 , "A" , 1 , NULL , 0 );
3021+ CU_ASSERT_FATAL (ret >= 0 );
3022+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3023+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_SITE_POSITION );
3024+
3025+ ret = tsk_site_table_clear (& tables .sites );
3026+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3027+ ret = tsk_site_table_add_row (& tables .sites , 1.5 , "A" , 1 , NULL , 0 );
3028+ CU_ASSERT_FATAL (ret >= 0 );
3029+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3030+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_SITE_POSITION );
3031+
3032+ ret = tsk_site_table_clear (& tables .sites );
3033+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3034+ ret = tsk_site_table_add_row (& tables .sites , 0.5 , "A" , 1 , NULL , 0 );
3035+ CU_ASSERT_FATAL (ret >= 0 );
3036+ ret = tsk_site_table_add_row (& tables .sites , 0.5 , "A" , 1 , NULL , 0 );
3037+ CU_ASSERT_FATAL (ret >= 0 );
3038+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3039+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3040+ ret = tsk_table_collection_check_integrity (& tables , TSK_CHECK_SITE_DUPLICATES );
3041+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_DUPLICATE_SITE_POSITION );
3042+
3043+ ret = tsk_site_table_clear (& tables .sites );
3044+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3045+ ret = tsk_site_table_add_row (& tables .sites , 0.5 , "A" , 1 , NULL , 0 );
3046+ CU_ASSERT_FATAL (ret >= 0 );
3047+ ret = tsk_site_table_add_row (& tables .sites , 0.4 , "A" , 1 , NULL , 0 );
3048+ CU_ASSERT_FATAL (ret >= 0 );
3049+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3050+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3051+ ret = tsk_table_collection_check_integrity (& tables , TSK_CHECK_SITE_ORDERING );
3052+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_UNSORTED_SITES );
3053+
3054+ ret = tsk_site_table_clear (& tables .sites );
3055+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3056+ ret = tsk_site_table_add_row (& tables .sites , 0.5 , "A" , 1 , NULL , 0 );
3057+ CU_ASSERT_FATAL (ret >= 0 );
3058+ ret = tsk_site_table_add_row (& tables .sites , 0.6 , "A" , 1 , NULL , 0 );
3059+ CU_ASSERT_FATAL (ret >= 0 );
3060+
3061+ /* mutations */
3062+ ret = tsk_mutation_table_add_row (
3063+ & tables .mutations , 2 , 0 , TSK_NULL , NULL , 0 , NULL , 0 );
3064+ CU_ASSERT_FATAL (ret >= 0 );
3065+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3066+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_SITE_OUT_OF_BOUNDS );
3067+
3068+ ret = tsk_mutation_table_clear (& tables .mutations );
3069+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3070+ ret = tsk_mutation_table_add_row (
3071+ & tables .mutations , 0 , 2 , TSK_NULL , NULL , 0 , NULL , 0 );
3072+ CU_ASSERT_FATAL (ret >= 0 );
3073+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3074+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_NODE_OUT_OF_BOUNDS );
3075+
3076+ ret = tsk_mutation_table_clear (& tables .mutations );
3077+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3078+ ret = tsk_mutation_table_add_row (& tables .mutations , 0 , 1 , 2 , NULL , 0 , NULL , 0 );
3079+ CU_ASSERT_FATAL (ret >= 0 );
3080+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3081+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_MUTATION_OUT_OF_BOUNDS );
3082+
3083+ ret = tsk_mutation_table_clear (& tables .mutations );
3084+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3085+ ret = tsk_mutation_table_add_row (& tables .mutations , 0 , 1 , 0 , NULL , 0 , NULL , 0 );
3086+ CU_ASSERT_FATAL (ret >= 0 );
3087+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3088+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_MUTATION_PARENT_EQUAL );
3089+
3090+ ret = tsk_mutation_table_clear (& tables .mutations );
3091+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3092+ ret = tsk_mutation_table_add_row (& tables .mutations , 0 , 1 , 1 , NULL , 0 , NULL , 0 );
3093+ CU_ASSERT_FATAL (ret >= 0 );
3094+ ret = tsk_mutation_table_add_row (
3095+ & tables .mutations , 0 , 1 , TSK_NULL , NULL , 0 , NULL , 0 );
3096+ CU_ASSERT_FATAL (ret >= 0 );
3097+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3098+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3099+ ret = tsk_table_collection_check_integrity (& tables , TSK_CHECK_MUTATION_ORDERING );
3100+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_MUTATION_PARENT_AFTER_CHILD );
3101+ ret = tsk_table_collection_check_integrity (
3102+ & tables , TSK_CHECK_MUTATION_ORDERING | TSK_NO_CHECK_MUTATION_PARENTS );
3103+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3104+
3105+ ret = tsk_mutation_table_clear (& tables .mutations );
3106+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3107+ ret = tsk_mutation_table_add_row (
3108+ & tables .mutations , 0 , 1 , TSK_NULL , NULL , 0 , NULL , 0 );
3109+ CU_ASSERT_FATAL (ret >= 0 );
3110+ ret = tsk_mutation_table_add_row (& tables .mutations , 1 , 1 , 0 , NULL , 0 , NULL , 0 );
3111+ CU_ASSERT_FATAL (ret >= 0 );
3112+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3113+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3114+ ret = tsk_table_collection_check_integrity (& tables , TSK_CHECK_MUTATION_ORDERING );
3115+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_MUTATION_PARENT_DIFFERENT_SITE );
3116+ ret = tsk_table_collection_check_integrity (& tables , TSK_NO_CHECK_MUTATION_PARENTS );
3117+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3118+
3119+ ret = tsk_mutation_table_clear (& tables .mutations );
3120+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3121+ ret = tsk_mutation_table_add_row (
3122+ & tables .mutations , 1 , 1 , TSK_NULL , NULL , 0 , NULL , 0 );
3123+ CU_ASSERT_FATAL (ret >= 0 );
3124+ ret = tsk_mutation_table_add_row (
3125+ & tables .mutations , 0 , 1 , TSK_NULL , NULL , 0 , NULL , 0 );
3126+ CU_ASSERT_FATAL (ret >= 0 );
3127+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3128+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3129+ ret = tsk_table_collection_check_integrity (& tables , TSK_CHECK_MUTATION_ORDERING );
3130+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_UNSORTED_MUTATIONS );
3131+
3132+ ret = tsk_mutation_table_clear (& tables .mutations );
3133+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3134+
3135+ ret = tsk_population_table_add_row (& tables .populations , NULL , 0 );
3136+ CU_ASSERT_FATAL (ret >= 0 );
3137+ ret = tsk_population_table_add_row (& tables .populations , NULL , 0 );
3138+ CU_ASSERT_FATAL (ret >= 0 );
3139+
3140+ /* migrations */
3141+ ret = tsk_migration_table_add_row (
3142+ & tables .migrations , 0.0 , 0.5 , 2 , 0 , 1 , 1.5 , NULL , 0 );
3143+ CU_ASSERT_FATAL (ret >= 0 );
3144+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3145+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_NODE_OUT_OF_BOUNDS );
3146+
3147+ /* migrations */
3148+ ret = tsk_migration_table_clear (& tables .migrations );
3149+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3150+ ret = tsk_migration_table_add_row (
3151+ & tables .migrations , 0.0 , 0.5 , 2 , 0 , 1 , 1.5 , NULL , 0 );
3152+ CU_ASSERT_FATAL (ret >= 0 );
3153+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3154+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_NODE_OUT_OF_BOUNDS );
3155+
3156+ ret = tsk_migration_table_clear (& tables .migrations );
3157+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3158+ ret = tsk_migration_table_add_row (
3159+ & tables .migrations , 0.0 , 0.5 , 1 , 2 , 1 , 1.5 , NULL , 0 );
3160+ CU_ASSERT_FATAL (ret >= 0 );
3161+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3162+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_POPULATION_OUT_OF_BOUNDS );
3163+
3164+ ret = tsk_migration_table_clear (& tables .migrations );
3165+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3166+ ret = tsk_migration_table_add_row (
3167+ & tables .migrations , 0.0 , 0.5 , 1 , 0 , 2 , 1.5 , NULL , 0 );
3168+ CU_ASSERT_FATAL (ret >= 0 );
3169+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3170+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_POPULATION_OUT_OF_BOUNDS );
3171+
3172+ ret = tsk_migration_table_clear (& tables .migrations );
3173+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3174+ ret = tsk_migration_table_add_row (
3175+ & tables .migrations , 0.0 , 0.5 , 1 , 0 , 1 , INFINITY , NULL , 0 );
3176+ CU_ASSERT_FATAL (ret >= 0 );
3177+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3178+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_TIME_NONFINITE );
3179+
3180+ ret = tsk_migration_table_clear (& tables .migrations );
3181+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3182+ ret = tsk_migration_table_add_row (
3183+ & tables .migrations , 0.0 , INFINITY , 1 , 0 , 1 , 1.5 , NULL , 0 );
3184+ CU_ASSERT_FATAL (ret >= 0 );
3185+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3186+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_GENOME_COORDS_NONFINITE );
3187+
3188+ ret = tsk_migration_table_clear (& tables .migrations );
3189+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3190+ ret = tsk_migration_table_add_row (
3191+ & tables .migrations , -0.3 , 0.5 , 1 , 0 , 1 , 1.5 , NULL , 0 );
3192+ CU_ASSERT_FATAL (ret >= 0 );
3193+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3194+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_LEFT_LESS_ZERO );
3195+
3196+ ret = tsk_migration_table_clear (& tables .migrations );
3197+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3198+ ret = tsk_migration_table_add_row (
3199+ & tables .migrations , 0.0 , 1.5 , 1 , 0 , 1 , 1.5 , NULL , 0 );
3200+ CU_ASSERT_FATAL (ret >= 0 );
3201+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3202+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_RIGHT_GREATER_SEQ_LENGTH );
3203+
3204+ ret = tsk_migration_table_clear (& tables .migrations );
3205+ CU_ASSERT_EQUAL_FATAL (ret , 0 );
3206+ ret = tsk_migration_table_add_row (
3207+ & tables .migrations , 0.6 , 0.5 , 1 , 0 , 1 , 1.5 , NULL , 0 );
3208+ CU_ASSERT_FATAL (ret >= 0 );
3209+ ret = tsk_table_collection_check_integrity (& tables , 0 );
3210+ CU_ASSERT_EQUAL_FATAL (ret , TSK_ERR_BAD_EDGE_INTERVAL );
3211+
3212+ tsk_table_collection_free (& tables );
3213+ }
3214+
29013215int
29023216main (int argc , char * * argv )
29033217{
@@ -2941,6 +3255,8 @@ main(int argc, char **argv)
29413255 { "test_load_reindex" , test_load_reindex },
29423256 { "test_table_overflow" , test_table_overflow },
29433257 { "test_column_overflow" , test_column_overflow },
3258+ { "test_table_collection_check_integrity" ,
3259+ test_table_collection_check_integrity },
29443260 { NULL , NULL },
29453261 };
29463262
0 commit comments