def test_Genomic(): """Genomic positions are coordinates incremented by one.""" crossmap = Genomic() invariant( crossmap.coordinate_to_genomic, 0, crossmap.genomic_to_coordinate, 1) invariant( crossmap.coordinate_to_genomic, 98, crossmap.genomic_to_coordinate, 99)
def test_MultiLocus_offsets_odd_inverted(): """Offets exacly between two loci are assigned to the upstream locus.""" multi_locus = MultiLocus([(1, 3), (6, 8)], True) invariant( multi_locus.to_position, 4, multi_locus.to_coordinate, (1, 2, 0)) invariant( multi_locus.to_position, 3, multi_locus.to_coordinate, (2, -1, 0))
def test_MultiLocus_adjacent_loci(): """Positions are continuous when loci are adjacent.""" multi_locus = MultiLocus([(1, 3), (3, 5)]) invariant( multi_locus.to_position, 2, multi_locus.to_coordinate, (1, 0, 0)) invariant( multi_locus.to_position, 3, multi_locus.to_coordinate, (2, 0, 0))
def test_MultiLocus_offsets_even_inverted(): """Offsets are assigned to the nearest locus.""" multi_locus = MultiLocus([(1, 3), (7, 9)], True) invariant( multi_locus.to_position, 5, multi_locus.to_coordinate, (1, 2, 0)) invariant( multi_locus.to_position, 4, multi_locus.to_coordinate, (2, -2, 0))
def test_Coding_no_utr3_inverted(): """A 3' UTR may be missing.""" crossmap = Coding([(10, 20)], (10, 15), True) # Direct transition from CDS to downstream. invariant( crossmap.coordinate_to_coding, 10, crossmap.coding_to_coordinate, (5, 0, 0, 0)) invariant( crossmap.coordinate_to_coding, 9, crossmap.coding_to_coordinate, (5, 1, 0, 1))
def test_Coding_no_utr5_inverted(): """A 5' UTR may be missing.""" crossmap = Coding([(10, 20)], (15, 20), True) # Direct transition from upstream to CDS. invariant( crossmap.coordinate_to_coding, 20, crossmap.coding_to_coordinate, (1, -1, 0, -1)) invariant( crossmap.coordinate_to_coding, 19, crossmap.coding_to_coordinate, (1, 0, 0, 0))
def test_NonCoding_inverted(): """Forward oriented noncoding transcript.""" crossmap = NonCoding(_exons, inverted=True) # Boundary between upstream and transcript. invariant( crossmap.coordinate_to_noncoding, 72, crossmap.noncoding_to_coordinate, (1, -1, -1)) invariant( crossmap.coordinate_to_noncoding, 71, crossmap.noncoding_to_coordinate, (1, 0, 0)) # Boundary between downstream and transcript. invariant( crossmap.coordinate_to_noncoding, 5, crossmap.noncoding_to_coordinate, (22, 0, 0)) invariant( crossmap.coordinate_to_noncoding, 4, crossmap.noncoding_to_coordinate, (22, 1, 1))
def test_Coding_regions_inverted(): """The CDS can start or end on a region boundary.""" crossmap = Coding([(10, 21), (30, 40), (49, 60)], (30, 40), True) # Upstream odd length intron between two regions. invariant( crossmap.coordinate_to_coding, 44, crossmap.coding_to_coordinate, (-1, 5, -1, 0)) invariant( crossmap.coordinate_to_coding, 43, crossmap.coding_to_coordinate, (1, -4, 0, 0)) # Downstream odd length intron between two regions. invariant( crossmap.coordinate_to_coding, 25, crossmap.coding_to_coordinate, (10, 5, 0, 0)) invariant( crossmap.coordinate_to_coding, 24, crossmap.coding_to_coordinate, (1, -4, 1, 0))
def test_Coding(): """Forward oriented coding transcript.""" crossmap = Coding(_exons, _cds) # Boundary between 5' and CDS. invariant( crossmap.coordinate_to_coding, 31, crossmap.coding_to_coordinate, (-1, 0, -1, 0)) invariant( crossmap.coordinate_to_coding, 32, crossmap.coding_to_coordinate, (1, 0, 0, 0)) # Boundary between CDS and 3'. invariant( crossmap.coordinate_to_coding, 42, crossmap.coding_to_coordinate, (6, 0, 0, 0)) invariant( crossmap.coordinate_to_coding, 43, crossmap.coding_to_coordinate, (1, 0, 1, 0))
def test_Coding_small_utr3(): """A 5' UTR may be of lenght one.""" crossmap = Coding([(10, 20)], (15, 19)) # Transition from CDS to 3' UTR to downstream. invariant( crossmap.coordinate_to_coding, 18, crossmap.coding_to_coordinate, (4, 0, 0, 0)) invariant( crossmap.coordinate_to_coding, 19, crossmap.coding_to_coordinate, (1, 0, 1, 0)) invariant( crossmap.coordinate_to_coding, 20, crossmap.coding_to_coordinate, (1, 1, 1, 1))
def test_Coding_small_utr5_inverted(): """A 5' UTR may be of lenght one.""" crossmap = Coding([(10, 20)], (15, 19), True) # Transition from upstream to 5' UTR to CDS. invariant( crossmap.coordinate_to_coding, 20, crossmap.coding_to_coordinate, (-1, -1, -1, -1)) invariant( crossmap.coordinate_to_coding, 19, crossmap.coding_to_coordinate, (-1, 0, -1, 0)) invariant( crossmap.coordinate_to_coding, 18, crossmap.coding_to_coordinate, (1, 0, 0, 0))
def test_Coding_small_utr5(): """A 5' UTR may be of lenght one.""" crossmap = Coding([(10, 20)], (11, 15)) # Transition from upstream to 5' UTR to CDS. invariant( crossmap.coordinate_to_coding, 9, crossmap.coding_to_coordinate, (-1, -1, -1, -1)) invariant( crossmap.coordinate_to_coding, 10, crossmap.coding_to_coordinate, (-1, 0, -1, 0)) invariant( crossmap.coordinate_to_coding, 11, crossmap.coding_to_coordinate, (1, 0, 0, 0))
def test_Coding_small_utr3_inverted(): """A 5' UTR may be of lenght one.""" crossmap = Coding([(10, 20)], (11, 15), True) # Transition from CDS to 3' UTR to downstream. invariant( crossmap.coordinate_to_coding, 11, crossmap.coding_to_coordinate, (4, 0, 0, 0)) invariant( crossmap.coordinate_to_coding, 10, crossmap.coding_to_coordinate, (1, 0, 1, 0)) invariant( crossmap.coordinate_to_coding, 9, crossmap.coding_to_coordinate, (1, 1, 1, 1))
def test_Locus_inverted(): """Reverse orientent Lovus.""" locus = Locus((30, 35), True) invariant(locus.to_position, 35, locus.to_coordinate, (0, -1)) invariant(locus.to_position, 34, locus.to_coordinate, (0, 0)) invariant(locus.to_position, 33, locus.to_coordinate, (1, 0)) invariant(locus.to_position, 31, locus.to_coordinate, (3, 0)) invariant(locus.to_position, 30, locus.to_coordinate, (4, 0)) invariant(locus.to_position, 29, locus.to_coordinate, (4, 1))
def test_Locus(): """Forward orientent Lovus.""" locus = Locus((30, 35)) invariant(locus.to_position, 29, locus.to_coordinate, (0, -1)) invariant(locus.to_position, 30, locus.to_coordinate, (0, 0)) invariant(locus.to_position, 31, locus.to_coordinate, (1, 0)) invariant(locus.to_position, 33, locus.to_coordinate, (3, 0)) invariant(locus.to_position, 34, locus.to_coordinate, (4, 0)) invariant(locus.to_position, 35, locus.to_coordinate, (4, 1))
def test_MultiLocus_inverted(): """Reverse oriented MultiLocus.""" multi_locus = MultiLocus(_locations, True) # Boundary between upstream and the first locus. invariant( multi_locus.to_position, 72, multi_locus.to_coordinate, (0, -1, -1)) invariant( multi_locus.to_position, 71, multi_locus.to_coordinate, (0, 0, 0)) # Internal locus. invariant( multi_locus.to_position, 35, multi_locus.to_coordinate, (8, -1, 0)) invariant( multi_locus.to_position, 34, multi_locus.to_coordinate, (8, 0, 0)) invariant( multi_locus.to_position, 33, multi_locus.to_coordinate, (9, 0, 0)) invariant( multi_locus.to_position, 31, multi_locus.to_coordinate, (11, 0, 0)) invariant( multi_locus.to_position, 30, multi_locus.to_coordinate, (12, 0, 0)) invariant( multi_locus.to_position, 29, multi_locus.to_coordinate, (12, 1, 0)) # Boundary between the last locus and downstream. invariant( multi_locus.to_position, 5, multi_locus.to_coordinate, (21, 0, 0)) invariant( multi_locus.to_position, 4, multi_locus.to_coordinate, (21, 1, 1))
def test_Coding_protein(): """Protein positions.""" crossmap = Coding(_exons, _cds) # Boundary between 5' UTR and CDS. invariant( crossmap.coordinate_to_protein, 31, crossmap.protein_to_coordinate, (-1, 3, 0, -1, 0)) invariant( crossmap.coordinate_to_protein, 32, crossmap.protein_to_coordinate, (1, 1, 0, 0, 0)) # Intron boundary. invariant( crossmap.coordinate_to_protein, 34, crossmap.protein_to_coordinate, (1, 3, 0, 0, 0)) invariant( crossmap.coordinate_to_protein, 35, crossmap.protein_to_coordinate, (1, 3, 1, 0, 0)) # Boundary between CDS and 3' UTR. invariant( crossmap.coordinate_to_protein, 42, crossmap.protein_to_coordinate, (2, 3, 0, 0, 0)) invariant( crossmap.coordinate_to_protein, 43, crossmap.protein_to_coordinate, (1, 1, 0, 1, 0))