|
1 # This Source Code Form is subject to the terms of the Mozilla Public |
|
2 # License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
3 # You can obtain one at http://mozilla.org/MPL/2.0/. |
|
4 from __future__ import unicode_literals |
|
5 |
|
6 import unittest |
|
7 |
|
8 from mozunit import ( |
|
9 main, |
|
10 ) |
|
11 |
|
12 from dumbmake.dumbmake import ( |
|
13 add_extra_dependencies, |
|
14 all_dependencies, |
|
15 dependency_map, |
|
16 indentation, |
|
17 ) |
|
18 |
|
19 class TestDumbmake(unittest.TestCase): |
|
20 def test_indentation(self): |
|
21 self.assertEqual(indentation(""), 0) |
|
22 self.assertEqual(indentation("x"), 0) |
|
23 self.assertEqual(indentation(" x"), 1) |
|
24 self.assertEqual(indentation("\tx"), 1) |
|
25 self.assertEqual(indentation(" \tx"), 2) |
|
26 self.assertEqual(indentation("\t x"), 2) |
|
27 self.assertEqual(indentation(" x "), 1) |
|
28 self.assertEqual(indentation("\tx\t"), 1) |
|
29 self.assertEqual(indentation(" x"), 2) |
|
30 self.assertEqual(indentation(" x"), 4) |
|
31 |
|
32 def test_dependency_map(self): |
|
33 self.assertEqual(dependency_map([]), {}) |
|
34 self.assertEqual(dependency_map(["a"]), {"a": []}) |
|
35 self.assertEqual(dependency_map(["a", "b"]), {"a": [], "b": []}) |
|
36 self.assertEqual(dependency_map(["a", "b", "c"]), {"a": [], "b": [], "c": []}) |
|
37 # indentation |
|
38 self.assertEqual(dependency_map(["a", "\tb", "a", "\tc"]), {"a": [], "b": ["a"], "c": ["a"]}) |
|
39 self.assertEqual(dependency_map(["a", "\tb", "\t\tc"]), {"a": [], "b": ["a"], "c": ["b", "a"]}) |
|
40 self.assertEqual(dependency_map(["a", "\tb", "\t\tc", "\td", "\te", "f"]), {"a": [], "b": ["a"], "c": ["b", "a"], "d": ["a"], "e": ["a"], "f": []}) |
|
41 # irregular indentation |
|
42 self.assertEqual(dependency_map(["\ta", "b"]), {"a": [], "b": []}) |
|
43 self.assertEqual(dependency_map(["a", "\t\t\tb", "\t\tc"]), {"a": [], "b": ["a"], "c": ["a"]}) |
|
44 self.assertEqual(dependency_map(["a", "\t\tb", "\t\t\tc", "\t\td", "\te", "f"]), {"a": [], "b": ["a"], "c": ["b", "a"], "d": ["a"], "e": ["a"], "f": []}) |
|
45 # repetitions |
|
46 self.assertEqual(dependency_map(["a", "\tb", "a", "\tb"]), {"a": [], "b": ["a"]}) |
|
47 self.assertEqual(dependency_map(["a", "\tb", "\t\tc", "b", "\td", "\t\te"]), {"a": [], "b": ["a"], "d": ["b"], "e": ["d", "b"], "c": ["b", "a"]}) |
|
48 # cycles are okay |
|
49 self.assertEqual(dependency_map(["a", "\tb", "\t\ta"]), {"a": ["b", "a"], "b": ["a"]}) |
|
50 |
|
51 def test_all_dependencies(self): |
|
52 dm = {"a": [], "b": ["a"], "c": ["b", "a"], "d": ["a"], "e": ["a"], "f": []} |
|
53 self.assertEqual(all_dependencies("a", dependency_map=dm), []) |
|
54 self.assertEqual(all_dependencies("b", dependency_map=dm), ["a"]) |
|
55 self.assertEqual(all_dependencies("c", "a", "b", dependency_map=dm), ["b", "a"]) |
|
56 self.assertEqual(all_dependencies("d", dependency_map=dm), ["a"]) |
|
57 self.assertEqual(all_dependencies("d", "f", "c", dependency_map=dm), ["b", "a"]) |
|
58 self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["a"]) |
|
59 self.assertEqual(all_dependencies("b", "b", dependency_map=dm), ["a"]) |
|
60 |
|
61 def test_missing_entry(self): |
|
62 # a depends on b, which is missing |
|
63 dm = {"a": ["b"]} |
|
64 self.assertEqual(all_dependencies("a", dependency_map=dm), ["b"]) |
|
65 self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["b"]) |
|
66 self.assertEqual(all_dependencies("b", dependency_map=dm), []) |
|
67 |
|
68 def test_two_dependencies(self): |
|
69 dm = {"a": ["c"], "b": ["c"], "c": []} |
|
70 # suppose a and b both depend on c. Then we want to build a and b before c... |
|
71 self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["c"]) |
|
72 # ... but relative order is preserved. |
|
73 self.assertEqual(all_dependencies("b", "a", dependency_map=dm), ["c"]) |
|
74 |
|
75 def test_nested_dependencies(self): |
|
76 # a depends on b depends on c depends on d |
|
77 dm = {"a": ["b", "c", "d"], "b": ["c", "d"], "c": ["d"]} |
|
78 self.assertEqual(all_dependencies("b", "a", dependency_map=dm), ["b", "c", "d"]) |
|
79 self.assertEqual(all_dependencies("c", "a", dependency_map=dm), ["b", "c", "d"]) |
|
80 |
|
81 def test_add_extra_dependencies(self): |
|
82 # a depends on b depends on c depends on d |
|
83 dm = {"a": ["b", "c", "d"], "b": ["c", "d"], "c": ["d"]} |
|
84 # Edge cases. |
|
85 self.assertEqual(list(add_extra_dependencies([], dependency_map=dm)), |
|
86 []) |
|
87 self.assertEqual(list(add_extra_dependencies([(None, "package")], dependency_map=dm)), |
|
88 [(None, "package")]) |
|
89 # Easy expansion. |
|
90 self.assertEqual(list(add_extra_dependencies([("b", None)], dependency_map=dm)), |
|
91 [("b", None), ("c", None), ("d", None)]) |
|
92 # Expansion with two groups -- each group is handled independently. |
|
93 self.assertEqual(list(add_extra_dependencies([("b", None), |
|
94 (None, "package"), |
|
95 ("c", None)], dependency_map=dm)), |
|
96 [("b", None), (None, "package"), |
|
97 ("c", None), ("d", None)]) |
|
98 # Two groups, no duplicate dependencies in each group. |
|
99 self.assertEqual(list(add_extra_dependencies([("a", None), ("b", None), |
|
100 (None, "package"), (None, "install"), |
|
101 ("c", None), ("d", None)], dependency_map=dm)), |
|
102 [("a", None), ("b", None), (None, "package"), |
|
103 (None, "install"), ("c", None), ("d", None)]) |
|
104 |
|
105 if __name__ == '__main__': |
|
106 main() |