Skip to content

Commit 9c46c51

Browse files
committed
More tests for C side
1 parent 970e0b0 commit 9c46c51

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

c/tests/test_genotypes.c

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1367,6 +1367,64 @@ test_alignments_discrete_genome_required(void)
13671367
tsk_treeseq_free(&ts);
13681368
}
13691369

1370+
static void
1371+
test_alignments_null_reference(void)
1372+
{
1373+
int ret = 0;
1374+
tsk_treeseq_t ts;
1375+
const tsk_id_t *samples;
1376+
tsk_size_t n;
1377+
char buf[10];
1378+
1379+
build_balanced_three_example_align(&ts);
1380+
samples = tsk_treeseq_get_samples(&ts);
1381+
n = tsk_treeseq_get_num_samples(&ts);
1382+
1383+
ret = tsk_treeseq_decode_alignments(&ts, NULL, 10, samples, n, 0, 10, 'N', buf, 0);
1384+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_PARAM_VALUE);
1385+
tsk_treeseq_free(&ts);
1386+
}
1387+
1388+
static void
1389+
test_alignments_null_nodes_or_buf(void)
1390+
{
1391+
int ret = 0;
1392+
tsk_treeseq_t ts;
1393+
const char *ref = "NNNNNNNNNN";
1394+
const tsk_id_t *samples;
1395+
tsk_size_t n;
1396+
char buf[30];
1397+
1398+
build_balanced_three_example_align(&ts);
1399+
samples = tsk_treeseq_get_samples(&ts);
1400+
n = tsk_treeseq_get_num_samples(&ts);
1401+
1402+
ret = tsk_treeseq_decode_alignments(&ts, ref, 10, NULL, n, 0, 10, 'N', buf, 0);
1403+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_PARAM_VALUE);
1404+
1405+
ret = tsk_treeseq_decode_alignments(&ts, ref, 10, samples, n, 0, 10, 'N', NULL, 0);
1406+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_BAD_PARAM_VALUE);
1407+
1408+
tsk_treeseq_free(&ts);
1409+
}
1410+
1411+
static void
1412+
test_alignments_node_out_of_bounds(void)
1413+
{
1414+
int ret = 0;
1415+
tsk_treeseq_t ts;
1416+
const char *ref = "NNNNNNNNNN";
1417+
tsk_id_t bad_node;
1418+
char buf[10];
1419+
1420+
build_balanced_three_example_align(&ts);
1421+
bad_node = (tsk_id_t) tsk_treeseq_get_num_nodes(&ts);
1422+
1423+
ret = tsk_treeseq_decode_alignments(&ts, ref, 10, &bad_node, 1, 0, 10, 'N', buf, 0);
1424+
CU_ASSERT_EQUAL_FATAL(ret, TSK_ERR_NODE_OUT_OF_BOUNDS);
1425+
tsk_treeseq_free(&ts);
1426+
}
1427+
13701428
static void
13711429
test_alignments_isolated_as_not_missing(void)
13721430
{
@@ -1612,6 +1670,9 @@ main(int argc, char **argv)
16121670
{ "test_alignments_non_integer_bounds", test_alignments_non_integer_bounds },
16131671
{ "test_alignments_discrete_genome_required",
16141672
test_alignments_discrete_genome_required },
1673+
{ "test_alignments_null_reference", test_alignments_null_reference },
1674+
{ "test_alignments_null_nodes_or_buf", test_alignments_null_nodes_or_buf },
1675+
{ "test_alignments_node_out_of_bounds", test_alignments_node_out_of_bounds },
16151676
{ "test_alignments_missing_char_collision",
16161677
test_alignments_missing_char_collision },
16171678
{ "test_alignments_zero_nodes_ok", test_alignments_zero_nodes_ok },

python/tests/test_lowlevel.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3348,6 +3348,61 @@ def test_missing_char_validation(self):
33483348
with pytest.raises(TypeError, match="single character"):
33493349
ts.decode_alignments(ref, nodes, 0, ts.get_sequence_length(), "NN", True)
33503350

3351+
def test_argument_parsing_error(self):
3352+
ts = self.get_simple_example()
3353+
ref = b"NNNNNNNNNN"
3354+
nodes = np.array(ts.get_samples(), dtype=np.int32)
3355+
# left must be a float-like value
3356+
with pytest.raises(TypeError):
3357+
ts.decode_alignments(
3358+
ref, nodes, "bad_left", ts.get_sequence_length(), "N", True
3359+
)
3360+
3361+
def test_reference_sequence_type_validation(self):
3362+
ts = self.get_simple_example()
3363+
ref = "NNNNNNNNNN"
3364+
nodes = np.array(ts.get_samples(), dtype=np.int32)
3365+
with pytest.raises(TypeError, match="must be bytes"):
3366+
ts.decode_alignments(ref, nodes, 0, ts.get_sequence_length(), "N", True)
3367+
3368+
def test_missing_char_type_validation(self):
3369+
ts = self.get_simple_example()
3370+
ref = b"NNNNNNNNNN"
3371+
nodes = np.array(ts.get_samples(), dtype=np.int32)
3372+
with pytest.raises(TypeError, match="length 1"):
3373+
ts.decode_alignments(ref, nodes, 0, ts.get_sequence_length(), b"N", True)
3374+
3375+
def test_missing_char_unicode_error(self):
3376+
ts = self.get_simple_example()
3377+
ref = b"NNNNNNNNNN"
3378+
nodes = np.array(ts.get_samples(), dtype=np.int32)
3379+
with pytest.raises(UnicodeEncodeError):
3380+
ts.decode_alignments(
3381+
ref,
3382+
nodes,
3383+
0,
3384+
ts.get_sequence_length(),
3385+
NON_UTF8_STRING,
3386+
True,
3387+
)
3388+
3389+
def test_isolated_as_missing_flag_false(self):
3390+
ts = self.get_simple_example()
3391+
ref = b"NNNNNNNNNN"
3392+
nodes = np.array(ts.get_samples(), dtype=np.int32)
3393+
buf = ts.decode_alignments(
3394+
ref,
3395+
nodes,
3396+
0,
3397+
ts.get_sequence_length(),
3398+
"N",
3399+
False,
3400+
)
3401+
assert isinstance(buf, (bytes, bytearray))
3402+
L = int(ts.get_sequence_length())
3403+
rows = [buf[i * L : (i + 1) * L].decode("ascii") for i in range(nodes.shape[0])]
3404+
assert rows == ["NNGNNNNNNT", "NNANNNNNNC", "NNANNNNNNC"]
3405+
33513406
def test_length_and_interval_validation(self):
33523407
ts = self.get_simple_example()
33533408
nodes = np.array(ts.get_samples(), dtype=np.int32)

0 commit comments

Comments
 (0)