def test_getitem(self): d = TransformDict(str.lower) d['Foo'] = 5 self.assertEqual(d.getitem('foo'), ('Foo', 5)) self.assertEqual(d.getitem('FOO'), ('Foo', 5)) with self.assertRaises(KeyError): d.getitem('bar')
def test_transform_func(self): # Test the `transform_func` attribute d = TransformDict(str.lower) self.assertIs(d.transform_func, str.lower) # The attribute is read-only with self.assertRaises(AttributeError): d.transform_func = str.upper
def test_clear(self): d = TransformDict(str.lower) d.clear() self.check_underlying_dict(d, {}) d['Foo'] = 5 d['baR'] = 3 self.check_underlying_dict(d, {'foo': 5, 'bar': 3}) d.clear() self.check_underlying_dict(d, {})
def test_get(self): d = TransformDict(str.lower) default = object() self.assertIs(d.get('foo'), None) self.assertIs(d.get('foo', default), default) d['Foo'] = 5 self.assertEqual(d.get('foo'), 5) self.assertEqual(d.get('FOO'), 5) self.assertIs(d.get('bar'), None) self.check_underlying_dict(d, {'foo': 5})
def test_first_key_retained(self): d = TransformDict(str.lower, {'Foo': 5, 'BAR': 6}) self.assertEqual(set(d), {'Foo', 'BAR'}) d['foo'] = 7 d['baR'] = 8 d['quux'] = 9 self.assertEqual(set(d), {'Foo', 'BAR', 'quux'}) del d['foo'] d['FOO'] = 9 del d['bar'] d.setdefault('Bar', 15) d.setdefault('BAR', 15) self.assertEqual(set(d), {'FOO', 'Bar', 'quux'})
def test_various_transforms(self): d = TransformDict(lambda s: s.encode('utf-8')) d['Foo'] = 5 self.assertEqual(d['Foo'], 5) self.check_underlying_dict(d, {b'Foo': 5}) with self.assertRaises(AttributeError): # 'bytes' object has no attribute 'encode' d[b'Foo'] # Another example d = TransformDict(str.swapcase) d['Foo'] = 5 self.assertEqual(d['Foo'], 5) self.check_underlying_dict(d, {'fOO': 5}) with self.assertRaises(KeyError): d['fOO']
def test_iter(self): d = TransformDict(str.lower) it = iter(d) with self.assertRaises(StopIteration): next(it) d['Foo'] = 5 d['BAR'] = 6 self.assertEqual(set(x for x in d), {'Foo', 'BAR'})
def test_contains(self): d = TransformDict(str.lower) self.assertIs(False, 'foo' in d) d['Foo'] = 5 self.assertIs(True, 'Foo' in d) self.assertIs(True, 'foo' in d) self.assertIs(True, 'FOO' in d) self.assertIs(False, 'bar' in d)
def test_repr(self): d = TransformDict(str.lower) self.assertEqual( repr(d), "TransformDict(<method 'lower' of 'str' objects>, {})") d['Foo'] = 5 self.assertEqual( repr(d), "TransformDict(<method 'lower' of 'str' objects>, {'Foo': 5})")
def test_delitem(self): d = TransformDict(str.lower, Foo=5) d['baR'] = 3 del d['fOO'] with self.assertRaises(KeyError): del d['Foo'] with self.assertRaises(KeyError): del d['foo'] self.check_underlying_dict(d, {'bar': 3})
def test_pop(self): d = TransformDict(str.lower) default = object() with self.assertRaises(KeyError): d.pop('foo') self.assertIs(d.pop('foo', default), default) d['Foo'] = 5 self.assertIn('foo', d) self.assertEqual(d.pop('foo'), 5) self.assertNotIn('foo', d) self.check_underlying_dict(d, {}) d['Foo'] = 5 self.assertIn('Foo', d) self.assertEqual(d.pop('FOO'), 5) self.assertNotIn('foo', d) self.check_underlying_dict(d, {}) with self.assertRaises(KeyError): d.pop('foo')
def test_len(self): d = TransformDict(str.lower) self.assertEqual(len(d), 0) d['Foo'] = 5 self.assertEqual(len(d), 1) d['BAR'] = 6 self.assertEqual(len(d), 2) d['foo'] = 7 self.assertEqual(len(d), 2) d['baR'] = 3 self.assertEqual(len(d), 2) del d['Bar'] self.assertEqual(len(d), 1)
def test_init(self): with self.assertRaises(TypeError): TransformDict() with self.assertRaises(TypeError): # Too many positional args TransformDict(str.lower, {}, {}) with self.assertRaises(TypeError): # Not a callable TransformDict(object()) d = TransformDict(str.lower) self.check_underlying_dict(d, {}) pairs = [('Bar', 1), ('Foo', 2)] d = TransformDict(str.lower, pairs) self.assertEqual(sorted(d.items()), pairs) self.check_underlying_dict(d, {'bar': 1, 'foo': 2}) d = TransformDict(str.lower, dict(pairs)) self.assertEqual(sorted(d.items()), pairs) self.check_underlying_dict(d, {'bar': 1, 'foo': 2}) d = TransformDict(str.lower, **dict(pairs)) self.assertEqual(sorted(d.items()), pairs) self.check_underlying_dict(d, {'bar': 1, 'foo': 2}) d = TransformDict(str.lower, {'Bar': 1}, Foo=2) self.assertEqual(sorted(d.items()), pairs) self.check_underlying_dict(d, {'bar': 1, 'foo': 2})
def test_setitem_getitem(self): d = TransformDict(str.lower) with self.assertRaises(KeyError): d['foo'] d['Foo'] = 5 self.assertEqual(d['foo'], 5) self.assertEqual(d['Foo'], 5) self.assertEqual(d['FOo'], 5) with self.assertRaises(KeyError): d['bar'] self.check_underlying_dict(d, {'foo': 5}) d['BAR'] = 6 self.assertEqual(d['Bar'], 6) self.check_underlying_dict(d, {'foo': 5, 'bar': 6}) # Overwriting d['foO'] = 7 self.assertEqual(d['foo'], 7) self.assertEqual(d['Foo'], 7) self.assertEqual(d['FOo'], 7) self.check_underlying_dict(d, {'foo': 7, 'bar': 6})
def test_repr_non_hashable_keys(self): d = TransformDict(id) self.assertEqual(repr(d), "TransformDict(<built-in function id>, {})") d[[1]] = 2 self.assertEqual(repr(d), "TransformDict(<built-in function id>, [([1], 2)])")