michael@0: # This Source Code Form is subject to the terms of the Mozilla Public michael@0: # License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: # You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: from __future__ import unicode_literals michael@0: michael@0: import unittest michael@0: michael@0: from mozunit import ( michael@0: main, michael@0: ) michael@0: michael@0: from dumbmake.dumbmake import ( michael@0: add_extra_dependencies, michael@0: all_dependencies, michael@0: dependency_map, michael@0: indentation, michael@0: ) michael@0: michael@0: class TestDumbmake(unittest.TestCase): michael@0: def test_indentation(self): michael@0: self.assertEqual(indentation(""), 0) michael@0: self.assertEqual(indentation("x"), 0) michael@0: self.assertEqual(indentation(" x"), 1) michael@0: self.assertEqual(indentation("\tx"), 1) michael@0: self.assertEqual(indentation(" \tx"), 2) michael@0: self.assertEqual(indentation("\t x"), 2) michael@0: self.assertEqual(indentation(" x "), 1) michael@0: self.assertEqual(indentation("\tx\t"), 1) michael@0: self.assertEqual(indentation(" x"), 2) michael@0: self.assertEqual(indentation(" x"), 4) michael@0: michael@0: def test_dependency_map(self): michael@0: self.assertEqual(dependency_map([]), {}) michael@0: self.assertEqual(dependency_map(["a"]), {"a": []}) michael@0: self.assertEqual(dependency_map(["a", "b"]), {"a": [], "b": []}) michael@0: self.assertEqual(dependency_map(["a", "b", "c"]), {"a": [], "b": [], "c": []}) michael@0: # indentation michael@0: self.assertEqual(dependency_map(["a", "\tb", "a", "\tc"]), {"a": [], "b": ["a"], "c": ["a"]}) michael@0: self.assertEqual(dependency_map(["a", "\tb", "\t\tc"]), {"a": [], "b": ["a"], "c": ["b", "a"]}) michael@0: self.assertEqual(dependency_map(["a", "\tb", "\t\tc", "\td", "\te", "f"]), {"a": [], "b": ["a"], "c": ["b", "a"], "d": ["a"], "e": ["a"], "f": []}) michael@0: # irregular indentation michael@0: self.assertEqual(dependency_map(["\ta", "b"]), {"a": [], "b": []}) michael@0: self.assertEqual(dependency_map(["a", "\t\t\tb", "\t\tc"]), {"a": [], "b": ["a"], "c": ["a"]}) michael@0: 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": []}) michael@0: # repetitions michael@0: self.assertEqual(dependency_map(["a", "\tb", "a", "\tb"]), {"a": [], "b": ["a"]}) michael@0: self.assertEqual(dependency_map(["a", "\tb", "\t\tc", "b", "\td", "\t\te"]), {"a": [], "b": ["a"], "d": ["b"], "e": ["d", "b"], "c": ["b", "a"]}) michael@0: # cycles are okay michael@0: self.assertEqual(dependency_map(["a", "\tb", "\t\ta"]), {"a": ["b", "a"], "b": ["a"]}) michael@0: michael@0: def test_all_dependencies(self): michael@0: dm = {"a": [], "b": ["a"], "c": ["b", "a"], "d": ["a"], "e": ["a"], "f": []} michael@0: self.assertEqual(all_dependencies("a", dependency_map=dm), []) michael@0: self.assertEqual(all_dependencies("b", dependency_map=dm), ["a"]) michael@0: self.assertEqual(all_dependencies("c", "a", "b", dependency_map=dm), ["b", "a"]) michael@0: self.assertEqual(all_dependencies("d", dependency_map=dm), ["a"]) michael@0: self.assertEqual(all_dependencies("d", "f", "c", dependency_map=dm), ["b", "a"]) michael@0: self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["a"]) michael@0: self.assertEqual(all_dependencies("b", "b", dependency_map=dm), ["a"]) michael@0: michael@0: def test_missing_entry(self): michael@0: # a depends on b, which is missing michael@0: dm = {"a": ["b"]} michael@0: self.assertEqual(all_dependencies("a", dependency_map=dm), ["b"]) michael@0: self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["b"]) michael@0: self.assertEqual(all_dependencies("b", dependency_map=dm), []) michael@0: michael@0: def test_two_dependencies(self): michael@0: dm = {"a": ["c"], "b": ["c"], "c": []} michael@0: # suppose a and b both depend on c. Then we want to build a and b before c... michael@0: self.assertEqual(all_dependencies("a", "b", dependency_map=dm), ["c"]) michael@0: # ... but relative order is preserved. michael@0: self.assertEqual(all_dependencies("b", "a", dependency_map=dm), ["c"]) michael@0: michael@0: def test_nested_dependencies(self): michael@0: # a depends on b depends on c depends on d michael@0: dm = {"a": ["b", "c", "d"], "b": ["c", "d"], "c": ["d"]} michael@0: self.assertEqual(all_dependencies("b", "a", dependency_map=dm), ["b", "c", "d"]) michael@0: self.assertEqual(all_dependencies("c", "a", dependency_map=dm), ["b", "c", "d"]) michael@0: michael@0: def test_add_extra_dependencies(self): michael@0: # a depends on b depends on c depends on d michael@0: dm = {"a": ["b", "c", "d"], "b": ["c", "d"], "c": ["d"]} michael@0: # Edge cases. michael@0: self.assertEqual(list(add_extra_dependencies([], dependency_map=dm)), michael@0: []) michael@0: self.assertEqual(list(add_extra_dependencies([(None, "package")], dependency_map=dm)), michael@0: [(None, "package")]) michael@0: # Easy expansion. michael@0: self.assertEqual(list(add_extra_dependencies([("b", None)], dependency_map=dm)), michael@0: [("b", None), ("c", None), ("d", None)]) michael@0: # Expansion with two groups -- each group is handled independently. michael@0: self.assertEqual(list(add_extra_dependencies([("b", None), michael@0: (None, "package"), michael@0: ("c", None)], dependency_map=dm)), michael@0: [("b", None), (None, "package"), michael@0: ("c", None), ("d", None)]) michael@0: # Two groups, no duplicate dependencies in each group. michael@0: self.assertEqual(list(add_extra_dependencies([("a", None), ("b", None), michael@0: (None, "package"), (None, "install"), michael@0: ("c", None), ("d", None)], dependency_map=dm)), michael@0: [("a", None), ("b", None), (None, "package"), michael@0: (None, "install"), ("c", None), ("d", None)]) michael@0: michael@0: if __name__ == '__main__': michael@0: main()