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_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_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_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_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_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_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_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_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)])")