14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# tests common to dict and UserDict
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport unittest
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport UserDict
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport test_support
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass BasicTestMappingProtocol(unittest.TestCase):
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # This base class can be used to check that an object conforms to the
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # mapping protocol
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # Functions that can be useful to override to adapt to dictionary
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # semantics
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    type2test = None # which class is being tested (overwrite in subclasses)
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _reference(self):
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return a dictionary of values which are invariant by storage
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        in the object under test."""
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return {1:2, "key1":"value1", "key2":(1,2,3)}
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _empty_mapping(self):
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return an empty mapping object"""
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.type2test()
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def _full_mapping(self, data):
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        """Return a mapping object with the value contained in data
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        dictionary"""
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = self._empty_mapping()
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for key, value in data.items():
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x[key] = value
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return x
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, *args, **kw):
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        unittest.TestCase.__init__(self, *args, **kw)
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.reference = self._reference().copy()
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # A (key, value) pair not in the mapping
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key, value = self.reference.popitem()
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.other = {key:value}
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # A (key, value) pair in the mapping
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key, value = self.reference.popitem()
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.inmapping = {key:value}
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.reference[key] = value
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_read(self):
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test for read only operations on mapping
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p = self._empty_mapping()
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p1 = dict(p) #workaround for singleton objects
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping(self.reference)
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if d is p:
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            p = p1
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #Indexing
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for key, value in self.reference.items():
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(d[key], value)
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        knownkey = self.other.keys()[0]
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, lambda:d[knownkey])
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #len
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(p), 0)
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(d), len(self.reference))
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #in
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for k in self.reference:
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(k, d)
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for k in self.other:
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertNotIn(k, d)
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #has_key
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        with test_support.check_py3k_warnings(quiet=True):
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for k in self.reference:
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(d.has_key(k))
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for k in self.other:
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertFalse(d.has_key(k))
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #cmp
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cmp(p,p), 0)
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cmp(d,d), 0)
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cmp(p,d), -1)
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(cmp(d,p), 1)
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #__non__zero__
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if p: self.fail("Empty mapping must compare to False")
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if not d: self.fail("Full mapping must compare to True")
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # keys(), items(), iterkeys() ...
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def check_iterandlist(iter, lst, ref):
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(hasattr(iter, 'next'))
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(hasattr(iter, '__iter__'))
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            x = list(iter)
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertTrue(set(x)==set(lst)==set(ref))
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_iterandlist(d.iterkeys(), d.keys(), self.reference.keys())
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_iterandlist(iter(d), d.keys(), self.reference.keys())
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_iterandlist(d.itervalues(), d.values(), self.reference.values())
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        check_iterandlist(d.iteritems(), d.items(), self.reference.items())
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #get
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key, value = d.iteritems().next()
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        knownkey, knownvalue = self.other.iteritems().next()
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get(key, knownvalue), value)
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get(knownkey, knownvalue), knownvalue)
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(knownkey, d)
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_write(self):
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test for write operations on mapping
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p = self._empty_mapping()
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #Indexing
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for key, value in self.reference.items():
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            p[key] = value
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(p[key], value)
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for key in self.reference.keys():
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            del p[key]
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertRaises(KeyError, lambda:p[key])
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p = self._empty_mapping()
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #update
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p.update(self.reference)
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(dict(p), self.reference)
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        items = p.items()
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p = self._empty_mapping()
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p.update(items)
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(dict(p), self.reference)
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping(self.reference)
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #setdefault
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key, value = d.iteritems().next()
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        knownkey, knownvalue = self.other.iteritems().next()
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.setdefault(key, knownvalue), value)
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d[key], value)
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.setdefault(knownkey, knownvalue), knownvalue)
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d[knownkey], knownvalue)
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #pop
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.pop(knownkey), knownvalue)
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(knownkey, d)
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, d.pop, knownkey)
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        default = 909
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[knownkey] = knownvalue
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.pop(knownkey, default), knownvalue)
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(knownkey, d)
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.pop(knownkey, default), default)
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        #popitem
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        key, value = d.popitem()
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(key, d)
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(value, self.reference[key])
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        p=self._empty_mapping()
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, p.popitem)
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_constructor(self):
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self._empty_mapping(), self._empty_mapping())
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_bool(self):
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not self._empty_mapping())
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(self.reference)
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(bool(self._empty_mapping()) is False)
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(bool(self.reference) is True)
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_keys(self):
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.keys(), [])
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self.reference
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn(self.inmapping.keys()[0], d.keys())
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(self.other.keys()[0], d.keys())
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.keys, None)
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_values(self):
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.values(), [])
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.values, None)
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_items(self):
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.items(), [])
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.items, None)
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_len(self):
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(d), 0)
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_getitem(self):
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self.reference
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d[self.inmapping.keys()[0]], self.inmapping.values()[0])
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.__getitem__)
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_update(self):
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # mapping argument
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(self.other)
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.items(), self.other.items())
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # No argument
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update()
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, self._empty_mapping())
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # item sequence
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(self.other.items())
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.items(), self.other.items())
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Iterator
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(self.other.iteritems())
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.items(), self.other.items())
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # FIXME: Doesn't work with UserDict
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # self.assertRaises((TypeError, AttributeError), d.update, None)
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises((TypeError, AttributeError), d.update, 42)
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        outerself = self
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class SimpleUserDict:
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self):
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.d = outerself.reference
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def keys(self):
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.d.keys()
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __getitem__(self, i):
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.d[i]
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.clear()
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(SimpleUserDict())
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        i1 = d.items()
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        i2 = self.reference.items()
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def safe_sort_key(kv):
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            k, v = kv
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            return id(type(k)), id(type(v)), k, v
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        i1.sort(key=safe_sort_key)
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        i2.sort(key=safe_sort_key)
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(i1, i2)
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Exc(Exception): pass
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class FailingUserDict:
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def keys(self):
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, d.update, FailingUserDict())
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.clear()
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class FailingUserDict:
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def keys(self):
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                class BogonIter:
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def __init__(self):
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.i = 1
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def __iter__(self):
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        return self
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def next(self):
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        if self.i:
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            self.i = 0
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            return 'a'
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        raise Exc
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return BogonIter()
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __getitem__(self, key):
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return key
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, d.update, FailingUserDict())
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class FailingUserDict:
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def keys(self):
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                class BogonIter:
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def __init__(self):
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        self.i = ord('a')
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def __iter__(self):
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        return self
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    def next(self):
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        if self.i <= ord('z'):
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            rtn = chr(self.i)
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            self.i += 1
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                            return rtn
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        raise StopIteration
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return BogonIter()
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __getitem__(self, key):
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, d.update, FailingUserDict())
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class badseq(object):
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __iter__(self):
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def next(self):
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc()
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, d.update, badseq())
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(ValueError, d.update, [(1, 2, 3)])
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    # no test_fromkeys or test_copy as both os.environ and selves don't support it
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_get(self):
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(d.get(self.other.keys()[0]) is None)
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get(self.other.keys()[0], 3), 3)
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self.reference
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(d.get(self.other.keys()[0]) is None)
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get(self.other.keys()[0], 3), 3)
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get(self.inmapping.keys()[0]), self.inmapping.values()[0])
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get(self.inmapping.keys()[0], 3), self.inmapping.values()[0])
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.get)
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.get, None, None, None)
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_setdefault(self):
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.setdefault)
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_popitem(self):
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, d.popitem)
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.popitem, 42)
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_pop(self):
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k, v = self.inmapping.items()[0]
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[k] = v
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, d.pop, self.other.keys()[0])
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.pop(k), v)
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(d), 0)
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, d.pop, k)
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestMappingProtocol(BasicTestMappingProtocol):
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_constructor(self):
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_constructor(self)
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(self._empty_mapping() is not self._empty_mapping())
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test(x=1, y=2), {"x": 1, "y": 2})
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_bool(self):
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_bool(self)
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not self._empty_mapping())
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(self._full_mapping({"x": "y"}))
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(bool(self._empty_mapping()) is False)
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(bool(self._full_mapping({"x": "y"})) is True)
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_keys(self):
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_keys(self)
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.keys(), [])
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({'a': 1, 'b': 2})
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k = d.keys()
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('a', k)
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('b', k)
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn('c', k)
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_values(self):
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_values(self)
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({1:2})
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.values(), [2])
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_items(self):
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_items(self)
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({1:2})
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.items(), [(1, 2)])
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_has_key(self):
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not d.has_key('a'))
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({'a': 1, 'b': 2})
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k = d.keys()
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k.sort(key=lambda k: (id(type(k)), k))
3514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(k, ['a', 'b'])
3524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.has_key)
3544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_contains(self):
3564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
3574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn('a', d)
3584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not ('a' in d))
3594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue('a' not in d)
3604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({'a': 1, 'b': 2})
3614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('a', d)
3624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn('b', d)
3634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn('c', d)
3644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.__contains__)
3664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_len(self):
3684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_len(self)
3694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({'a': 1, 'b': 2})
3704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(d), 2)
3714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_getitem(self):
3734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_getitem(self)
3744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({'a': 1, 'b': 2})
3754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d['a'], 1)
3764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d['b'], 2)
3774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d['c'] = 3
3784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d['a'] = 4
3794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d['c'], 3)
3804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d['a'], 4)
3814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del d['b']
3824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {'a': 4, 'c': 3})
3834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.__getitem__)
3854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_clear(self):
3874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({1:1, 2:2, 3:3})
3884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.clear()
3894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {})
3904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.clear, None)
3924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_update(self):
3944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_update(self)
3954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # mapping argument
3964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
3974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update({1:100})
3984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update({2:20})
3994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update({1:1, 2:2, 3:3})
4004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {1:1, 2:2, 3:3})
4014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # no argument
4034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update()
4044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {1:1, 2:2, 3:3})
4054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # keyword arguments
4074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
4084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(x=100)
4094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(y=20)
4104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(x=1, y=2, z=3)
4114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {"x":1, "y":2, "z":3})
4124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # item sequence
4144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
4154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update([("x", 100), ("y", 20)])
4164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {"x":100, "y":20})
4174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Both item sequence and keyword arguments
4194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
4204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update([("x", 100), ("y", 20)], x=1, y=2)
4214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {"x":1, "y":2})
4224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # iterator
4244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({1:3, 2:4})
4254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(self._full_mapping({1:2, 3:4, 5:6}).iteritems())
4264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {1:2, 2:4, 3:4, 5:6})
4274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class SimpleUserDict:
4294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self):
4304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.d = {1:1, 2:2, 3:3}
4314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def keys(self):
4324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.d.keys()
4334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __getitem__(self, i):
4344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self.d[i]
4354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.clear()
4364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.update(SimpleUserDict())
4374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d, {1:1, 2:2, 3:3})
4384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_fromkeys(self):
4404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(self.type2test.fromkeys('abc'), {'a':None, 'b':None, 'c':None})
4414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
4424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not(d.fromkeys('abc') is d))
4434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.fromkeys('abc'), {'a':None, 'b':None, 'c':None})
4444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.fromkeys((4,5),0), {4:0, 5:0})
4454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.fromkeys([]), {})
4464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        def g():
4474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            yield 1
4484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.fromkeys(g()), {1:None})
4494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, {}.fromkeys, 3)
4504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class dictlike(self.type2test): pass
4514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(dictlike.fromkeys('a'), {'a':None})
4524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(dictlike().fromkeys('a'), {'a':None})
4534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(dictlike.fromkeys('a').__class__ is dictlike)
4544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(dictlike().fromkeys('a').__class__ is dictlike)
4554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # FIXME: the following won't work with UserDict, because it's an old style class
4564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # self.assertTrue(type(dictlike.fromkeys('a')) is dictlike)
4574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class mydict(self.type2test):
4584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __new__(cls):
4594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return UserDict.UserDict()
4604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ud = mydict.fromkeys('ab')
4614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ud, {'a':None, 'b':None})
4624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # FIXME: the following won't work with UserDict, because it's an old style class
4634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # self.assertIsInstance(ud, UserDict.UserDict)
4644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, dict.fromkeys)
4654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Exc(Exception): pass
4674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class baddict1(self.type2test):
4694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self):
4704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc()
4714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, baddict1.fromkeys, [1])
4734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class BadSeq(object):
4754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __iter__(self):
4764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return self
4774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def next(self):
4784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc()
4794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, self.type2test.fromkeys, BadSeq())
4814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class baddict2(self.type2test):
4834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __setitem__(self, key, value):
4844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc()
4854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, baddict2.fromkeys, [1])
4874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_copy(self):
4894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({1:1, 2:2, 3:3})
4904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.copy(), {1:1, 2:2, 3:3})
4914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
4924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.copy(), d)
4934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(d.copy(), d.__class__)
4944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(TypeError, d.copy, None)
4954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
4964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_get(self):
4974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_get(self)
4984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
4994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(d.get('c') is None)
5004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get('c', 3), 3)
5014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({'a' : 1, 'b' : 2})
5024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(d.get('c') is None)
5034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get('c', 3), 3)
5044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get('a'), 1)
5054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.get('a', 3), 1)
5064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_setdefault(self):
5084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_setdefault(self)
5094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
5104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(d.setdefault('key0') is None)
5114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.setdefault('key0', [])
5124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(d.setdefault('key0') is None)
5134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.setdefault('key', []).append(3)
5144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d['key'][0], 3)
5154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d.setdefault('key', []).append(4)
5164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(d['key']), 2)
5174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_popitem(self):
5194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_popitem(self)
5204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for copymode in -1, +1:
5214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # -1: b has same structure as a
5224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            # +1: b is a.copy()
5234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for log2size in range(12):
5244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                size = 2**log2size
5254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                a = self._empty_mapping()
5264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                b = self._empty_mapping()
5274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for i in range(size):
5284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    a[repr(i)] = i
5294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    if copymode < 0:
5304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                        b[repr(i)] = i
5314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if copymode > 0:
5324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    b = a.copy()
5334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                for i in range(size):
5344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    ka, va = ta = a.popitem()
5354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertEqual(va, int(ka))
5364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    kb, vb = tb = b.popitem()
5374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertEqual(vb, int(kb))
5384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    self.assertTrue(not(copymode < 0 and ta != tb))
5394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(not a)
5404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(not b)
5414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_pop(self):
5434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        BasicTestMappingProtocol.test_pop(self)
5444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Tests for pop with specified key
5464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
5474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k, v = 'abc', 'def'
5484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # verify longs/ints get same value when key > 32 bits (for 64-bit archs)
5504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # see SF bug #689659
5514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = 4503599627370496L
5524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        y = 4503599627370496
5534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        h = self._full_mapping({x: 'anything', y: 'something else'})
5544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(h[x], h[y])
5554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.pop(k, v), v)
5574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[k] = v
5584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d.pop(k, 1), v)
5594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass TestHashMappingProtocol(TestMappingProtocol):
5624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_getitem(self):
5644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestMappingProtocol.test_getitem(self)
5654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Exc(Exception): pass
5664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class BadEq(object):
5684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __eq__(self, other):
5694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc()
5704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __hash__(self):
5714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 24
5724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
5744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[BadEq()] = 42
5754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, d.__getitem__, 23)
5764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class BadHash(object):
5784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            fail = False
5794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __hash__(self):
5804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if self.fail:
5814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise Exc()
5824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
5834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return 42
5844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
5864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = BadHash()
5874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[x] = 42
5884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x.fail = True
5894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, d.__getitem__, x)
5904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
5914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_fromkeys(self):
5924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestMappingProtocol.test_fromkeys(self)
5934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class mydict(self.type2test):
5944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __new__(cls):
5954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return UserDict.UserDict()
5964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ud = mydict.fromkeys('ab')
5974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(ud, {'a':None, 'b':None})
5984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(ud, UserDict.UserDict)
5994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_pop(self):
6014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestMappingProtocol.test_pop(self)
6024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Exc(Exception): pass
6044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class BadHash(object):
6064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            fail = False
6074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __hash__(self):
6084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if self.fail:
6094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise Exc()
6104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
6114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return 42
6124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
6144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = BadHash()
6154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[x] = 42
6164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x.fail = True
6174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, d.pop, x)
6184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_mutatingiteration(self):
6204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
6214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[1] = 1
6224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for i in d:
6244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                d[i+1] = 1
6254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except RuntimeError:
6264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
6274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
6284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("changing dict size during iteration doesn't raise Error")
6294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_repr(self):
6314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
6324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(d), '{}')
6334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[1] = 2
6344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(d), '{1: 2}')
6354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
6364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[1] = d
6374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(d), '{1: {...}}')
6384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Exc(Exception): pass
6404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class BadRepr(object):
6424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __repr__(self):
6434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc()
6444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._full_mapping({1: BadRepr()})
6464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, repr, d)
6474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_le(self):
6494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not (self._empty_mapping() < self._empty_mapping()))
6504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not (self._full_mapping({1: 2}) < self._full_mapping({1L: 2L})))
6514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Exc(Exception): pass
6534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class BadCmp(object):
6554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __eq__(self, other):
6564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise Exc()
6574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __hash__(self):
6584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 42
6594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d1 = self._full_mapping({BadCmp(): 1})
6614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d2 = self._full_mapping({1: 1})
6624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
6634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            d1 < d2
6644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except Exc:
6654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
6664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
6674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("< didn't raise Exc")
6684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_setdefault(self):
6704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        TestMappingProtocol.test_setdefault(self)
6714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Exc(Exception): pass
6734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class BadHash(object):
6754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            fail = False
6764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __hash__(self):
6774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                if self.fail:
6784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    raise Exc()
6794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                else:
6804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                    return 42
6814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
6824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self._empty_mapping()
6834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x = BadHash()
6844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d[x] = 42
6854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        x.fail = True
6864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(Exc, d.setdefault, x, [])
687