blob: 9eb7df1ded7ef858b85a8d77ae8a5859de5288a7 [file] [log] [blame]
# 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 mozunit import main
from mozbuild.util import (
KeyedDefaultDict,
List,
OrderedDefaultDict,
ReadOnlyDefaultDict,
ReadOnlyDict,
ReadOnlyKeyedDefaultDict,
)
from collections import OrderedDict
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):
value = 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(test.keys(), ['foo', 'bar' ])
def test_defaults(self):
test = OrderedDefaultDict(bool, {'foo': 1 })
self.assertEqual(test['foo'], 1)
self.assertEqual(test['qux'], False)
self.assertEqual(test.keys(), ['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()