"""Tests gn3.db.genotypes"""
from unittest import TestCase
import pytest
from gn3.db.genotypes import (
parse_genotype_file,
parse_genotype_labels,
parse_genotype_header,
parse_genotype_marker,
build_genotype_chromosomes)
class TestGenotypes(TestCase):
"""Tests for functions in `gn3.db.genotypes`."""
@pytest.mark.unit_test
def test_parse_genotype_labels(self):
"""Test that the genotype labels are parsed correctly."""
self.assertEqual(
parse_genotype_labels([
"@name: test_group\t", "@filler: test_filler ",
"@type:test_type", "@mat:test_mat \t", "@pat:test_pat ",
"@het: test_het ", "@unk: test_unk", "@other: test_other",
"@brrr: test_brrr "]),
(("group", "test_group"), ("filler", "test_filler"),
("type", "test_type"), ("mat", "test_mat"), ("pat", "test_pat"),
("het", "test_het"), ("unk", "test_unk")))
@pytest.mark.unit_test
def test_parse_genotype_header(self):
"""Test that the genotype header is parsed correctly."""
for header, expected in [
[("Chr\tLocus\tcM\tMb\tBXD1\tBXD2\tBXD5\tBXD6\tBXD8\tBXD9\t"
"BXD11\tBXD12\tBXD13\tBXD14\tBXD15\tBXD16\tBXD18\tBXD19"),
(("Mbmap", True), ("cm_column", 2), ("mb_column", 3),
("prgy",
("BXD1", "BXD2", "BXD5", "BXD6", "BXD8", "BXD9", "BXD11",
"BXD12", "BXD13", "BXD14", "BXD15", "BXD16", "BXD18",
"BXD19")),
("nprgy", 14))],
[("Chr\tLocus\tcM\tBXD1\tBXD2\tBXD5\tBXD6\tBXD8\tBXD9\tBXD11"
"\tBXD12\tBXD13\tBXD14\tBXD15\tBXD16\tBXD18"),
(("Mbmap", False), ("cm_column", 2), ("mb_column", None),
("prgy",
("BXD1", "BXD2", "BXD5", "BXD6", "BXD8", "BXD9", "BXD11",
"BXD12", "BXD13", "BXD14", "BXD15", "BXD16", "BXD18")),
("nprgy", 13))]]:
with self.subTest(header=header):
self.assertEqual(parse_genotype_header(header), expected)
@pytest.mark.unit_test
def test_parse_genotype_data_line(self):
"""Test parsing of data lines."""
for line, geno_obj, parlist, expected in [
["1\trs31443144\t1.50\t3.010274\tB\tB\tD\tD\tD\tB\tB\tD\tB\tB",
{"mat": "test_mat", "pat": "test_pat", "het": "test_het",
"unk": "test_unk", "cm_column": 2, "Mbmap": True,
"mb_column": 3},
tuple(),
(("chr", "1"), ("name", "rs31443144"), ("cM", 2.0),
("Mb", 3.0),
("genotype",
("U", "U", "U", "U", "U", "U", "U", "U", "U", "U")))],
["1\trs31443144\t1.50\t3.010274\tB\tB\tD\tD\tD\tB\tB\tD\tB\tB",
{"mat": "test_mat", "pat": "test_pat", "het": "test_het",
"unk": "test_unk", "cm_column": 2, "Mbmap": True,
"mb_column": 3},
("some", "parlist", "content"),
(("chr", "1"), ("name", "rs31443144"), ("cM", 2.0),
("Mb", 3.0),
("genotype",
(-1, 1, "U", "U", "U", "U", "U", "U", "U", "U")))],
["1\trs31443144\t1.50\t3.010274\tB\tB\tD\tH\tD\tB\tU\tD\tB\tB",
{"mat": "B", "pat": "D", "het": "H", "unk": "U",
"cm_column": 2, "Mbmap": True, "mb_column": 3},
tuple(),
(("chr", "1"), ("name", "rs31443144"), ("cM", 2.0),
("Mb", 3.0),
("genotype", (-1, -1, 1, 0, 1, -1, "U", 1, -1, -1)))]]:
with self.subTest(line=line):
self.assertEqual(
parse_genotype_marker(line, geno_obj, parlist),
expected)
@pytest.mark.unit_test
def test_build_genotype_chromosomes(self):
"""
Given `markers` and `geno_obj`, test that `build_genotype_chromosomes`
builds a sequence of chromosomes with the given markers ordered
according to the `chr` value."""
for markers, geno_obj, expected in [
[[(("chr", "1"), ("name", "rs31443144"), ("cM", 2.0),
("Mb", 3.0),
("genotype", (-1, -1, 1, 0, 1, -1, "U", 1, -1, -1))),
(("chr", "2"), ("name", "rs31443144"), ("cM", 2.0),
("Mb", 3.0),
("genotype", (-1, -1, 1, 0, 1, -1, "U", 1, -1, -1)))],
{"mat": "B", "pat": "D", "het": "H", "unk": "U",
"cm_column": 2, "Mbmap": True, "mb_column": 3},
((("name", "1"), ("mb_exists", True), ("cm_column", 2),
("mb_column", 3),
("loci",
({"chr": "1", "name": "rs31443144", "cM": 2.0, "Mb": 3.0,
"genotype": (-1, -1, 1, 0, 1, -1, "U", 1, -1, -1)},))),
(("name", "2"), ("mb_exists", True), ("cm_column", 2),
("mb_column", 3),
("loci",
({"chr": "2", "name": "rs31443144", "cM": 2.0, "Mb": 3.0,
"genotype": (-1, -1, 1, 0, 1, -1, "U", 1, -1, -1)},))))],
[[(("chr", "1"), ("name", "rs31443144"), ("cM", 2.0),
("Mb", None),
("genotype", (-1, 1, 1, 0, 1, -1, "U", 1, -1, -1)))],
{"mat": "B", "pat": "D", "het": "H", "unk": "U",
"cm_column": 2, "Mbmap": False, "mb_column": None},
((("name", "1"), ("mb_exists", False), ("cm_column", 2),
("mb_column", None),
("loci",
({"chr": "1", "name": "rs31443144", "cM": 2.0, "Mb": None,
"genotype": (-1, 1, 1, 0, 1, -1, "U", 1, -1, -1)},))),)]]:
with self.subTest(markers=markers):
self.assertEqual(
build_genotype_chromosomes(geno_obj, markers),
expected)
@pytest.mark.unit_test
def test_parse_genotype_file(self):
"""Test the parsing of genotype files. """
self.assertEqual(
parse_genotype_file(
"tests/unit/db/data/genotypes/genotype_sample1.geno"),
{"group": "BXD",
"type": "riset",
"mat": "B",
"pat": "D",
"het": "H",
"unk": "U",
"Mbmap": True,
"cm_column": 2,
"mb_column": 3,
"prgy": ("BXD1", "BXD2", "BXD5", "BXD6", "BXD8", "BXD9"),
"nprgy": 6,
"chromosomes": (
{"name": "1",
"mb_exists": True,
"cm_column": 2,
"mb_column": 3,
"loci": (
{"chr": "1",
"name": "rs31443144",
"cM": 2.0,
"Mb": 3.0,
"genotype": (-1, -1, 1, 1, 1, -1)
},
{"chr": "1",
"name": "rs6269442",
"cM": 2.0,
"Mb": 3.0,
"genotype": (-1, -1, 1, 1, 0, "U")},
{"chr": "1",
"name": "rs32285189",
"cM": 2.0,
"Mb": 3.0,
"genotype": (-1, "U", 1, 1, 1, -1)})},
{"name": "2",
"mb_exists": True,
"cm_column": 2,
"mb_column": 3,
"loci": (
{"chr": "2",
"name": "rs31443144",
"cM": 2.0,
"Mb": 3.0,
"genotype": (-1, -1, 1, 1, 1, -1)},
{"chr": "2",
"name": "rs6269442",
"cM": 2.0,
"Mb": 3.0,
"genotype": (-1, -1, 1, 1, 0, "U")})})})