Skip to content

Commit ae64434

Browse files
committed
Add initial test, fix ragged lengths
1 parent f0fb42c commit ae64434

File tree

2 files changed

+88
-5
lines changed

2 files changed

+88
-5
lines changed

c/tests/test_tables.c

+82
Original file line numberDiff line numberDiff line change
@@ -4049,6 +4049,87 @@ test_individual_table(void)
40494049
free(metadata_offset);
40504050
}
40514051

4052+
static void
4053+
test_individual_table_takeset(void)
4054+
{
4055+
int ret = 0;
4056+
tsk_id_t ret_id;
4057+
tsk_individual_table_t source_table, table;
4058+
tsk_size_t num_rows = 100;
4059+
tsk_id_t j;
4060+
tsk_size_t k;
4061+
tsk_flags_t *flags;
4062+
double *location;
4063+
tsk_id_t *parents;
4064+
char *metadata;
4065+
tsk_size_t *metadata_offset;
4066+
tsk_size_t *parents_offset;
4067+
tsk_size_t *location_offset;
4068+
tsk_size_t spatial_dimension = 2;
4069+
tsk_size_t num_parents = 3;
4070+
const char *test_metadata = "test";
4071+
tsk_size_t test_metadata_length = 4;
4072+
double test_location[spatial_dimension];
4073+
tsk_id_t test_parents[num_parents];
4074+
4075+
/* Make a table to copy from */
4076+
ret = tsk_individual_table_init(&source_table, 0);
4077+
CU_ASSERT_EQUAL_FATAL(ret, 0);
4078+
for (k = 0; k < spatial_dimension; k++) {
4079+
test_location[k] = (double) k;
4080+
}
4081+
for (k = 0; k < num_parents; k++) {
4082+
test_parents[k] = (tsk_id_t) k + 42;
4083+
}
4084+
for (j = 0; j < (tsk_id_t) num_rows; j++) {
4085+
ret_id = tsk_individual_table_add_row(&source_table, (tsk_flags_t) j,
4086+
test_location, spatial_dimension, test_parents, num_parents, test_metadata,
4087+
test_metadata_length);
4088+
CU_ASSERT_EQUAL_FATAL(ret_id, j);
4089+
}
4090+
4091+
/* Prepare arrays to be taken */
4092+
flags = tsk_malloc(num_rows * sizeof(tsk_flags_t));
4093+
CU_ASSERT_FATAL(flags != NULL);
4094+
tsk_memcpy(flags, source_table.flags, num_rows * sizeof(tsk_flags_t));
4095+
location = tsk_malloc(spatial_dimension * num_rows * sizeof(double));
4096+
CU_ASSERT_FATAL(location != NULL);
4097+
tsk_memcpy(
4098+
location, source_table.location, spatial_dimension * num_rows * sizeof(double));
4099+
location_offset = tsk_malloc((num_rows + 1) * sizeof(tsk_size_t));
4100+
CU_ASSERT_FATAL(location_offset != NULL);
4101+
tsk_memcpy(location_offset, source_table.location_offset,
4102+
(num_rows + 1) * sizeof(tsk_size_t));
4103+
parents = tsk_malloc(num_parents * num_rows * sizeof(tsk_id_t));
4104+
CU_ASSERT_FATAL(parents != NULL);
4105+
tsk_memcpy(parents, source_table.parents, num_parents * num_rows * sizeof(tsk_id_t));
4106+
parents_offset = tsk_malloc((num_rows + 1) * sizeof(tsk_size_t));
4107+
CU_ASSERT_FATAL(parents_offset != NULL);
4108+
tsk_memcpy(parents_offset, source_table.parents_offset,
4109+
(num_rows + 1) * sizeof(tsk_size_t));
4110+
metadata = tsk_malloc(num_rows * test_metadata_length * sizeof(char));
4111+
CU_ASSERT_FATAL(metadata != NULL);
4112+
tsk_memcpy(
4113+
metadata, source_table.metadata, num_rows * test_metadata_length * sizeof(char));
4114+
metadata_offset = tsk_malloc((num_rows + 1) * sizeof(tsk_size_t));
4115+
CU_ASSERT_FATAL(metadata_offset != NULL);
4116+
tsk_memcpy(metadata_offset, source_table.metadata_offset,
4117+
(num_rows + 1) * sizeof(tsk_size_t));
4118+
4119+
ret = tsk_individual_table_init(&table, 0);
4120+
CU_ASSERT_EQUAL_FATAL(ret, 0);
4121+
4122+
ret = tsk_individual_table_takeset_columns(&table, num_rows, flags, location,
4123+
location_offset, parents, parents_offset, metadata, metadata_offset);
4124+
CU_ASSERT_EQUAL_FATAL(ret, 0);
4125+
CU_ASSERT_TRUE(tsk_individual_table_equals(&source_table, &table, 0));
4126+
4127+
ret = tsk_individual_table_free(&table);
4128+
CU_ASSERT_EQUAL(ret, 0);
4129+
ret = tsk_individual_table_free(&source_table);
4130+
CU_ASSERT_EQUAL(ret, 0);
4131+
}
4132+
40524133
static void
40534134
test_individual_table_update_row(void)
40544135
{
@@ -9235,6 +9316,7 @@ main(int argc, char **argv)
92359316
{ "test_migration_table", test_migration_table },
92369317
{ "test_migration_table_update_row", test_migration_table_update_row },
92379318
{ "test_individual_table", test_individual_table },
9319+
{ "test_individual_table_takeset", test_individual_table_takeset },
92389320
{ "test_individual_table_update_row", test_individual_table_update_row },
92399321
{ "test_population_table", test_population_table },
92409322
{ "test_population_table_update_row", test_population_table_update_row },

c/tskit/tables.c

+6-5
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ alloc_empty_ragged_column(tsk_size_t num_rows, void **data_col, tsk_size_t **off
643643

644644
static int
645645
takeset_ragged_column(tsk_size_t num_rows, void *data, tsk_size_t *offset,
646-
void **data_dest, tsk_size_t **offset_dest)
646+
void **data_dest, tsk_size_t **offset_dest, tsk_size_t *length_dest)
647647
{
648648
int ret = 0;
649649

@@ -664,6 +664,7 @@ takeset_ragged_column(tsk_size_t num_rows, void *data, tsk_size_t *offset,
664664
*data_dest = data;
665665
*offset_dest = offset;
666666
}
667+
*length_dest = (*offset_dest)[num_rows];
667668
out:
668669
return ret;
669670
}
@@ -1087,17 +1088,17 @@ tsk_individual_table_takeset_columns(tsk_individual_table_t *self, tsk_size_t nu
10871088
}
10881089

10891090
ret = takeset_ragged_column(num_rows, location, location_offset,
1090-
(void *) &self->location, &self->location_offset);
1091+
(void *) &self->location, &self->location_offset, &self->location_length);
10911092
if (ret != 0) {
10921093
goto out;
10931094
}
10941095
ret = takeset_ragged_column(num_rows, parents, parents_offset,
1095-
(void *) &self->parents, &self->parents_offset);
1096+
(void *) &self->parents, &self->parents_offset, &self->parents_length);
10961097
if (ret != 0) {
10971098
goto out;
10981099
}
10991100
ret = takeset_ragged_column(num_rows, metadata, metadata_offset,
1100-
(void *) &self->metadata, &self->metadata_offset);
1101+
(void *) &self->metadata, &self->metadata_offset, &self->metadata_length);
11011102
if (ret != 0) {
11021103
goto out;
11031104
}
@@ -1837,7 +1838,7 @@ tsk_node_table_takeset_columns(tsk_node_table_t *self, tsk_size_t num_rows,
18371838
goto out;
18381839
}
18391840
ret = takeset_ragged_column(num_rows, metadata, metadata_offset,
1840-
(void *) &self->metadata, &self->metadata_offset);
1841+
(void *) &self->metadata, &self->metadata_offset, &self->metadata_length);
18411842
if (ret != 0) {
18421843
goto out;
18431844
}

0 commit comments

Comments
 (0)