python/mozbuild/dumbmake/test/test_dumbmake.py

changeset 0
6474c204b198
     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()

mercurial