Source code for alleleTools.tests.test_allele

import pytest

from typing import List

from ..allele import Allele, AlleleMatchStatus, FieldTree, AlleleParser


[docs] def build_allele_tree(gene: str, alleles: List[Allele]) -> FieldTree: """ Build a FieldTree representing the structure of allele fields for a given gene. Args: gene (str): The gene name to use as the root of the tree. alleles (List[Allele]): List of Allele objects to add to the tree. Returns: FieldTree: The root of the constructed field tree. Example: >>> build_allele_tree('A', [Allele('A*01:01'), Allele('A*01:02')]) Field(A:0)[Field(01:2)[Field(01:1), Field(02:1)]] """ root = FieldTree(gene) for allele in alleles: root.add(allele.fields) return root
[docs] class TestAlleleParser:
[docs] def test_default_parser(self): parser = AlleleParser(gene_family="hla") assert "hla" in parser.config assert "kir" in parser.config assert "hla_hisat" in parser.config assert "hla_delimited" in parser.config
[docs] def test_hla_parsing(self): parser = AlleleParser(gene_family="hla") allele_str = "A*02:01:01:01 (high confidence)" allele = parser.parse(allele_str) print(allele) assert allele.gene == "A" assert allele.fields == ["02", "01", "01", "01"]
[docs] def test_hla_hisat_parsing(self): parser = AlleleParser(gene_family="hla_hisat") allele_str = "A*02:01:01:01 (0.5)" allele = parser.parse(allele_str) print(allele) assert allele.gene == "A" assert allele.fields == ["02", "01", "01", "01"] assert allele.confidence == 0.5
[docs] def test_delimited_parsing(self): parser = AlleleParser(gene_family="hla_delimited") allele_str = "A*02:01:01:01" allele = parser.parse(allele_str) print(allele) assert allele.gene == "A" assert allele.fields == ["02", "01", "01", "01"]
[docs] def test_wrong_parser(self): # check that the exception is raised with pytest.raises(Exception): parser = AlleleParser(gene_family="wrong_parser") allele_str = "InvalidAlleleString" parser.parse(allele_str)
[docs] class TestHlaAllele: parser = AlleleParser(gene_family="hla")
[docs] def test_comparison_results(self): a1 = self.parser.parse("A*02:01") a2 = self.parser.parse("A*02:01:01:01") assert a1.compare(a2) == AlleleMatchStatus.MORE_RESOLUTION assert a2.compare(a1) == AlleleMatchStatus.LESS_RESOLUTION assert a1.compare(a1) == AlleleMatchStatus.EQUAL a3 = self.parser.parse("B*02:01:01:01") assert a1.compare(a3) == AlleleMatchStatus.NOT_EQUAL
[docs] def test_allele_parsing(self): a1 = self.parser.parse("A*02:01") assert str(a1) == "A*02:01" a1 = self.parser.parse("A*02") assert str(a1) == "A*02"
[docs] class TestKirAllele:
[docs] @pytest.mark.parametrize("allele_str", [ "KIR2DL1*00302", "KIR3DS1*013", "KIR2DL4*000" ]) def test_allele_parsing(self, allele_str): parser = AlleleParser(gene_family="kir") a1 = parser.parse(allele_str) assert isinstance(a1, Allele) assert str(a1) == allele_str
[docs] class TestFieldTree:
[docs] def parse_alleles(self, alleles: list) -> list: parser = AlleleParser(gene_family="hla") return [parser.parse(a) for a in alleles]
[docs] def test_one_allele(self): alleles = ["A*01"] alleles = self.parse_alleles(alleles) tree = build_allele_tree("A", alleles) assert tree.support == 1
[docs] def test_1allele_1field(self): alleles = ["A*01"] alleles = self.parse_alleles(alleles) tree = build_allele_tree("A", alleles) assert tree.children[0].field == "01"
[docs] def test_1allele_2fields(self): alleles = ["A*01:02"] alleles = self.parse_alleles(alleles) tree = build_allele_tree("A", alleles) assert tree.children[0].children[0].field == "02"
[docs] def test_1allele_3fields(self): alleles = ["A*01:02:03"] alleles = self.parse_alleles(alleles) tree = build_allele_tree("A", alleles) assert tree.children[0].children[0].children[0].field == "03"
[docs] def test_1allele_4fields(self): alleles = ["A*01:02:03:04"] alleles = self.parse_alleles(alleles) tree = build_allele_tree("A", alleles) assert tree.children[0].children[0].children[0].children[0].field == "04"
[docs] def test_allele_counting_fist_level(self): alleles = ["A*01:02", "A*01:02"] alleles = self.parse_alleles(alleles) tree = build_allele_tree("A", alleles) assert tree.support == 2
[docs] def test_allele_counting_second_level(self): alleles = ["A*01:02", "A*01:02", "A*02:03"] alleles = self.parse_alleles(alleles) tree = build_allele_tree("A", alleles) assert tree.children[0].support == 2
[docs] def test_allele_counting_second_level_minor_allele(self): alleles = ["A*01:02", "A*01:02", "A*02:03"] alleles = self.parse_alleles(alleles) tree = build_allele_tree("A", alleles) assert tree.children[1].support == 1
[docs] def test_allele_support_homozygous(self): alleles = ['DPA1*01:03:01', 'DPA1*01:03:01:04', 'DPA1*01:03:01:04'] alleles = self.parse_alleles(alleles) tree = build_allele_tree("DPA1", alleles) alleles, support = tree.get_consensus(0.6) assert alleles == ["DPA1*01:03:01:04", "DPA1*01:03:01:04"]