# 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, defaultdict
from mozunit
import main
from mozbuild.util
import (
KeyedDefaultDict,
List,
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 = defaultdict(bool, original)
self.assertEqual(original, test)
self.assertEqual(test[
"foo"], 1)
self.assertEqual(list(test), [
"foo",
"bar"])
def test_defaults(self):
test = defaultdict(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()