14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# tests common to dict and UserDict 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport UserDict 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport test_support 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass BasicTestMappingProtocol(unittest.TestCase): 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This base class can be used to check that an object conforms to the 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # mapping protocol 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Functions that can be useful to override to adapt to dictionary 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # semantics 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm type2test = None # which class is being tested (overwrite in subclasses) 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _reference(self): 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return a dictionary of values which are invariant by storage 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm in the object under test.""" 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return {1:2, "key1":"value1", "key2":(1,2,3)} 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _empty_mapping(self): 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return an empty mapping object""" 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.type2test() 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _full_mapping(self, data): 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Return a mapping object with the value contained in data 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm dictionary""" 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = self._empty_mapping() 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for key, value in data.items(): 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x[key] = value 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return x 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, *args, **kw): 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm unittest.TestCase.__init__(self, *args, **kw) 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.reference = self._reference().copy() 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # A (key, value) pair not in the mapping 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key, value = self.reference.popitem() 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.other = {key:value} 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # A (key, value) pair in the mapping 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key, value = self.reference.popitem() 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.inmapping = {key:value} 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.reference[key] = value 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_read(self): 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Test for read only operations on mapping 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = self._empty_mapping() 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p1 = dict(p) #workaround for singleton objects 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping(self.reference) 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if d is p: 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = p1 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #Indexing 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for key, value in self.reference.items(): 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d[key], value) 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm knownkey = self.other.keys()[0] 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, lambda:d[knownkey]) 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #len 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(p), 0) 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d), len(self.reference)) 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #in 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for k in self.reference: 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn(k, d) 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for k in self.other: 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(k, d) 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #has_key 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm with test_support.check_py3k_warnings(quiet=True): 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for k in self.reference: 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.has_key(k)) 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for k in self.other: 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertFalse(d.has_key(k)) 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #cmp 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(cmp(p,p), 0) 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(cmp(d,d), 0) 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(cmp(p,d), -1) 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(cmp(d,p), 1) 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #__non__zero__ 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if p: self.fail("Empty mapping must compare to False") 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if not d: self.fail("Full mapping must compare to True") 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # keys(), items(), iterkeys() ... 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def check_iterandlist(iter, lst, ref): 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(hasattr(iter, 'next')) 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(hasattr(iter, '__iter__')) 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = list(iter) 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(set(x)==set(lst)==set(ref)) 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm check_iterandlist(d.iterkeys(), d.keys(), self.reference.keys()) 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm check_iterandlist(iter(d), d.keys(), self.reference.keys()) 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm check_iterandlist(d.itervalues(), d.values(), self.reference.values()) 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm check_iterandlist(d.iteritems(), d.items(), self.reference.items()) 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #get 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key, value = d.iteritems().next() 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm knownkey, knownvalue = self.other.iteritems().next() 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get(key, knownvalue), value) 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get(knownkey, knownvalue), knownvalue) 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(knownkey, d) 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_write(self): 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Test for write operations on mapping 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = self._empty_mapping() 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #Indexing 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for key, value in self.reference.items(): 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p[key] = value 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(p[key], value) 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for key in self.reference.keys(): 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del p[key] 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, lambda:p[key]) 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = self._empty_mapping() 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #update 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p.update(self.reference) 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dict(p), self.reference) 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm items = p.items() 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p = self._empty_mapping() 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p.update(items) 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dict(p), self.reference) 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping(self.reference) 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #setdefault 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key, value = d.iteritems().next() 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm knownkey, knownvalue = self.other.iteritems().next() 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.setdefault(key, knownvalue), value) 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d[key], value) 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.setdefault(knownkey, knownvalue), knownvalue) 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d[knownkey], knownvalue) 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #pop 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(knownkey), knownvalue) 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(knownkey, d) 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.pop, knownkey) 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm default = 909 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[knownkey] = knownvalue 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(knownkey, default), knownvalue) 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(knownkey, d) 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(knownkey, default), default) 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm #popitem 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm key, value = d.popitem() 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(key, d) 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(value, self.reference[key]) 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm p=self._empty_mapping() 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, p.popitem) 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_constructor(self): 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(self._empty_mapping(), self._empty_mapping()) 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_bool(self): 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not self._empty_mapping()) 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(self.reference) 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(bool(self._empty_mapping()) is False) 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(bool(self.reference) is True) 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_keys(self): 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.keys(), []) 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self.reference 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn(self.inmapping.keys()[0], d.keys()) 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn(self.other.keys()[0], d.keys()) 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.keys, None) 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_values(self): 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.values(), []) 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.values, None) 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_items(self): 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.items(), []) 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.items, None) 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_len(self): 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d), 0) 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_getitem(self): 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self.reference 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d[self.inmapping.keys()[0]], self.inmapping.values()[0]) 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.__getitem__) 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_update(self): 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # mapping argument 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(self.other) 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.items(), self.other.items()) 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # No argument 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update() 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, self._empty_mapping()) 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # item sequence 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(self.other.items()) 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.items(), self.other.items()) 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Iterator 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(self.other.iteritems()) 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.items(), self.other.items()) 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # FIXME: Doesn't work with UserDict 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # self.assertRaises((TypeError, AttributeError), d.update, None) 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises((TypeError, AttributeError), d.update, 42) 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm outerself = self 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class SimpleUserDict: 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.d = outerself.reference 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.d.keys() 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, i): 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.d[i] 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.clear() 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(SimpleUserDict()) 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i1 = d.items() 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i2 = self.reference.items() 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i1.sort() 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i2.sort() 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(i1, i2) 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class FailingUserDict: 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.update, FailingUserDict()) 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.clear() 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class FailingUserDict: 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BogonIter: 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i = 1 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def next(self): 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.i: 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i = 0 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 'a' 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return BogonIter() 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, key): 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return key 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.update, FailingUserDict()) 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class FailingUserDict: 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BogonIter: 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i = ord('a') 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def next(self): 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.i <= ord('z'): 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm rtn = chr(self.i) 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.i += 1 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return rtn 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise StopIteration 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return BogonIter() 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, key): 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.update, FailingUserDict()) 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class badseq(object): 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def next(self): 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.update, badseq()) 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, d.update, [(1, 2, 3)]) 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # no test_fromkeys or test_copy as both os.environ and selves don't support it 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_get(self): 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.get(self.other.keys()[0]) is None) 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get(self.other.keys()[0], 3), 3) 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self.reference 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.get(self.other.keys()[0]) is None) 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get(self.other.keys()[0], 3), 3) 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get(self.inmapping.keys()[0]), self.inmapping.values()[0]) 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get(self.inmapping.keys()[0], 3), self.inmapping.values()[0]) 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.get) 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.get, None, None, None) 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_setdefault(self): 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.setdefault) 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_popitem(self): 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.popitem) 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.popitem, 42) 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_pop(self): 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k, v = self.inmapping.items()[0] 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[k] = v 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.pop, self.other.keys()[0]) 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(k), v) 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d), 0) 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.pop, k) 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestMappingProtocol(BasicTestMappingProtocol): 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_constructor(self): 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_constructor(self) 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(self._empty_mapping() is not self._empty_mapping()) 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(self.type2test(x=1, y=2), {"x": 1, "y": 2}) 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_bool(self): 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_bool(self) 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not self._empty_mapping()) 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(self._full_mapping({"x": "y"})) 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(bool(self._empty_mapping()) is False) 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(bool(self._full_mapping({"x": "y"})) is True) 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_keys(self): 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_keys(self) 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.keys(), []) 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({'a': 1, 'b': 2}) 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = d.keys() 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn('a', k) 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn('b', k) 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('c', k) 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_values(self): 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_values(self) 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({1:2}) 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.values(), [2]) 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_items(self): 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_items(self) 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({1:2}) 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.items(), [(1, 2)]) 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_has_key(self): 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not d.has_key('a')) 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({'a': 1, 'b': 2}) 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k = d.keys() 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k.sort() 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(k, ['a', 'b']) 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.has_key) 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_contains(self): 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('a', d) 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not ('a' in d)) 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue('a' not in d) 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({'a': 1, 'b': 2}) 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn('a', d) 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIn('b', d) 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertNotIn('c', d) 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.__contains__) 3624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_len(self): 3644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_len(self) 3654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({'a': 1, 'b': 2}) 3664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d), 2) 3674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_getitem(self): 3694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_getitem(self) 3704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({'a': 1, 'b': 2}) 3714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['a'], 1) 3724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['b'], 2) 3734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d['c'] = 3 3744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d['a'] = 4 3754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['c'], 3) 3764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['a'], 4) 3774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del d['b'] 3784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {'a': 4, 'c': 3}) 3794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.__getitem__) 3814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_clear(self): 3834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({1:1, 2:2, 3:3}) 3844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.clear() 3854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {}) 3864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.clear, None) 3884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_update(self): 3904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_update(self) 3914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # mapping argument 3924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 3934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update({1:100}) 3944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update({2:20}) 3954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update({1:1, 2:2, 3:3}) 3964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {1:1, 2:2, 3:3}) 3974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # no argument 3994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update() 4004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {1:1, 2:2, 3:3}) 4014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # keyword arguments 4034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 4044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(x=100) 4054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(y=20) 4064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(x=1, y=2, z=3) 4074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {"x":1, "y":2, "z":3}) 4084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # item sequence 4104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 4114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update([("x", 100), ("y", 20)]) 4124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {"x":100, "y":20}) 4134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Both item sequence and keyword arguments 4154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 4164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update([("x", 100), ("y", 20)], x=1, y=2) 4174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {"x":1, "y":2}) 4184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # iterator 4204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({1:3, 2:4}) 4214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(self._full_mapping({1:2, 3:4, 5:6}).iteritems()) 4224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {1:2, 2:4, 3:4, 5:6}) 4234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class SimpleUserDict: 4254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 4264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.d = {1:1, 2:2, 3:3} 4274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def keys(self): 4284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.d.keys() 4294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __getitem__(self, i): 4304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self.d[i] 4314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.clear() 4324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.update(SimpleUserDict()) 4334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d, {1:1, 2:2, 3:3}) 4344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_fromkeys(self): 4364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(self.type2test.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) 4374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 4384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not(d.fromkeys('abc') is d)) 4394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) 4404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.fromkeys((4,5),0), {4:0, 5:0}) 4414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.fromkeys([]), {}) 4424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def g(): 4434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm yield 1 4444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.fromkeys(g()), {1:None}) 4454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, {}.fromkeys, 3) 4464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class dictlike(self.type2test): pass 4474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dictlike.fromkeys('a'), {'a':None}) 4484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(dictlike().fromkeys('a'), {'a':None}) 4494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(dictlike.fromkeys('a').__class__ is dictlike) 4504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(dictlike().fromkeys('a').__class__ is dictlike) 4514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # FIXME: the following won't work with UserDict, because it's an old style class 4524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # self.assertTrue(type(dictlike.fromkeys('a')) is dictlike) 4534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class mydict(self.type2test): 4544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __new__(cls): 4554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return UserDict.UserDict() 4564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ud = mydict.fromkeys('ab') 4574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(ud, {'a':None, 'b':None}) 4584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # FIXME: the following won't work with UserDict, because it's an old style class 4594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # self.assertIsInstance(ud, UserDict.UserDict) 4604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, dict.fromkeys) 4614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 4634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class baddict1(self.type2test): 4654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self): 4664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 4674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, baddict1.fromkeys, [1]) 4694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadSeq(object): 4714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __iter__(self): 4724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return self 4734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def next(self): 4744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 4754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, self.type2test.fromkeys, BadSeq()) 4774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class baddict2(self.type2test): 4794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __setitem__(self, key, value): 4804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 4814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, baddict2.fromkeys, [1]) 4834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_copy(self): 4854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({1:1, 2:2, 3:3}) 4864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.copy(), {1:1, 2:2, 3:3}) 4874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 4884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.copy(), d) 4894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(d.copy(), d.__class__) 4904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(TypeError, d.copy, None) 4914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 4924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_get(self): 4934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_get(self) 4944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 4954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.get('c') is None) 4964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get('c', 3), 3) 4974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({'a' : 1, 'b' : 2}) 4984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.get('c') is None) 4994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get('c', 3), 3) 5004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get('a'), 1) 5014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.get('a', 3), 1) 5024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_setdefault(self): 5044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_setdefault(self) 5054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 5064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.setdefault('key0') is None) 5074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.setdefault('key0', []) 5084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(d.setdefault('key0') is None) 5094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.setdefault('key', []).append(3) 5104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d['key'][0], 3) 5114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d.setdefault('key', []).append(4) 5124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(len(d['key']), 2) 5134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_popitem(self): 5154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_popitem(self) 5164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for copymode in -1, +1: 5174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # -1: b has same structure as a 5184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # +1: b is a.copy() 5194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for log2size in range(12): 5204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm size = 2**log2size 5214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a = self._empty_mapping() 5224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b = self._empty_mapping() 5234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(size): 5244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a[repr(i)] = i 5254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if copymode < 0: 5264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b[repr(i)] = i 5274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if copymode > 0: 5284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm b = a.copy() 5294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in range(size): 5304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ka, va = ta = a.popitem() 5314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(va, int(ka)) 5324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm kb, vb = tb = b.popitem() 5334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(vb, int(kb)) 5344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not(copymode < 0 and ta != tb)) 5354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not a) 5364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not b) 5374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_pop(self): 5394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm BasicTestMappingProtocol.test_pop(self) 5404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Tests for pop with specified key 5424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 5434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm k, v = 'abc', 'def' 5444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # verify longs/ints get same value when key > 32 bits (for 64-bit archs) 5464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # see SF bug #689659 5474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = 4503599627370496L 5484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm y = 4503599627370496 5494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm h = self._full_mapping({x: 'anything', y: 'something else'}) 5504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(h[x], h[y]) 5514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(k, v), v) 5534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[k] = v 5544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(d.pop(k, 1), v) 5554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass TestHashMappingProtocol(TestMappingProtocol): 5584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_getitem(self): 5604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm TestMappingProtocol.test_getitem(self) 5614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 5624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadEq(object): 5644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 5654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 5664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 5674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 24 5684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 5704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[BadEq()] = 42 5714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(KeyError, d.__getitem__, 23) 5724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadHash(object): 5744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fail = False 5754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 5764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.fail: 5774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 5784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 5794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 5804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 5824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = BadHash() 5834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[x] = 42 5844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.fail = True 5854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.__getitem__, x) 5864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_fromkeys(self): 5884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm TestMappingProtocol.test_fromkeys(self) 5894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class mydict(self.type2test): 5904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __new__(cls): 5914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return UserDict.UserDict() 5924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm ud = mydict.fromkeys('ab') 5934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(ud, {'a':None, 'b':None}) 5944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertIsInstance(ud, UserDict.UserDict) 5954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_pop(self): 5974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm TestMappingProtocol.test_pop(self) 5984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 5994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 6004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadHash(object): 6024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fail = False 6034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 6044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.fail: 6054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 6064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 6084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 6104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = BadHash() 6114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[x] = 42 6124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.fail = True 6134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.pop, x) 6144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_mutatingiteration(self): 6164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 6174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[1] = 1 6184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 6194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for i in d: 6204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[i+1] = 1 6214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except RuntimeError: 6224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 6234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail("changing dict size during iteration doesn't raise Error") 6254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_repr(self): 6274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 6284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(d), '{}') 6294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[1] = 2 6304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(d), '{1: 2}') 6314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 6324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[1] = d 6334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(repr(d), '{1: {...}}') 6344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 6364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadRepr(object): 6384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __repr__(self): 6394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 6404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._full_mapping({1: BadRepr()}) 6424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, repr, d) 6434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_le(self): 6454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not (self._empty_mapping() < self._empty_mapping())) 6464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(not (self._full_mapping({1: 2}) < self._full_mapping({1L: 2L}))) 6474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 6494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadCmp(object): 6514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __eq__(self, other): 6524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 6534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 6544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 6554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d1 = self._full_mapping({BadCmp(): 1}) 6574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d2 = self._full_mapping({1: 1}) 6584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 6594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d1 < d2 6604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except Exc: 6614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 6624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.fail("< didn't raise Exc") 6644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_setdefault(self): 6664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm TestMappingProtocol.test_setdefault(self) 6674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class Exc(Exception): pass 6694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm class BadHash(object): 6714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm fail = False 6724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __hash__(self): 6734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self.fail: 6744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm raise Exc() 6754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 6764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return 42 6774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 6784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d = self._empty_mapping() 6794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x = BadHash() 6804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm d[x] = 42 6814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm x.fail = True 6824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(Exc, d.setdefault, x, []) 683