14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport UserDict, random, string 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport gc, weakref 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass DictTest(unittest.TestCase): 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_constructor(self): 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # calling built-in types without argument must return empty 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dict(), {}) 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsNot(dict(), {}) 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_literal_constructor(self): 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # check literal constructor for different sized dicts 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (to exercise the BUILD_MAP oparg). 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for n in (0, 1, 6, 256, 400): 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = [(''.join(random.sample(string.letters, 8)), i) 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(n)] 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm random.shuffle(items) 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm formatted_items = ('{!r}: {:d}'.format(k, v) for k, v in items) 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dictliteral = '{' + ', '.join(formatted_items) + '}' 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(eval(dictliteral), dict(items)) 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_bool(self): 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIs(not {}, True) 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue({1: 2}) 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIs(bool({}), False) 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIs(bool({1: 2}), True) 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_keys(self): 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.keys(), []) 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {'a': 1, 'b': 2} 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = d.keys() 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.has_key('a')) 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.has_key('b')) 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.keys, None) 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_values(self): 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.values(), []) 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {1:2} 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.values(), [2]) 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.values, None) 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_items(self): 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.items(), []) 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {1:2} 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.items(), [(1, 2)]) 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.items, None) 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_has_key(self): 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(d.has_key('a')) 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {'a': 1, 'b': 2} 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = d.keys() 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k.sort() 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(k, ['a', 'b']) 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.has_key) 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_contains(self): 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('a', d) 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse('a' in d) 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue('a' not in d) 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {'a': 1, 'b': 2} 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn('a', d) 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn('b', d) 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('c', d) 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.__contains__) 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_len(self): 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d), 0) 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {'a': 1, 'b': 2} 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d), 2) 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_getitem(self): 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {'a': 1, 'b': 2} 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['a'], 1) 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['b'], 2) 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d['c'] = 3 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d['a'] = 4 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['c'], 3) 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['a'], 4) 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del d['b'] 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {'a': 4, 'c': 3}) 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.__getitem__) 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadEq(object): 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 24 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[BadEq()] = 42 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.__getitem__, 23) 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadHash(object): 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fail = False 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.fail: 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = BadHash() 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[x] = 42 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.fail = True 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.__getitem__, x) 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_clear(self): 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {1:1, 2:2, 3:3} 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.clear() 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {}) 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.clear, None) 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_update(self): 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update({1:100}) 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update({2:20}) 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update({1:1, 2:2, 3:3}) 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {1:1, 2:2, 3:3}) 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update() 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {1:1, 2:2, 3:3}) 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises((TypeError, AttributeError), d.update, None) 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class SimpleUserDict: 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.d = {1:1, 2:2, 3:3} 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.d.keys() 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, i): 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.d[i] 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.clear() 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(SimpleUserDict()) 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {1:1, 2:2, 3:3}) 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.clear() 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class FailingUserDict: 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.update, FailingUserDict()) 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class FailingUserDict: 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BogonIter: 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i = 1 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def next(self): 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.i: 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i = 0 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 'a' 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return BogonIter() 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, key): 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return key 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.update, FailingUserDict()) 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class FailingUserDict: 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BogonIter: 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i = ord('a') 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def next(self): 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.i <= ord('z'): 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rtn = chr(self.i) 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i += 1 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return rtn 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise StopIteration 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return BogonIter() 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, key): 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.update, FailingUserDict()) 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class badseq(object): 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def next(self): 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, {}.update, badseq()) 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, {}.update, [(1, 2, 3)]) 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_fromkeys(self): 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dict.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsNot(d.fromkeys('abc'), d) 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.fromkeys((4,5),0), {4:0, 5:0}) 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.fromkeys([]), {}) 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def g(): 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm yield 1 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.fromkeys(g()), {1:None}) 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, {}.fromkeys, 3) 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class dictlike(dict): pass 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dictlike.fromkeys('a'), {'a':None}) 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dictlike().fromkeys('a'), {'a':None}) 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(dictlike.fromkeys('a'), dictlike) 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(dictlike().fromkeys('a'), dictlike) 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class mydict(dict): 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __new__(cls): 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return UserDict.UserDict() 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ud = mydict.fromkeys('ab') 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(ud, {'a':None, 'b':None}) 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(ud, UserDict.UserDict) 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, dict.fromkeys) 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class baddict1(dict): 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, baddict1.fromkeys, [1]) 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadSeq(object): 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def next(self): 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, dict.fromkeys, BadSeq()) 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class baddict2(dict): 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setitem__(self, key, value): 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, baddict2.fromkeys, [1]) 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # test fast path for dictionary inputs 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict(zip(range(6), range(6))) 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dict.fromkeys(d, 0), dict(zip(range(6), [0]*6))) 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy(self): 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {1:1, 2:2, 3:3} 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.copy(), {1:1, 2:2, 3:3}) 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual({}.copy(), {}) 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.copy, None) 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_get(self): 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIs(d.get('c'), None) 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get('c', 3), 3) 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {'a': 1, 'b': 2} 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIs(d.get('c'), None) 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get('c', 3), 3) 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get('a'), 1) 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get('a', 3), 1) 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.get) 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.get, None, None, None) 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_setdefault(self): 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # dict.setdefault() 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIs(d.setdefault('key0'), None) 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.setdefault('key0', []) 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIs(d.setdefault('key0'), None) 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.setdefault('key', []).append(3) 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['key'][0], 3) 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.setdefault('key', []).append(4) 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d['key']), 2) 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.setdefault) 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadHash(object): 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fail = False 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.fail: 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = BadHash() 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[x] = 42 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.fail = True 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.setdefault, x, []) 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_popitem(self): 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # dict.popitem() 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for copymode in -1, +1: 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # -1: b has same structure as a 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # +1: b is a.copy() 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for log2size in range(12): 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = 2**log2size 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a = {} 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b = {} 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(size): 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a[repr(i)] = i 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if copymode < 0: 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b[repr(i)] = i 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if copymode > 0: 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b = a.copy() 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(size): 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ka, va = ta = a.popitem() 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(va, int(ka)) 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kb, vb = tb = b.popitem() 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(vb, int(kb)) 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(copymode < 0 and ta != tb) 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(a) 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(b) 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.popitem) 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_pop(self): 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Tests for pop with specified key 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k, v = 'abc', 'def' 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[k] = v 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.pop, 'ghi') 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(k), v) 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d), 0) 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.pop, k) 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # verify longs/ints get same value when key > 32 bits 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (for 64-bit archs). See SF bug #689659. 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = 4503599627370496L 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = 4503599627370496 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm h = {x: 'anything', y: 'something else'} 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(h[x], h[y]) 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(k, v), v) 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[k] = v 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(k, 1), v) 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.pop) 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadHash(object): 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fail = False 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.fail: 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = BadHash() 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[x] = 42 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.fail = True 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.pop, x) 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_mutatingiteration(self): 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # changing dict size during iteration 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[1] = 1 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(RuntimeError): 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in d: 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[i+1] = 1 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_repr(self): 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(d), '{}') 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[1] = 2 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(d), '{1: 2}') 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[1] = d 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(d), '{1: {...}}') 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadRepr(object): 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {1: BadRepr()} 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, repr, d) 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_le(self): 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse({} < {}) 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse({1: 2} < {1L: 2L}) 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadCmp(object): 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d1 = {BadCmp(): 1} 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d2 = {1: 1} 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(Exc): 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d1 < d2 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_missing(self): 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Make sure dict doesn't have a __missing__ method 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(hasattr(dict, "__missing__")) 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(hasattr({}, "__missing__")) 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Test several cases: 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (D) subclass defines __missing__ method returning a value 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (E) subclass defines __missing__ method raising RuntimeError 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (F) subclass sets __missing__ instance variable (no effect) 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # (G) subclass doesn't define __missing__ at a all 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class D(dict): 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __missing__(self, key): 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = D({1: 2, 3: 4}) 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d[1], 2) 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d[3], 4) 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(2, d) 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(2, d.keys()) 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d[2], 42) 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class E(dict): 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __missing__(self, key): 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise RuntimeError(key) 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e = E() 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(RuntimeError) as c: 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm e[42] 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.exception.args, (42,)) 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class F(dict): 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # An instance variable __missing__ should have no effect 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.__missing__ = lambda key: None 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f = F() 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(KeyError) as c: 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm f[42] 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.exception.args, (42,)) 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class G(dict): 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm g = G() 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(KeyError) as c: 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm g[42] 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.exception.args, (42,)) 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_tuple_keyerror(self): 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # SF #1576657 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(KeyError) as c: 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[(1,)] 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(c.exception.args, ((1,),)) 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_bad_key(self): 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Dictionary lookups should fail if __cmp__() raises an exception. 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class CustomException(Exception): 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadDictKey: 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return hash(self.__class__) 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __cmp__(self, other): 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if isinstance(other, self.__class__): 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise CustomException 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return other 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x1 = BadDictKey() 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x2 = BadDictKey() 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[x1] = 1 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for stmt in ['d[x2] = 2', 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'z = d[x2]', 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'x2 in d', 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'd.has_key(x2)', 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'd.get(x2)', 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'd.setdefault(x2, 42)', 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'd.pop(x2)', 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'd.update({x2: 2})']: 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(CustomException): 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exec stmt in locals() 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_resize1(self): 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Dict resizing bug, found by Jack Jansen in 2.2 CVS development. 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This version got an assert failure in debug build, infinite loop in 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # release build. Unfortunately, provoking this kind of stuff requires 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # a mix of inserts and deletes hitting exactly the right hash codes in 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # exactly the right order, and I can't think of a randomized approach 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # that would be *likely* to hit a failing case in reasonable time. 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(5): 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[i] = i 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(5): 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del d[i] 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(5, 9): # i==8 was the problem 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[i] = i 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_resize2(self): 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Another dict resizing bug (SF bug #1456209). 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This caused Segmentation faults or Illegal instructions. 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class X(object): 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 5 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if resizing: 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.clear() 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return False 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm resizing = False 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[X()] = 1 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[X()] = 2 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[X()] = 3 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[X()] = 4 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[X()] = 5 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # now trigger a resize 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm resizing = True 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[9] = 6 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_empty_presized_dict_in_freelist(self): 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Bug #3537: if an empty but presized dict with a size larger 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # than 7 was in the freelist, it triggered an assertion failure 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with self.assertRaises(ZeroDivisionError): 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {'a': 1 // 0, 'b': None, 'c': None, 'd': None, 'e': None, 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'f': None, 'g': None, 'h': None} 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = {} 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_container_iterator(self): 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Bug #3680: tp_traverse was not implemented for dictiter objects 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class C(object): 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm iterators = (dict.iteritems, dict.itervalues, dict.iterkeys) 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in iterators: 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj = C() 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ref = weakref.ref(obj) 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm container = {obj: 1} 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm obj.x = i(container) 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del obj, container 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm gc.collect() 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIs(ref(), None, "Cycle was not collected") 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _not_tracked(self, t): 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Nested containers can take several collections to untrack 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm gc.collect() 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm gc.collect() 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(gc.is_tracked(t), t) 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _tracked(self, t): 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(gc.is_tracked(t), t) 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm gc.collect() 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm gc.collect() 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(gc.is_tracked(t), t) 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @test_support.cpython_only 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_track_literals(self): 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Test GC-optimization of dict literals 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x, y, z, w = 1.5, "a", (1, None), [] 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked({}) 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked({x:(), y:x, z:1}) 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked({1: "a", "b": 2}) 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked({1: 2, (None, True, False, ()): int}) 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked({1: object()}) 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Dicts with mutable elements are always tracked, even if those 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # elements are not tracked right now. 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked({1: []}) 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked({1: ([],)}) 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked({1: {}}) 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked({1: set()}) 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @test_support.cpython_only 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_track_dynamic(self): 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Test GC-optimization of dynamically-created dicts 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class MyObject(object): 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x, y, z, w, o = 1.5, "a", (1, object()), [], MyObject() 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict() 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[1] = "a" 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[y] = 2 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[z] = 3 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d.copy()) 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[4] = w 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(d) 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(d.copy()) 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[4] = None 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d.copy()) 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # dd isn't tracked right now, but it may mutate and therefore d 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # which contains it must be tracked. 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict() 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dd = dict() 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[1] = dd 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(dd) 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(d) 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dd[1] = d 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(dd) 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict.fromkeys([x, y, z]) 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dd = dict() 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dd.update(d) 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(dd) 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict.fromkeys([x, y, z, o]) 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(d) 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dd = dict() 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dd.update(d) 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(dd) 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict(x=x, y=y, z=z) 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict(x=x, y=y, z=z, w=w) 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(d) 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict() 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(x=x, y=y, z=z) 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(w=w) 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(d) 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict([(x, y), (z, 1)]) 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict([(x, y), (z, w)]) 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(d) 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = dict() 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update([(x, y), (z, 1)]) 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._not_tracked(d) 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update([(x, y), (z, w)]) 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(d) 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @test_support.cpython_only 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_track_subtypes(self): 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Dict subtypes are always tracked 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class MyDict(dict): 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self._tracked(MyDict()) 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import mapping_tests 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass GeneralMappingTests(mapping_tests.BasicTestMappingProtocol): 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type2test = dict 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass Dict(dict): 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass SubclassMappingTests(mapping_tests.BasicTestMappingProtocol): 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type2test = Dict 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main(): 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with test_support.check_py3k_warnings( 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ('dict(.has_key..| inequality comparisons) not supported in 3.x', 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm DeprecationWarning)): 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_support.run_unittest( 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm DictTest, 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm GeneralMappingTests, 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm SubclassMappingTests, 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ) 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__": 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_main() 677