aboutsummaryrefslogtreecommitdiff
"""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")})})})