예제 #1
0
    def test_raises_if_first_kmer_cannot_be_connected_to_second_kmer(self):
        # given
        builder = EmptyKmerBuilder(1)
        kmer1 = builder.build_or_get('AAA')
        kmer2 = builder.build_or_get('ACC')

        # when/then
        with pytest.raises(ValueError):
            connect_kmers(kmer1, kmer2, 0)
예제 #2
0
    def test_raises_if_equal_kmers_are_not_the_same_object(self):
        # given
        kmer1 = EmptyKmerBuilder(1).build_or_get('AAA')
        kmer2 = EmptyKmerBuilder(1).build_or_get('AAA')
        assert kmer1 is not kmer2

        # when/then
        with pytest.raises(ValueError):
            connect_kmers(kmer1, kmer2, 0)
예제 #3
0
    def test_connects_kmer_to_itself(self):
        # given
        kmer = EmptyKmerBuilder(1).build_or_get('AAA')

        # when
        connect_kmers(kmer, kmer, 0)

        # then
        assert kmer.edges[0].is_edge('a')
        assert kmer.edges[0].is_edge('A')
예제 #4
0
    def test_connects_kmer_to_itself_for_one_sided_connection(self):
        # given
        kmer = EmptyKmerBuilder(1).build_or_get('TAA')

        # when
        connect_kmers(kmer, kmer, 0)

        # then
        assert kmer.edges[0].is_edge('t')
        for letter in 'acgACGT':
            assert not kmer.edges[0].is_edge(letter)
예제 #5
0
    def test_works_on_edit_distance_one_forward_in_any_order(
            self, data, letter, num_colors, add_letter_to_end,
            add_letter_to_revcomp):
        # given
        builder = EmptyKmerBuilder(num_colors)
        kmer1 = builder.build_or_get(data.draw(kmer_strings()))
        assert kmer1.kmer < reverse_complement(kmer1.kmer)

        if add_letter_to_revcomp:
            kmer1_string = reverse_complement(kmer1.kmer)
        else:
            kmer1_string = kmer1.kmer

        if add_letter_to_end:
            kmer2_string = kmer1_string[1:] + letter
        else:
            kmer2_string = letter + kmer1_string[:-1]

        kmer2 = builder.build_or_get(kmer2_string)

        if add_letter_to_revcomp:
            kmer1_edge_letter = reverse_complement(letter)
        else:
            kmer1_edge_letter = letter.lower()

        if add_letter_to_end:
            kmer1_edge_letter = kmer1_edge_letter.swapcase()
            kmer2_edge_letter = kmer1_string[0].lower()
        else:
            kmer2_edge_letter = kmer1_string[-1]

        if reverse_complement(kmer2_string) < kmer2_string:
            kmer2_edge_letter = reverse_complement(
                kmer2_edge_letter).swapcase()

        for color in range(num_colors):
            # when
            connect_kmers(kmer1, kmer2, color)

            # then
            assert kmer1.edges[color].is_edge(kmer1_edge_letter)
            assert kmer2.edges[color].is_edge(kmer2_edge_letter)

            # let's also test connected check
            if not add_letter_to_revcomp == add_letter_to_end:
                assert kmer1.has_outgoing_edge_to_kmer_in_color(kmer2, color)
            else:
                assert kmer1.has_incoming_edge_from_kmer_in_color(kmer2, color)

            # and let's check disconnect kmers
            disconnect_kmers(kmer1, kmer2, [color])
            assert not kmer1.edges[color].is_edge(kmer1_edge_letter)
            assert not kmer2.edges[color].is_edge(kmer2_edge_letter)
예제 #6
0
    def test_aag_act_connection(self):
        # given
        builder = EmptyKmerBuilder(1)
        kmer1 = builder.build_or_get('AAG')
        kmer2 = builder.build_or_get('ACT')

        # when
        connect_kmers(kmer1, kmer2, 0)

        # then
        assert kmer1.edges[0].is_edge('T')
        assert kmer2.edges[0].is_edge('T')