~bzr-pqm/bzr/bzr.dev

2052.3.2 by John Arbash Meinel
Change Copyright .. by Canonical to Copyright ... Canonical
1
# Copyright (C) 2005, 2006 Canonical Ltd
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
16
1185.31.25 by John Arbash Meinel
Renamed all of the tests from selftest/foo.py to tests/test_foo.py
17
from bzrlib.tests import TestCase
2490.2.21 by Aaron Bentley
Rename graph to deprecated_graph
18
from bzrlib.deprecated_graph import node_distances, nodes_by_distance, Graph
974.1.57 by aaron.bentley at utoronto
Started work on djkstra longest-path algorithm
19
2052.3.1 by John Arbash Meinel
Add tests to cleanup the copyright of all source files
20
974.1.57 by aaron.bentley at utoronto
Started work on djkstra longest-path algorithm
21
class TestBase(TestCase):
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
22
974.1.57 by aaron.bentley at utoronto
Started work on djkstra longest-path algorithm
23
    def edge_add(self, *args):
24
        for start, end in zip(args[:-1], args[1:]):
25
            if start not in self.graph:
26
                self.graph[start] = {}
27
            if end not in self.graph:
28
                self.graph[end] = {}
29
            self.graph[start][end] = 1
30
31
    def setUp(self):
32
        TestCase.setUp(self)
33
        self.graph = {}
974.1.58 by aaron.bentley at utoronto
Implemented yet another farthest_node algorithm
34
        self.edge_add('A', 'B', 'C', 'D')
35
        self.edge_add('A', 'E', 'F', 'C')
36
        self.edge_add('A', 'G', 'H', 'I', 'B')
37
        self.edge_add('A', 'J', 'K', 'L', 'M', 'N')
974.1.64 by Aaron Bentley
Handled ancestors that are missing when finding a base
38
        self.edge_add('O', 'N')
974.1.87 by Aaron Bentley
Refactored and documented graph stuff
39
40
    def node_descendants(self):
974.1.64 by Aaron Bentley
Handled ancestors that are missing when finding a base
41
        descendants = {'A':set()}
974.1.59 by aaron.bentley at utoronto
Created yet another longest-patch-picker
42
        for node in self.graph:
43
            for ancestor in self.graph[node]:
44
                if ancestor not in descendants:
45
                    descendants[ancestor] = set()
46
                descendants[ancestor].add(node)
974.1.87 by Aaron Bentley
Refactored and documented graph stuff
47
        return descendants
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
48
974.1.87 by Aaron Bentley
Refactored and documented graph stuff
49
    def test_distances(self):
50
        descendants = self.node_descendants()
51
        distances = node_distances(self.graph, descendants, 'A')
52
        nodes = nodes_by_distance(distances)
974.1.59 by aaron.bentley at utoronto
Created yet another longest-patch-picker
53
        self.assertEqual(nodes[0], 'D')
1185.16.145 by Martin Pool
Remove all assert statements from test cases.
54
        self.assert_(nodes[1] in ('N', 'C'))
55
        self.assert_(nodes[2] in ('N', 'C'))
56
        self.assert_(nodes[3] in ('B', 'M'))
57
        self.assert_(nodes[4] in ('B', 'M'))
974.1.59 by aaron.bentley at utoronto
Created yet another longest-patch-picker
58
1185.8.3 by Aaron Bentley
Fixed bug in distance-from-root graph operation
59
        #Ensure we don't shortcut through B when there's only a difference of
60
        # 1 in distance
61
        self.graph = {}
62
        self.edge_add('A', 'B', 'C')
63
        self.edge_add('A', 'D', 'E', 'C')
64
        descendants = self.node_descendants()
65
        distances = node_distances(self.graph, descendants, 'A')
66
        self.assertEqual(distances['C'], 3)
974.1.58 by aaron.bentley at utoronto
Implemented yet another farthest_node algorithm
67
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
68
69
class TestGraph(TestCase):
70
71
    def test_get_descendants(self):
3943.8.1 by Marius Kruger
remove all trailing whitespace from bzr source
72
        # Graph objects let you get a descendants graph in
1607.1.12 by Robert Collins
Fix common_ancestor to still calculate a common ancestor when ghosts are
73
        # node: {direct-children:distance} which contains
74
        # known children, including ghost children
75
        graph = Graph()
76
        graph.add_ghost('ghost')
77
        graph.add_node('rev1', ['ghost'])
78
        # check the result contains ghosts:
79
        self.assertEqual({'ghost': {'rev1': 1}, 'rev1': {}},
80
                         graph.get_descendants())