Example #1
0
 def test_connected_components(self):
     '''test connected_components'''
     self.assertListEqual([['c1'], ['c2'], ['c3'], ['c4'], ['c5'], ['c6']], self.g.connected_components())
     self.g.add_edge(edge.Edge('c1', 42, 1, 'c2', 1, 10))
     self.assertListEqual([['c1', 'c2'], ['c3'], ['c4'], ['c5'], ['c6']], self.g.connected_components())
     self.g.add_edge(edge.Edge('c3', 42, 1, 'c2', 1, 10))
     self.assertListEqual([['c1', 'c2', 'c3'], ['c4'], ['c5'], ['c6']], self.g.connected_components())
Example #2
0
    def to_graph_edge(self, min_overlap_length=200, end_tolerance=50, min_identity=99):
        if self.percent_identity < min_identity or min(self.hit_length_qry, self.hit_length_ref) < min_overlap_length:
            return None
        ref_at_ends = self._is_at_ends(tolerance=end_tolerance)
        qry_at_ends = self._is_at_ends(use_qry=True, tolerance=end_tolerance)
        bad_values = set([HIT_NO_ENDS, HIT_AT_BOTH_ENDS])
        if ref_at_ends in bad_values or qry_at_ends in bad_values:
            return None

        good_values = set([HIT_AT_START, HIT_AT_END])
        assert qry_at_ends in good_values
        assert ref_at_ends in good_values
        qry_fwd_strand = self.qry_start < self.qry_end
        ref_fwd_strand = self.ref_start < self.ref_end

        if ((qry_fwd_strand == ref_fwd_strand) == (qry_at_ends == ref_at_ends)):
            return None
        elif qry_fwd_strand:
            if ref_fwd_strand:
                if qry_at_ends == HIT_AT_END:
                    assert ref_at_ends == HIT_AT_START
                    qry_first = True
                elif qry_at_ends == HIT_AT_START:
                    assert ref_at_ends == HIT_AT_END
                    qry_first = False
                else:
                    raise Error('Error in mummer.to_graph_edge(). Cannot continue')
            else:
                if qry_at_ends == HIT_AT_END:
                    assert ref_at_ends == HIT_AT_END
                    qry_first = True
                elif qry_at_ends == HIT_AT_START:
                    assert ref_at_ends == HIT_AT_START
                    qry_first = False
                else:
                    raise Error('Error in mummer.to_graph_edge(). Cannot continue')
        else:
            if ref_fwd_strand:
                if qry_at_ends == HIT_AT_END:
                    assert ref_at_ends == HIT_AT_END
                    qry_first = False
                elif qry_at_ends == HIT_AT_START:
                    assert ref_at_ends == HIT_AT_START
                    qry_first = True
                else:
                    raise Error('Error in mummer.to_graph_edge(). Cannot continue')
            else:
                if qry_at_ends == HIT_AT_END:
                    assert ref_at_ends == HIT_AT_START
                    qry_first = False
                elif qry_at_ends == HIT_AT_START:
                    assert ref_at_ends == HIT_AT_END
                    qry_first = True
                else:
                    raise Error('Error in mummer.to_graph_edge(). Cannot continue')
        if qry_first:
            return edge.Edge(self.qry_name, self.qry_start, self.qry_end, self.ref_name, self.ref_start, self.ref_end)
        else:
            return edge.Edge(self.ref_name, self.ref_start, self.ref_end, self.qry_name, self.qry_start, self.qry_end)
Example #3
0
 def test_open_end(self):
     '''test open_end'''
     e1 = edge.Edge('c1', 1, 42, 'c2', 50, 10)
     e2 = edge.Edge('c1', 42, 1, 'c2', 1, 10)
     self.assertEqual(e1.open_end('c1'), edge.LEFT)
     self.assertEqual(e1.open_end('c2'), edge.LEFT)
     self.assertEqual(e2.open_end('c1'), edge.RIGHT)
     self.assertEqual(e2.open_end('c2'), edge.RIGHT)
Example #4
0
 def test_make_contig_forwards(self):
     '''test make_contig_forwards'''
     e = edge.Edge('c1', 1, 42, 'c2', 50, 10)
     e._make_contig_forwards('c1')
     self.assertEqual(e, edge.Edge('c1', 1, 42, 'c2', 50, 10))
     e._make_contig_forwards('c2')
     self.assertEqual(e, edge.Edge('c2', 10, 50, 'c1', 42, 1))
     e._make_contig_forwards('c1')
     self.assertEqual(e, edge.Edge('c1', 1, 42, 'c2', 50, 10))
Example #5
0
    def test_remove_redundant_nodes_from_simple_path(self):
        '''test remove_redundant_nodes_from_simple_path'''
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 100, 142, 'c3', 1, 42))
        new_path = self.g.remove_redundant_nodes_from_simple_path(
            ['c1', 'c2', 'c3'])
        self.assertListEqual(['c1', 'c2', 'c3'], new_path)
        self.assertTrue('c2' in self.g.graph)

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 51, 100, 'c2', 1, 50))
        self.g.add_edge(edge.Edge('c2', 41, 80, 'c3', 1, 40))
        new_path = self.g.remove_redundant_nodes_from_simple_path(
            ['c1', 'c2', 'c3'])
        self.assertListEqual(['c1', 'c3'], new_path)
        self.assertFalse('c2' in self.g.graph)

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 51, 100, 'c2', 1, 50))
        self.g.add_edge(edge.Edge('c2', 41, 80, 'c3', 1, 40))
        self.g.add_edge(edge.Edge('c3', 100, 150, 'c4', 1, 50))
        self.g.add_edge(edge.Edge('c4', 20, 70, 'c5', 1, 50))
        self.g.add_edge(edge.Edge('c5', 40, 90, 'c6', 1, 50))
        new_path = self.g.remove_redundant_nodes_from_simple_path(
            ['c1', 'c2', 'c3', 'c4', 'c5', 'c6'])
        self.assertListEqual(['c1', 'c3', 'c5', 'c6'], new_path)
        self.assertFalse('c2' in self.g.graph)
        self.assertFalse('c4' in self.g.graph)
Example #6
0
    def test_simple_path_is_consistent(self):
        '''test simple_path_is_consistent'''
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.assertTrue(self.g.simple_path_is_consistent(['c1', 'c2']))
        self.g.add_edge(edge.Edge('c3', 10, 100, 'c4', 1, 1000))
        self.assertTrue(self.g.simple_path_is_consistent(['c1', 'c2', 'c3']))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 1000, 100, 'c3', 1, 42))
        self.assertFalse(self.g.simple_path_is_consistent(['c1', 'c2', 'c3']))
Example #7
0
 def test_degree(self):
     '''test degree'''
     self.assertEqual(0, self.g._degree('c1'))
     self.assertEqual(0, self.g._degree('c2'))
     e1 = edge.Edge('c1', 1, 42, 'c2', 50, 10)
     e2 = edge.Edge('c1', 4, 43, 'c2', 60, 10)
     self.g.add_edge(e1)
     self.assertEqual(1, self.g._degree('c1'))
     self.assertEqual(1, self.g._degree('c2'))
     self.g.add_edge(e2)
     self.assertEqual(2, self.g._degree('c1'))
     self.assertEqual(2, self.g._degree('c2'))
Example #8
0
    def test_add_and_get_edges(self):
        '''test adding and getting edges'''
        self.assertListEqual([], self.g._get_edges('not_in_graph', 'c1'))
        self.assertListEqual([], self.g._get_edges('not_in_graph', 'c2'))
        self.assertListEqual([], self.g._get_edges('c1', 'c2'))
        self.assertListEqual([], self.g._get_edges('c2', 'c1'))

        e1 = edge.Edge('c1', 1, 42, 'c2', 50, 10)
        e2 = edge.Edge('c1', 4, 43, 'c2', 60, 10)
        self.g.add_edge(e1)
        self.assertListEqual([e1], self.g._get_edges('c1', 'c2'))
        self.g.add_edge(e2)
        self.assertListEqual([e1, e2], self.g._get_edges('c1', 'c2'))

        with self.assertRaises(graph.Error):
            self.g.add_edge(edge.Edge('c7', 1, 10, 'c8', 42, 84))
Example #9
0
    def test_node_to_coords(self):
        '''test _node_to_coords'''
        self.g.add_edge(edge.Edge('c1', 199, 0, 'c2', 1319, 1119))
        nodes = ['c1', 'c2']
        self.assertListEqual(['c1', intervals.Interval(200, 659), True], self.g._node_to_coords(nodes, 0))
        self.assertListEqual(['c2', intervals.Interval(0, 1319), True], self.g._node_to_coords(nodes, 1))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c2', 1119, 1319, 'c1', 0, 199))
        nodes = ['c1', 'c2']
        self.assertListEqual(['c1', intervals.Interval(200, 659), True], self.g._node_to_coords(nodes, 0))
        self.assertListEqual(['c2', intervals.Interval(0, 1319), True], self.g._node_to_coords(nodes, 1))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 551, 650, 'c2', 1, 100))
        self.g.add_edge(edge.Edge('c2', 1201, 1300, 'c3', 11, 110))
        nodes = ['c1', 'c2', 'c3']
        self.assertListEqual(['c1', intervals.Interval(0, 550), False], self.g._node_to_coords(nodes, 0))
        self.assertListEqual(['c2', intervals.Interval(1, 1200), False], self.g._node_to_coords(nodes, 1))
        self.assertListEqual(['c3', intervals.Interval(11, 2159), False], self.g._node_to_coords(nodes, 2))


        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 551, 650, 'c2', 1, 100))
        self.g.add_edge(edge.Edge('c3', 110, 11, 'c2', 1300, 1201))
        self.g.add_edge(edge.Edge('c3', 2051, 2150, 'c4', 6, 115))
        nodes = ['c1', 'c2', 'c3', 'c4']
        self.assertListEqual(['c1', intervals.Interval(0, 550), False], self.g._node_to_coords(nodes, 0))
        self.assertListEqual(['c2', intervals.Interval(1, 1200), False], self.g._node_to_coords(nodes, 1))
        self.assertListEqual(['c3', intervals.Interval(11, 2050), False], self.g._node_to_coords(nodes, 2))
        self.assertListEqual(['c4', intervals.Interval(6, 1259), False], self.g._node_to_coords(nodes, 3))
Example #10
0
 def test_make_contig_first(self):
     '''test make_contig_first'''
     e = edge.Edge('c1', 1, 42, 'c2', 50, 10)
     e_original = copy.copy(e)
     e.make_contig_first('c1')
     self.assertEqual(e, e_original)
     e.make_contig_first('c2')
     self.assertEqual(e, e_original)
     e.make_contig_first('c1')
     self.assertEqual(e, e_original)
Example #11
0
    def test_merged_coords_from_simple_nonredundant_path(self):
        '''test merged_coords_from_simple_nonredundant_path'''
        self.g.add_edge(edge.Edge('c1', 199, 0, 'c2', 1319, 1119))
        nodes = ['c1', 'c2']
        coords = self.g.merged_coords_from_simple_nonredundant_path(nodes)
        expected = [
            ['c1', intervals.Interval(200, 659), True],
            ['c2', intervals.Interval(0, 1319), True],
        ]
        self.assertListEqual(expected, coords)

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 610, 652, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 1250, 1310, 'c3', 5, 65))
        nodes = ['c1', 'c2', 'c3']
        coords = self.g.merged_coords_from_simple_nonredundant_path(nodes)
        expected = [['c1', intervals.Interval(0, 609), False],
                    ['c2', intervals.Interval(1, 1249), False],
                    ['c3', intervals.Interval(5, 2159), False]]
        self.assertListEqual(expected, coords)
Example #12
0
    def test_to_graph_edge(self):
        '''Test to_graph_edge'''
        hits = [
            '\t'.join(['781', '981', '10', '210', '200', '200', '98', '1000', '1000', '1', '1', 'ref', 'qry']), # %id too low
            '\t'.join(['781', '980', '10', '210', '199', '200', '98', '1000', '1000', '1', '1', 'ref', 'qry']), # hit too short
            '\t'.join(['781', '981', '10', '209', '200', '199', '98', '1000', '1000', '1', '1', 'ref', 'qry']), # hit too short
            '\t'.join(['1', '200', '1', '200', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # bad orientation
            '\t'.join(['200', '1', '200', '1', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # bad orientation
            '\t'.join(['800', '1000', '800', '1000', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # bad orientation
            '\t'.join(['1000', '800', '1000', '800', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # bad orientation
            '\t'.join(['300', '500', '300', '500', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # not at ends
            '\t'.join(['1', '1000', '1', '1000', '1000', '1000', '100.00', '1000', '1000', '1', '1', 'ref', 'qry']), # whole contigs hit
            '\t'.join(['1', '500', '1', '1000', '500', '500', '100.00', '500', '1000', '1', '1', 'ref1', 'qry1']), # contained contig
            '\t'.join(['1', '200', '791', '991', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref2', 'qry2']),
            '\t'.join(['781', '981', '10', '210', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref3', 'qry3']),
            '\t'.join(['991', '791', '781', '981', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref4', 'qry4']),
            '\t'.join(['210', '10', '15', '215', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref5', 'qry5']),
            '\t'.join(['781', '981', '991', '791', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref6', 'qry6']),
            '\t'.join(['10', '210', '215', '5', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref7', 'qry7']),
            '\t'.join(['210', '10', '980', '780', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref8', 'qry8']),
            '\t'.join(['995', '795', '215', '15', '200', '200', '100.00', '1000', '1000', '1', '1', 'ref9', 'qry9']),
        ]

        expected = [
            None,
            None,
            None,
            None,
            None,
            None,
            None,
            None,
            None,
            None,
            edge.Edge('qry2', 790, 990, 'ref2', 0, 199),
            edge.Edge('ref3', 780, 980, 'qry3', 9, 209),
            edge.Edge('qry4', 780, 980, 'ref4', 990, 790),
            edge.Edge('ref5', 209, 9, 'qry5', 14, 214),
            edge.Edge('ref6', 780, 980, 'qry6', 990, 790),
            edge.Edge('qry7', 214, 4, 'ref7', 9, 209),
            edge.Edge('ref8', 209, 9, 'qry8', 979, 779),
            edge.Edge('qry9', 214, 14, 'ref9', 994, 794),
        ]

        assert len(expected) == len(hits)

        for i in range(len(hits)):
            m = mummer.NucmerHit(hits[i])
            self.assertEqual(m.to_graph_edge(), expected[i])
Example #13
0
    def test_find_simple_path(self):
        '''test find_simple_path'''
        self.assertListEqual([], self.g.find_simple_path(['c1']))
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.assertListEqual(['c1', 'c2'], self.g.find_simple_path(['c1', 'c2']))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.assertListEqual(['c1', 'c2', 'c3'], self.g.find_simple_path(['c1', 'c2', 'c3']))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.assertListEqual([], self.g.find_simple_path(['c1', 'c2', 'c3']))
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.assertListEqual([], self.g.find_simple_path(['c1', 'c2']))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.g.add_edge(edge.Edge('c3', 10, 100, 'c4', 1, 1000))
        self.assertListEqual(['c1', 'c2', 'c3', 'c4'], self.g.find_simple_path(['c1', 'c2', 'c3', 'c4']))
        self.g.add_edge(edge.Edge('c3', 10, 100, 'c5', 1, 1000))
        self.assertListEqual([], self.g.find_simple_path(['c1', 'c2', 'c3']))
Example #14
0
    def test_remove_middle_node(self):
        '''test remove_middle_node'''
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 100, 142, 'c3', 1, 42))
        self.assertFalse(self.g._remove_middle_node('c1', 'c2', 'c3'))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 51, 100, 'c2', 1, 50))
        self.g.add_edge(edge.Edge('c2', 41, 80, 'c3', 1, 40))
        self.assertTrue(self.g._remove_middle_node('c1', 'c2', 'c3'))
        self.assertTrue('c2' not in self.g.graph)
        self.assertEqual(1, len(self.g.graph['c1']['c3']['edges']))
        self.assertEqual(1, len(self.g.graph['c3']['c1']['edges']))
        self.assertEqual(self.g.graph['c1']['c3']['edges'][0], edge.Edge('c1', 91, 100, 'c3', 1, 10))
        self.assertEqual(self.g.graph['c3']['c1']['edges'][0], edge.Edge('c1', 91, 100, 'c3', 1, 10))
Example #15
0
    def test_edges_are_consistent(self):
        '''test edges_are_consistent'''
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.assertTrue(self.g._edges_are_consistent('c1', 'c2', 'c3'))
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c3', 1, 42))
        self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3'))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3'))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3'))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 1, 42))
        self.g.add_edge(edge.Edge('c2', 100, 50, 'c3', 1, 42))
        self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3'))

        self.g = graph.Graph(self.asm)
        self.g.add_edge(edge.Edge('c1', 1, 100, 'c2', 42, 1))
        self.g.add_edge(edge.Edge('c2', 50, 100, 'c3', 1, 42))
        self.assertFalse(self.g._edges_are_consistent('c1', 'c2', 'c3'))
Example #16
0
 def test_reverse(self):
     '''test reverse'''
     e = edge.Edge('c1', 1, 42, 'c2', 50, 10)
     e.reverse()
     self.assertEqual(e, edge.Edge('c2', 10, 50, 'c1', 42, 1))
Example #17
0
    def test_merge_into(self):
        '''test merge_into'''
        e1 = edge.Edge('c1', 71, 100, 'c2', 1, 30)
        e2 = edge.Edge('c2', 41, 80, 'c3', 1, 40)
        e2_original = copy.copy(e2)
        self.assertFalse(e1.merge_into(e2, 'c2'))
        self.assertEqual(e2, e2_original)

        e1 = edge.Edge('c1', 51, 100, 'c2', 1, 50)
        e2 = edge.Edge('c2', 41, 80, 'c3', 1, 40)
        e2_original = copy.copy(e2)
        self.assertTrue(e1.merge_into(e2, 'c2'))
        self.assertEqual(e2, e2_original)
        self.assertEqual(e1, edge.Edge('c1', 91, 100, 'c3', 1, 10))

        e2 = edge.Edge('c1', 51, 100, 'c2', 1, 50)
        e1 = edge.Edge('c2', 41, 80, 'c3', 1, 40)
        e2_original = copy.copy(e2)
        self.assertTrue(e1.merge_into(e2, 'c2'))
        self.assertEqual(e2, e2_original)
        self.assertEqual(e1, edge.Edge('c1', 91, 100, 'c3', 1, 10))

        e1 = edge.Edge('c1', 51, 1, 'c2', 2, 52)
        e2 = edge.Edge('c2', 41, 80, 'c3', 1, 40)
        e2_original = copy.copy(e2)
        self.assertTrue(e1.merge_into(e2, 'c2'))
        self.assertEqual(e2, e2_original)
        self.assertEqual(e1, edge.Edge('c1', 12, 1, 'c3', 1, 12))

        e2 = edge.Edge('c1', 51, 1, 'c2', 2, 52)
        e1 = edge.Edge('c2', 41, 80, 'c3', 1, 40)
        e2_original = copy.copy(e2)
        self.assertTrue(e1.merge_into(e2, 'c2'))
        self.assertEqual(e2, e2_original)
        self.assertEqual(e1, edge.Edge('c1', 12, 1, 'c3', 1, 12))
Example #18
0
    def test_change_hit_coords_with_intersection(self):
        '''test test_change_hit_coords_with_intersection'''
        e = edge.Edge('c1', 1, 42, 'c2', 10, 50)
        e._change_hit_coords_with_intersection('c1', intervals.Interval(20, 30))
        self.assertEqual(e, edge.Edge('c1', 20, 30, 'c2', 29, 38))

        e = edge.Edge('c1', 1, 42, 'c2', 10, 50)
        e._change_hit_coords_with_intersection('c2', intervals.Interval(20, 30))
        self.assertEqual(e, edge.Edge('c1', 11, 22, 'c2', 20, 30))

        e = edge.Edge('c1', 1, 42, 'c2', 50, 10)
        e._change_hit_coords_with_intersection('c1', intervals.Interval(20, 30))
        self.assertEqual(e, edge.Edge('c1', 20, 30, 'c2', 31, 22))

        e = edge.Edge('c1', 1, 42, 'c2', 50, 10)
        e._change_hit_coords_with_intersection('c2', intervals.Interval(20, 30))
        self.assertEqual(e, edge.Edge('c1', 21, 32, 'c2', 30, 20))

        e = edge.Edge('c1', 42, 1, 'c2', 10, 50)
        e._change_hit_coords_with_intersection('c1', intervals.Interval(20, 30))
        self.assertEqual(e, edge.Edge('c1', 30, 20, 'c2', 22, 31))

        e = edge.Edge('c1', 42, 1, 'c2', 10, 50)
        e._change_hit_coords_with_intersection('c2', intervals.Interval(20, 30))
        self.assertEqual(e, edge.Edge('c1', 32, 21, 'c2', 20, 30))

        e = edge.Edge('c1', 42, 1, 'c2', 50, 10)
        e._change_hit_coords_with_intersection('c1', intervals.Interval(20, 30))
        self.assertEqual(e, edge.Edge('c1', 30, 20, 'c2', 38, 29))

        e = edge.Edge('c1', 42, 1, 'c2', 50, 10)
        e._change_hit_coords_with_intersection('c2', intervals.Interval(20, 30))
        self.assertEqual(e, edge.Edge('c1', 22, 11, 'c2', 30, 20))