10a8c90248264a8b26970b4473770bcc3df8515fJosh Gao# tests common to dict and UserDict 20a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport unittest 30a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport UserDict 40a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoimport test_support 50a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 60a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 70a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass BasicTestMappingProtocol(unittest.TestCase): 80a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # This base class can be used to check that an object conforms to the 90a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # mapping protocol 100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Functions that can be useful to override to adapt to dictionary 120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # semantics 130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao type2test = None # which class is being tested (overwrite in subclasses) 140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def _reference(self): 160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Return a dictionary of values which are invariant by storage 170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao in the object under test.""" 180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return {1:2, "key1":"value1", "key2":(1,2,3)} 190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def _empty_mapping(self): 200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Return an empty mapping object""" 210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.type2test() 220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def _full_mapping(self, data): 230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao """Return a mapping object with the value contained in data 240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao dictionary""" 250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = self._empty_mapping() 260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for key, value in data.items(): 270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x[key] = value 280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return x 290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self, *args, **kw): 310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao unittest.TestCase.__init__(self, *args, **kw) 320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.reference = self._reference().copy() 330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # A (key, value) pair not in the mapping 350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key, value = self.reference.popitem() 360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.other = {key:value} 370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # A (key, value) pair in the mapping 390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key, value = self.reference.popitem() 400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.inmapping = {key:value} 410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.reference[key] = value 420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_read(self): 440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Test for read only operations on mapping 450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p = self._empty_mapping() 460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p1 = dict(p) #workaround for singleton objects 470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping(self.reference) 480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if d is p: 490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p = p1 500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #Indexing 510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for key, value in self.reference.items(): 520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d[key], value) 530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao knownkey = self.other.keys()[0] 540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, lambda:d[knownkey]) 550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #len 560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(len(p), 0) 570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(len(d), len(self.reference)) 580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #in 590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for k in self.reference: 600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIn(k, d) 610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for k in self.other: 620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn(k, d) 630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #has_key 640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao with test_support.check_py3k_warnings(quiet=True): 650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for k in self.reference: 660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(d.has_key(k)) 670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for k in self.other: 680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertFalse(d.has_key(k)) 690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #cmp 700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(cmp(p,p), 0) 710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(cmp(d,d), 0) 720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(cmp(p,d), -1) 730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(cmp(d,p), 1) 740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #__non__zero__ 750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if p: self.fail("Empty mapping must compare to False") 760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if not d: self.fail("Full mapping must compare to True") 770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # keys(), items(), iterkeys() ... 780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def check_iterandlist(iter, lst, ref): 790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(hasattr(iter, 'next')) 800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(hasattr(iter, '__iter__')) 810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = list(iter) 820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(set(x)==set(lst)==set(ref)) 830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao check_iterandlist(d.iterkeys(), d.keys(), self.reference.keys()) 840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao check_iterandlist(iter(d), d.keys(), self.reference.keys()) 850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao check_iterandlist(d.itervalues(), d.values(), self.reference.values()) 860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao check_iterandlist(d.iteritems(), d.items(), self.reference.items()) 870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #get 880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key, value = d.iteritems().next() 890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao knownkey, knownvalue = self.other.iteritems().next() 900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get(key, knownvalue), value) 910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get(knownkey, knownvalue), knownvalue) 920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn(knownkey, d) 930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_write(self): 950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Test for write operations on mapping 960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p = self._empty_mapping() 970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #Indexing 980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for key, value in self.reference.items(): 990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p[key] = value 1000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(p[key], value) 1010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for key in self.reference.keys(): 1020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del p[key] 1030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, lambda:p[key]) 1040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p = self._empty_mapping() 1050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #update 1060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p.update(self.reference) 1070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dict(p), self.reference) 1080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao items = p.items() 1090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p = self._empty_mapping() 1100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p.update(items) 1110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dict(p), self.reference) 1120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping(self.reference) 1130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #setdefault 1140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key, value = d.iteritems().next() 1150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao knownkey, knownvalue = self.other.iteritems().next() 1160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.setdefault(key, knownvalue), value) 1170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d[key], value) 1180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.setdefault(knownkey, knownvalue), knownvalue) 1190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d[knownkey], knownvalue) 1200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #pop 1210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.pop(knownkey), knownvalue) 1220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn(knownkey, d) 1230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, d.pop, knownkey) 1240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao default = 909 1250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[knownkey] = knownvalue 1260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.pop(knownkey, default), knownvalue) 1270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn(knownkey, d) 1280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.pop(knownkey, default), default) 1290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao #popitem 1300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao key, value = d.popitem() 1310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn(key, d) 1320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(value, self.reference[key]) 1330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao p=self._empty_mapping() 1340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, p.popitem) 1350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_constructor(self): 1370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(self._empty_mapping(), self._empty_mapping()) 1380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_bool(self): 1400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not self._empty_mapping()) 1410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(self.reference) 1420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(bool(self._empty_mapping()) is False) 1430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(bool(self.reference) is True) 1440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_keys(self): 1460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 1470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.keys(), []) 1480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self.reference 1490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIn(self.inmapping.keys()[0], d.keys()) 1500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn(self.other.keys()[0], d.keys()) 1510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.keys, None) 1520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_values(self): 1540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 1550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.values(), []) 1560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.values, None) 1580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_items(self): 1600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 1610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.items(), []) 1620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.items, None) 1640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_len(self): 1660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 1670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(len(d), 0) 1680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_getitem(self): 1700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self.reference 1710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d[self.inmapping.keys()[0]], self.inmapping.values()[0]) 1720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.__getitem__) 1740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_update(self): 1760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # mapping argument 1770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 1780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(self.other) 1790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.items(), self.other.items()) 1800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # No argument 1820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 1830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update() 1840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, self._empty_mapping()) 1850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # item sequence 1870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 1880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(self.other.items()) 1890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.items(), self.other.items()) 1900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Iterator 1920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 1930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(self.other.iteritems()) 1940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.items(), self.other.items()) 1950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 1960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # FIXME: Doesn't work with UserDict 1970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # self.assertRaises((TypeError, AttributeError), d.update, None) 1980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises((TypeError, AttributeError), d.update, 42) 1990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao outerself = self 2010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class SimpleUserDict: 2020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self): 2030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.d = outerself.reference 2040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def keys(self): 2050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.d.keys() 2060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __getitem__(self, i): 2070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.d[i] 2080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.clear() 2090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(SimpleUserDict()) 2100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao i1 = d.items() 2110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao i2 = self.reference.items() 2120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def safe_sort_key(kv): 2140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao k, v = kv 2150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return id(type(k)), id(type(v)), k, v 2160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao i1.sort(key=safe_sort_key) 2170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao i2.sort(key=safe_sort_key) 2180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(i1, i2) 2190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Exc(Exception): pass 2210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 2230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class FailingUserDict: 2240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def keys(self): 2250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc 2260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, d.update, FailingUserDict()) 2270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.clear() 2290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class FailingUserDict: 2310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def keys(self): 2320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BogonIter: 2330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self): 2340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.i = 1 2350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 2360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 2370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 2380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.i: 2390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.i = 0 2400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 'a' 2410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc 2420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return BogonIter() 2430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __getitem__(self, key): 2440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return key 2450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, d.update, FailingUserDict()) 2460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class FailingUserDict: 2480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def keys(self): 2490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BogonIter: 2500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self): 2510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.i = ord('a') 2520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 2530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 2540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 2550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.i <= ord('z'): 2560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao rtn = chr(self.i) 2570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.i += 1 2580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return rtn 2590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise StopIteration 2600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return BogonIter() 2610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __getitem__(self, key): 2620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc 2630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, d.update, FailingUserDict()) 2640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 2660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class badseq(object): 2670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 2680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 2690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 2700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 2710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, d.update, badseq()) 2730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(ValueError, d.update, [(1, 2, 3)]) 2750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # no test_fromkeys or test_copy as both os.environ and selves don't support it 2770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_get(self): 2790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 2800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(d.get(self.other.keys()[0]) is None) 2810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get(self.other.keys()[0], 3), 3) 2820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self.reference 2830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(d.get(self.other.keys()[0]) is None) 2840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get(self.other.keys()[0], 3), 3) 2850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get(self.inmapping.keys()[0]), self.inmapping.values()[0]) 2860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get(self.inmapping.keys()[0], 3), self.inmapping.values()[0]) 2870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.get) 2880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.get, None, None, None) 2890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_setdefault(self): 2910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 2920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.setdefault) 2930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_popitem(self): 2950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 2960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, d.popitem) 2970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.popitem, 42) 2980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 2990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_pop(self): 3000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 3010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao k, v = self.inmapping.items()[0] 3020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[k] = v 3030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, d.pop, self.other.keys()[0]) 3040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.pop(k), v) 3060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(len(d), 0) 3070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, d.pop, k) 3090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3110a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass TestMappingProtocol(BasicTestMappingProtocol): 3120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_constructor(self): 3130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_constructor(self) 3140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(self._empty_mapping() is not self._empty_mapping()) 3150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(self.type2test(x=1, y=2), {"x": 1, "y": 2}) 3160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_bool(self): 3180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_bool(self) 3190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not self._empty_mapping()) 3200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(self._full_mapping({"x": "y"})) 3210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(bool(self._empty_mapping()) is False) 3220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(bool(self._full_mapping({"x": "y"})) is True) 3230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_keys(self): 3250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_keys(self) 3260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 3270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.keys(), []) 3280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({'a': 1, 'b': 2}) 3290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao k = d.keys() 3300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIn('a', k) 3310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIn('b', k) 3320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn('c', k) 3330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_values(self): 3350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_values(self) 3360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({1:2}) 3370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.values(), [2]) 3380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_items(self): 3400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_items(self) 3410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({1:2}) 3430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.items(), [(1, 2)]) 3440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_has_key(self): 3460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 3470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not d.has_key('a')) 3480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({'a': 1, 'b': 2}) 3490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao k = d.keys() 3500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao k.sort(key=lambda k: (id(type(k)), k)) 3510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(k, ['a', 'b']) 3520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.has_key) 3540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_contains(self): 3560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 3570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn('a', d) 3580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not ('a' in d)) 3590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue('a' not in d) 3600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({'a': 1, 'b': 2}) 3610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIn('a', d) 3620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIn('b', d) 3630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertNotIn('c', d) 3640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.__contains__) 3660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_len(self): 3680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_len(self) 3690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({'a': 1, 'b': 2}) 3700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(len(d), 2) 3710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_getitem(self): 3730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_getitem(self) 3740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({'a': 1, 'b': 2}) 3750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d['a'], 1) 3760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d['b'], 2) 3770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d['c'] = 3 3780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d['a'] = 4 3790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d['c'], 3) 3800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d['a'], 4) 3810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao del d['b'] 3820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {'a': 4, 'c': 3}) 3830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.__getitem__) 3850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_clear(self): 3870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({1:1, 2:2, 3:3}) 3880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.clear() 3890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {}) 3900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.clear, None) 3920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 3930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_update(self): 3940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_update(self) 3950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # mapping argument 3960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 3970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update({1:100}) 3980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update({2:20}) 3990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update({1:1, 2:2, 3:3}) 4000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {1:1, 2:2, 3:3}) 4010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # no argument 4030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update() 4040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {1:1, 2:2, 3:3}) 4050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # keyword arguments 4070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 4080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(x=100) 4090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(y=20) 4100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(x=1, y=2, z=3) 4110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {"x":1, "y":2, "z":3}) 4120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # item sequence 4140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 4150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update([("x", 100), ("y", 20)]) 4160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {"x":100, "y":20}) 4170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Both item sequence and keyword arguments 4190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 4200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update([("x", 100), ("y", 20)], x=1, y=2) 4210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {"x":1, "y":2}) 4220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # iterator 4240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({1:3, 2:4}) 4250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(self._full_mapping({1:2, 3:4, 5:6}).iteritems()) 4260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {1:2, 2:4, 3:4, 5:6}) 4270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class SimpleUserDict: 4290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self): 4300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.d = {1:1, 2:2, 3:3} 4310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def keys(self): 4320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.d.keys() 4330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __getitem__(self, i): 4340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self.d[i] 4350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.clear() 4360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.update(SimpleUserDict()) 4370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d, {1:1, 2:2, 3:3}) 4380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_fromkeys(self): 4400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(self.type2test.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) 4410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 4420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not(d.fromkeys('abc') is d)) 4430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.fromkeys('abc'), {'a':None, 'b':None, 'c':None}) 4440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.fromkeys((4,5),0), {4:0, 5:0}) 4450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.fromkeys([]), {}) 4460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def g(): 4470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao yield 1 4480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.fromkeys(g()), {1:None}) 4490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, {}.fromkeys, 3) 4500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class dictlike(self.type2test): pass 4510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dictlike.fromkeys('a'), {'a':None}) 4520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(dictlike().fromkeys('a'), {'a':None}) 4530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(dictlike.fromkeys('a').__class__ is dictlike) 4540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(dictlike().fromkeys('a').__class__ is dictlike) 4550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # FIXME: the following won't work with UserDict, because it's an old style class 4560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # self.assertTrue(type(dictlike.fromkeys('a')) is dictlike) 4570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class mydict(self.type2test): 4580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __new__(cls): 4590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return UserDict.UserDict() 4600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ud = mydict.fromkeys('ab') 4610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(ud, {'a':None, 'b':None}) 4620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # FIXME: the following won't work with UserDict, because it's an old style class 4630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # self.assertIsInstance(ud, UserDict.UserDict) 4640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, dict.fromkeys) 4650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Exc(Exception): pass 4670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class baddict1(self.type2test): 4690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __init__(self): 4700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 4710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, baddict1.fromkeys, [1]) 4730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BadSeq(object): 4750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __iter__(self): 4760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return self 4770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def next(self): 4780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 4790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, self.type2test.fromkeys, BadSeq()) 4810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class baddict2(self.type2test): 4830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __setitem__(self, key, value): 4840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 4850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, baddict2.fromkeys, [1]) 4870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_copy(self): 4890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({1:1, 2:2, 3:3}) 4900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.copy(), {1:1, 2:2, 3:3}) 4910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 4920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.copy(), d) 4930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIsInstance(d.copy(), d.__class__) 4940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(TypeError, d.copy, None) 4950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 4960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_get(self): 4970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_get(self) 4980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 4990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(d.get('c') is None) 5000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get('c', 3), 3) 5010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({'a' : 1, 'b' : 2}) 5020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(d.get('c') is None) 5030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get('c', 3), 3) 5040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get('a'), 1) 5050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.get('a', 3), 1) 5060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_setdefault(self): 5080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_setdefault(self) 5090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 5100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(d.setdefault('key0') is None) 5110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.setdefault('key0', []) 5120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(d.setdefault('key0') is None) 5130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.setdefault('key', []).append(3) 5140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d['key'][0], 3) 5150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d.setdefault('key', []).append(4) 5160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(len(d['key']), 2) 5170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_popitem(self): 5190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_popitem(self) 5200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for copymode in -1, +1: 5210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # -1: b has same structure as a 5220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # +1: b is a.copy() 5230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for log2size in range(12): 5240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao size = 2**log2size 5250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao a = self._empty_mapping() 5260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao b = self._empty_mapping() 5270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for i in range(size): 5280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao a[repr(i)] = i 5290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if copymode < 0: 5300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao b[repr(i)] = i 5310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if copymode > 0: 5320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao b = a.copy() 5330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for i in range(size): 5340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ka, va = ta = a.popitem() 5350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(va, int(ka)) 5360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao kb, vb = tb = b.popitem() 5370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(vb, int(kb)) 5380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not(copymode < 0 and ta != tb)) 5390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not a) 5400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not b) 5410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_pop(self): 5430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao BasicTestMappingProtocol.test_pop(self) 5440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # Tests for pop with specified key 5460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 5470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao k, v = 'abc', 'def' 5480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # verify longs/ints get same value when key > 32 bits (for 64-bit archs) 5500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao # see SF bug #689659 5510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = 4503599627370496L 5520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao y = 4503599627370496 5530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao h = self._full_mapping({x: 'anything', y: 'something else'}) 5540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(h[x], h[y]) 5550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.pop(k, v), v) 5570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[k] = v 5580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(d.pop(k, 1), v) 5590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5610a8c90248264a8b26970b4473770bcc3df8515fJosh Gaoclass TestHashMappingProtocol(TestMappingProtocol): 5620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_getitem(self): 5640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao TestMappingProtocol.test_getitem(self) 5650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Exc(Exception): pass 5660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BadEq(object): 5680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __eq__(self, other): 5690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 5700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __hash__(self): 5710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 24 5720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 5740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[BadEq()] = 42 5750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(KeyError, d.__getitem__, 23) 5760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BadHash(object): 5780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao fail = False 5790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __hash__(self): 5800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.fail: 5810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 5820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 5830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 42 5840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 5860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = BadHash() 5870a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[x] = 42 5880a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.fail = True 5890a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, d.__getitem__, x) 5900a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 5910a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_fromkeys(self): 5920a8c90248264a8b26970b4473770bcc3df8515fJosh Gao TestMappingProtocol.test_fromkeys(self) 5930a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class mydict(self.type2test): 5940a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __new__(cls): 5950a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return UserDict.UserDict() 5960a8c90248264a8b26970b4473770bcc3df8515fJosh Gao ud = mydict.fromkeys('ab') 5970a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(ud, {'a':None, 'b':None}) 5980a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertIsInstance(ud, UserDict.UserDict) 5990a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6000a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_pop(self): 6010a8c90248264a8b26970b4473770bcc3df8515fJosh Gao TestMappingProtocol.test_pop(self) 6020a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6030a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Exc(Exception): pass 6040a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6050a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BadHash(object): 6060a8c90248264a8b26970b4473770bcc3df8515fJosh Gao fail = False 6070a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __hash__(self): 6080a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.fail: 6090a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 6100a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 6110a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 42 6120a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6130a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 6140a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = BadHash() 6150a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[x] = 42 6160a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.fail = True 6170a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, d.pop, x) 6180a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6190a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_mutatingiteration(self): 6200a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 6210a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[1] = 1 6220a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 6230a8c90248264a8b26970b4473770bcc3df8515fJosh Gao for i in d: 6240a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[i+1] = 1 6250a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except RuntimeError: 6260a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 6270a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 6280a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.fail("changing dict size during iteration doesn't raise Error") 6290a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6300a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_repr(self): 6310a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 6320a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(repr(d), '{}') 6330a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[1] = 2 6340a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(repr(d), '{1: 2}') 6350a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 6360a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[1] = d 6370a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertEqual(repr(d), '{1: {...}}') 6380a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6390a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Exc(Exception): pass 6400a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6410a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BadRepr(object): 6420a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __repr__(self): 6430a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 6440a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6450a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._full_mapping({1: BadRepr()}) 6460a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, repr, d) 6470a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6480a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_le(self): 6490a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not (self._empty_mapping() < self._empty_mapping())) 6500a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertTrue(not (self._full_mapping({1: 2}) < self._full_mapping({1L: 2L}))) 6510a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6520a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Exc(Exception): pass 6530a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6540a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BadCmp(object): 6550a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __eq__(self, other): 6560a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 6570a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __hash__(self): 6580a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 42 6590a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6600a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d1 = self._full_mapping({BadCmp(): 1}) 6610a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d2 = self._full_mapping({1: 1}) 6620a8c90248264a8b26970b4473770bcc3df8515fJosh Gao try: 6630a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d1 < d2 6640a8c90248264a8b26970b4473770bcc3df8515fJosh Gao except Exc: 6650a8c90248264a8b26970b4473770bcc3df8515fJosh Gao pass 6660a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 6670a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.fail("< didn't raise Exc") 6680a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6690a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def test_setdefault(self): 6700a8c90248264a8b26970b4473770bcc3df8515fJosh Gao TestMappingProtocol.test_setdefault(self) 6710a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6720a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class Exc(Exception): pass 6730a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6740a8c90248264a8b26970b4473770bcc3df8515fJosh Gao class BadHash(object): 6750a8c90248264a8b26970b4473770bcc3df8515fJosh Gao fail = False 6760a8c90248264a8b26970b4473770bcc3df8515fJosh Gao def __hash__(self): 6770a8c90248264a8b26970b4473770bcc3df8515fJosh Gao if self.fail: 6780a8c90248264a8b26970b4473770bcc3df8515fJosh Gao raise Exc() 6790a8c90248264a8b26970b4473770bcc3df8515fJosh Gao else: 6800a8c90248264a8b26970b4473770bcc3df8515fJosh Gao return 42 6810a8c90248264a8b26970b4473770bcc3df8515fJosh Gao 6820a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d = self._empty_mapping() 6830a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x = BadHash() 6840a8c90248264a8b26970b4473770bcc3df8515fJosh Gao d[x] = 42 6850a8c90248264a8b26970b4473770bcc3df8515fJosh Gao x.fail = True 6860a8c90248264a8b26970b4473770bcc3df8515fJosh Gao self.assertRaises(Exc, d.setdefault, x, []) 687