summaryrefslogtreecommitdiffstats
path: root/python/mozbuild/mozbuild/test/test_containers.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/mozbuild/mozbuild/test/test_containers.py')
-rw-r--r--python/mozbuild/mozbuild/test/test_containers.py224
1 files changed, 224 insertions, 0 deletions
diff --git a/python/mozbuild/mozbuild/test/test_containers.py b/python/mozbuild/mozbuild/test/test_containers.py
new file mode 100644
index 0000000000..50dd0a4088
--- /dev/null
+++ b/python/mozbuild/mozbuild/test/test_containers.py
@@ -0,0 +1,224 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this file,
+# You can obtain one at http://mozilla.org/MPL/2.0/.
+
+import unittest
+from collections import OrderedDict
+
+from mozunit import main
+
+from mozbuild.util import (
+ KeyedDefaultDict,
+ List,
+ OrderedDefaultDict,
+ ReadOnlyDefaultDict,
+ ReadOnlyDict,
+ ReadOnlyKeyedDefaultDict,
+ ReadOnlyNamespace,
+)
+
+
+class TestReadOnlyNamespace(unittest.TestCase):
+ def test_basic(self):
+ test = ReadOnlyNamespace(foo=1, bar=2)
+
+ self.assertEqual(test.foo, 1)
+ self.assertEqual(test.bar, 2)
+ self.assertEqual(
+ sorted(i for i in dir(test) if not i.startswith("__")), ["bar", "foo"]
+ )
+
+ with self.assertRaises(AttributeError):
+ test.missing
+
+ with self.assertRaises(Exception):
+ test.foo = 2
+
+ with self.assertRaises(Exception):
+ del test.foo
+
+ self.assertEqual(test, test)
+ self.assertEqual(test, ReadOnlyNamespace(foo=1, bar=2))
+ self.assertNotEqual(test, ReadOnlyNamespace(foo="1", bar=2))
+ self.assertNotEqual(test, ReadOnlyNamespace(foo=1, bar=2, qux=3))
+ self.assertNotEqual(test, ReadOnlyNamespace(foo=1, qux=3))
+ self.assertNotEqual(test, ReadOnlyNamespace(foo=3, bar="42"))
+
+
+class TestReadOnlyDict(unittest.TestCase):
+ def test_basic(self):
+ original = {"foo": 1, "bar": 2}
+
+ test = ReadOnlyDict(original)
+
+ self.assertEqual(original, test)
+ self.assertEqual(test["foo"], 1)
+
+ with self.assertRaises(KeyError):
+ test["missing"]
+
+ with self.assertRaises(Exception):
+ test["baz"] = True
+
+ def test_update(self):
+ original = {"foo": 1, "bar": 2}
+
+ test = ReadOnlyDict(original)
+
+ with self.assertRaises(Exception):
+ test.update(foo=2)
+
+ self.assertEqual(original, test)
+
+ def test_del(self):
+ original = {"foo": 1, "bar": 2}
+
+ test = ReadOnlyDict(original)
+
+ with self.assertRaises(Exception):
+ del test["foo"]
+
+ self.assertEqual(original, test)
+
+
+class TestReadOnlyDefaultDict(unittest.TestCase):
+ def test_simple(self):
+ original = {"foo": 1, "bar": 2}
+
+ test = ReadOnlyDefaultDict(bool, original)
+
+ self.assertEqual(original, test)
+
+ self.assertEqual(test["foo"], 1)
+
+ def test_assignment(self):
+ test = ReadOnlyDefaultDict(bool, {})
+
+ with self.assertRaises(Exception):
+ test["foo"] = True
+
+ def test_defaults(self):
+ test = ReadOnlyDefaultDict(bool, {"foo": 1})
+
+ self.assertEqual(test["foo"], 1)
+
+ self.assertEqual(test["qux"], False)
+
+
+class TestList(unittest.TestCase):
+ def test_add_list(self):
+ test = List([1, 2, 3])
+
+ test += [4, 5, 6]
+ self.assertIsInstance(test, List)
+ self.assertEqual(test, [1, 2, 3, 4, 5, 6])
+
+ test = test + [7, 8]
+ self.assertIsInstance(test, List)
+ self.assertEqual(test, [1, 2, 3, 4, 5, 6, 7, 8])
+
+ def test_add_string(self):
+ test = List([1, 2, 3])
+
+ with self.assertRaises(ValueError):
+ test += "string"
+
+ def test_none(self):
+ """As a special exception, we allow None to be treated as an empty
+ list."""
+ test = List([1, 2, 3])
+
+ test += None
+ self.assertEqual(test, [1, 2, 3])
+
+ test = test + None
+ self.assertIsInstance(test, List)
+ self.assertEqual(test, [1, 2, 3])
+
+ with self.assertRaises(ValueError):
+ test += False
+
+ with self.assertRaises(ValueError):
+ test = test + False
+
+
+class TestOrderedDefaultDict(unittest.TestCase):
+ def test_simple(self):
+ original = OrderedDict(foo=1, bar=2)
+
+ test = OrderedDefaultDict(bool, original)
+
+ self.assertEqual(original, test)
+
+ self.assertEqual(test["foo"], 1)
+
+ self.assertEqual(list(test), ["foo", "bar"])
+
+ def test_defaults(self):
+ test = OrderedDefaultDict(bool, {"foo": 1})
+
+ self.assertEqual(test["foo"], 1)
+
+ self.assertEqual(test["qux"], False)
+
+ self.assertEqual(list(test), ["foo", "qux"])
+
+
+class TestKeyedDefaultDict(unittest.TestCase):
+ def test_simple(self):
+ original = {"foo": 1, "bar": 2}
+
+ test = KeyedDefaultDict(lambda x: x, original)
+
+ self.assertEqual(original, test)
+
+ self.assertEqual(test["foo"], 1)
+
+ def test_defaults(self):
+ test = KeyedDefaultDict(lambda x: x, {"foo": 1})
+
+ self.assertEqual(test["foo"], 1)
+
+ self.assertEqual(test["qux"], "qux")
+
+ self.assertEqual(test["bar"], "bar")
+
+ test["foo"] = 2
+ test["qux"] = None
+ test["baz"] = "foo"
+
+ self.assertEqual(test["foo"], 2)
+
+ self.assertEqual(test["qux"], None)
+
+ self.assertEqual(test["baz"], "foo")
+
+
+class TestReadOnlyKeyedDefaultDict(unittest.TestCase):
+ def test_defaults(self):
+ test = ReadOnlyKeyedDefaultDict(lambda x: x, {"foo": 1})
+
+ self.assertEqual(test["foo"], 1)
+
+ self.assertEqual(test["qux"], "qux")
+
+ self.assertEqual(test["bar"], "bar")
+
+ copy = dict(test)
+
+ with self.assertRaises(Exception):
+ test["foo"] = 2
+
+ with self.assertRaises(Exception):
+ test["qux"] = None
+
+ with self.assertRaises(Exception):
+ test["baz"] = "foo"
+
+ self.assertEqual(test, copy)
+
+ self.assertEqual(len(test), 3)
+
+
+if __name__ == "__main__":
+ main()