Use list.sort's keyword parameters
[joel/kofoto.git] / src / test / dagtests.py
1 #! /usr/bin/env python
2
3 import os
4 import sys
5 import unittest
6
7 if __name__ == "__main__":
8     cwd = os.getcwd()
9     libdir = unicode(os.path.realpath(
10         os.path.join(os.path.dirname(sys.argv[0]), "..", "packages")))
11     os.chdir(libdir)
12     sys.path.insert(0, libdir)
13 from kofoto.dag import *
14
15 PICDIR = unicode(os.path.realpath(
16     os.path.join("..", "reference_pictures", "working")))
17
18 class TestDAG(unittest.TestCase):
19     def setUp(self):
20         self.dag = DAG()
21         for x in [1, 2, 3, 4, 5, 6]:
22             self.dag.add(x)
23         for x, y in [(1, 3), (1, 4), (2, 3), (3, 5), (4, 5), (5, 6)]:
24             self.dag.connect(x, y)
25
26     def tearDown(self):
27         del self.dag
28
29     def test_iter(self):
30         assert sorted(list(self.dag)) == [1, 2, 3, 4, 5, 6]
31
32     def test_contains(self):
33         assert 3 in self.dag
34
35     def test_negative_contains(self):
36         assert not 4711 in self.dag
37
38     def test_redundant_add(self):
39         self.dag.add(1)
40         assert sorted(list(self.dag)) == [1, 2, 3, 4, 5, 6]
41
42     def test_redundant_connect(self):
43         assert self.dag.reachable(1, 3)
44         self.dag.connect(1, 3)
45         assert self.dag.reachable(1, 3)
46
47     def test_connect_loop(self):
48         try:
49             self.dag.connect(6, 1)
50         except LoopError:
51             pass
52         else:
53             assert False
54
55     def test_connected(self):
56         assert self.dag.connected(1, 3)
57         assert self.dag.connected(1, 4)
58         assert not self.dag.connected(1, 2)
59         assert not self.dag.connected(1, 5)
60
61     def test_disconnect(self):
62         assert self.dag.reachable(1, 3)
63         self.dag.disconnect(1, 3)
64         assert not self.dag.reachable(1, 3)
65
66     def test_idempotent_disconnect(self):
67         self.dag.disconnect(3, 1)
68         assert self.dag.reachable(1, 3)
69         assert not self.dag.reachable(3, 1)
70
71     def test_getAncestors(self):
72         for x, y in [(1, [1]),
73                      (2, [2]),
74                      (3, [1, 2, 3]),
75                      (4, [1, 4]),
76                      (5, [1, 2, 3, 4, 5]),
77                      (6, [1, 2, 3, 4, 5, 6])]:
78             assert sorted(list(self.dag.getAncestors(x))) == sorted(y)
79
80     def test_getChildren(self):
81         for x, y in [(1, [3, 4]),
82                      (2, [3]),
83                      (3, [5]),
84                      (4, [5]),
85                      (5, [6]),
86                      (6, [])]:
87             assert sorted(list(self.dag.getChildren(x))) == sorted(y)
88
89     def test_getDescendants(self):
90         for x, y in [(1, [1, 3, 4, 5, 6]),
91                      (2, [2, 3, 5, 6]),
92                      (3, [3, 5, 6]),
93                      (4, [4, 5, 6]),
94                      (5, [5, 6]),
95                      (6, [6])]:
96             assert sorted(list(self.dag.getDescendants(x))) == sorted(y)
97
98     def test_getParents(self):
99         for x, y in [(1, []),
100                      (2, []),
101                      (3, [1, 2]),
102                      (4, [1]),
103                      (5, [3, 4]),
104                      (6, [5])]:
105             assert sorted(list(self.dag.getParents(x))) == sorted(y)
106
107     def test_getRoots(self):
108         assert sorted(list(self.dag.getRoots())) == [1, 2]
109
110     def test_reachable(self):
111         assert self.dag.reachable(1, 3)
112         assert self.dag.reachable(1, 6)
113         assert not self.dag.reachable(1, 2)
114         assert not self.dag.reachable(1, 4711)
115
116     def test_remove(self):
117         assert self.dag.reachable(1, 6)
118         self.dag.remove(5)
119         assert not self.dag.reachable(1, 6)
120
121     def test_negative_remove(self):
122         try:
123             self.dag.remove(4711)
124         except:
125             pass
126         else:
127             assert False
128
129 ######################################################################
130
131 if __name__ == "__main__":
132     unittest.main()