1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/python/mozbuild/dumbmake/test/test_dumbmake.py Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,106 @@ 1.4 +# This Source Code Form is subject to the terms of the Mozilla Public 1.5 +# License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.6 +# You can obtain one at http://mozilla.org/MPL/2.0/. 1.7 +from __future__ import unicode_literals 1.8 + 1.9 +import unittest 1.10 + 1.11 +from mozunit import ( 1.12 + main, 1.13 +) 1.14 + 1.15 +from dumbmake.dumbmake import ( 1.16 + add_extra_dependencies, 1.17 + all_dependencies, 1.18 + dependency_map, 1.19 + indentation, 1.20 +) 1.21 + 1.22 +class TestDumbmake(unittest.TestCase): 1.23 + def test_indentation(self): 1.24 + self.assertEqual(indentation(""), 0) 1.25 + self.assertEqual(indentation("x"), 0) 1.26 + self.assertEqual(indentation(" x"), 1) 1.27 + self.assertEqual(indentation("\tx"), 1) 1.28 + self.assertEqual(indentation(" \tx"), 2) 1.29 + self.assertEqual(indentation("\t x"), 2) 1.30 + self.assertEqual(indentation(" x "), 1) 1.31 + self.assertEqual(indentation("\tx\t"), 1) 1.32 + self.assertEqual(indentation(" x"), 2) 1.33 + self.assertEqual(indentation(" x"), 4) 1.34 + 1.35 + def test_dependency_map(self): 1.36 + self.assertEqual(dependency_map([]), {}) 1.37 + self.assertEqual(dependency_map(["a"]), {"a": []}) 1.38 + self.assertEqual(dependency_map(["a", "b"]), {"a": [], "b": []}) 1.39 + self.assertEqual(dependency_map(["a", "b", "c"]), {"a": [], "b": [], "c": []}) 1.40 + # indentation 1.41 + self.assertEqual(dependency_map(["a", "\tb", "a", "\tc"]), {"a": [], "b": ["a"], "c": ["a"]}) 1.42 + self.assertEqual(dependency_map(["a", "\tb", "\t\tc"]), {"a": [], "b": ["a"], "c": ["b", "a"]}) 1.43 + self.assertEqual(dependency_map(["a", "\tb", "\t\tc", "\td", "\te", "f"]), {"a": [], "b": ["a"], "c": ["b", "a"], "d": ["a"], "e": ["a"], "f": []}) 1.44 + # irregular indentation 1.45 + self.assertEqual(dependency_map(["\ta", "b"]), {"a": [], "b": []}) 1.46 + self.assertEqual(dependency_map(["a", "\t\t\tb", "\t\tc"]), {"a": [], "b": ["a"], "c": ["a"]}) 1.47 + 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": []}) 1.48 + # repetitions 1.49 + self.assertEqual(dependency_map(["a", "\tb", "a", "\tb"]), {"a": [], "b": ["a"]}) 1.50 + self.assertEqual(dependency_map(["a", "\tb", "\t\tc", "b", "\td", "\t\te"]), {"a": [], "b": ["a"], "d": ["b"], "e": ["d", "b"], "c": ["b", "a"]}) 1.51 + # cycles are okay 1.52 + self.assertEqual(dependency_map(["a", "\tb", "\t\ta"]), {"a": ["b", "a"], "b": ["a"]}) 1.53 + 1.54 + def test_all_dependencies(self): 1.55 + dm = {"a": [], "b": ["a"], "c": ["b", "a"], "d": ["a"], "e": ["a"], "f": []} 1.56 + self.assertEqual(all_dependencies("a", dependency_map=dm), []) 1.57 + self.assertEqual(all_dependencies("b", dependency_map=dm), ["a"]) 1.58 + self.assertEqual(all_dependencies("c", "a", "b", dependency_map=dm), ["b", "a"]) 1.59 + self.assertEqual(all_dependencies("d", dependency_map=dm), ["a"]) 1.60 + self.assertEqual(all_dependencies("d", "f", "c", dependency_map=dm), ["b", "a"]) 1.61 + self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["a"]) 1.62 + self.assertEqual(all_dependencies("b", "b", dependency_map=dm), ["a"]) 1.63 + 1.64 + def test_missing_entry(self): 1.65 + # a depends on b, which is missing 1.66 + dm = {"a": ["b"]} 1.67 + self.assertEqual(all_dependencies("a", dependency_map=dm), ["b"]) 1.68 + self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["b"]) 1.69 + self.assertEqual(all_dependencies("b", dependency_map=dm), []) 1.70 + 1.71 + def test_two_dependencies(self): 1.72 + dm = {"a": ["c"], "b": ["c"], "c": []} 1.73 + # suppose a and b both depend on c. Then we want to build a and b before c... 1.74 + self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["c"]) 1.75 + # ... but relative order is preserved. 1.76 + self.assertEqual(all_dependencies("b", "a", dependency_map=dm), ["c"]) 1.77 + 1.78 + def test_nested_dependencies(self): 1.79 + # a depends on b depends on c depends on d 1.80 + dm = {"a": ["b", "c", "d"], "b": ["c", "d"], "c": ["d"]} 1.81 + self.assertEqual(all_dependencies("b", "a", dependency_map=dm), ["b", "c", "d"]) 1.82 + self.assertEqual(all_dependencies("c", "a", dependency_map=dm), ["b", "c", "d"]) 1.83 + 1.84 + def test_add_extra_dependencies(self): 1.85 + # a depends on b depends on c depends on d 1.86 + dm = {"a": ["b", "c", "d"], "b": ["c", "d"], "c": ["d"]} 1.87 + # Edge cases. 1.88 + self.assertEqual(list(add_extra_dependencies([], dependency_map=dm)), 1.89 + []) 1.90 + self.assertEqual(list(add_extra_dependencies([(None, "package")], dependency_map=dm)), 1.91 + [(None, "package")]) 1.92 + # Easy expansion. 1.93 + self.assertEqual(list(add_extra_dependencies([("b", None)], dependency_map=dm)), 1.94 + [("b", None), ("c", None), ("d", None)]) 1.95 + # Expansion with two groups -- each group is handled independently. 1.96 + self.assertEqual(list(add_extra_dependencies([("b", None), 1.97 + (None, "package"), 1.98 + ("c", None)], dependency_map=dm)), 1.99 + [("b", None), (None, "package"), 1.100 + ("c", None), ("d", None)]) 1.101 + # Two groups, no duplicate dependencies in each group. 1.102 + self.assertEqual(list(add_extra_dependencies([("a", None), ("b", None), 1.103 + (None, "package"), (None, "install"), 1.104 + ("c", None), ("d", None)], dependency_map=dm)), 1.105 + [("a", None), ("b", None), (None, "package"), 1.106 + (None, "install"), ("c", None), ("d", None)]) 1.107 + 1.108 +if __name__ == '__main__': 1.109 + main()