14adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Check every path through every method of UserDict
24adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
34adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaofrom test import test_support, mapping_tests
44adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoimport UserDict
54adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
64adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaod0 = {}
74adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaod1 = {"one": 1}
84adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaod2 = {"one": 1, "two": 2}
94adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaod3 = {"one": 1, "two": 3, "three": 5}
104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaod4 = {"one": None, "two": None}
114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaod5 = {"one": 1, "two": 1}
124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass UserDictTest(mapping_tests.TestHashMappingProtocol):
144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    type2test = UserDict.IterableUserDict
154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_all(self):
174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test constructors
184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u = UserDict.UserDict()
194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u0 = UserDict.UserDict(d0)
204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u1 = UserDict.UserDict(d1)
214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u2 = UserDict.IterableUserDict(d2)
224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        uu = UserDict.UserDict(u)
244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        uu0 = UserDict.UserDict(u0)
254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        uu1 = UserDict.UserDict(u1)
264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        uu2 = UserDict.UserDict(u2)
274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # keyword arg constructor
294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(UserDict.UserDict(one=1, two=2), d2)
304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # item sequence constructor
314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(UserDict.UserDict([('one',1), ('two',2)]), d2)
324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(UserDict.UserDict(dict=[('one',1), ('two',2)]), d2)
334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # both together
344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(UserDict.UserDict([('one',1), ('two',2)], two=3, three=5), d3)
354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # alternate constructor
374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(UserDict.UserDict.fromkeys('one two'.split()), d4)
384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(UserDict.UserDict().fromkeys('one two'.split()), d4)
394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(UserDict.UserDict.fromkeys('one two'.split(), 1), d5)
404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(UserDict.UserDict().fromkeys('one two'.split(), 1), d5)
414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(u1.fromkeys('one two'.split()) is not u1)
424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(u1.fromkeys('one two'.split()), UserDict.UserDict)
434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIsInstance(u2.fromkeys('one two'.split()), UserDict.IterableUserDict)
444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test __repr__
464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(str(u0), str(d0))
474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(u1), repr(d1))
484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(repr(u2), repr(d2))
494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test __cmp__ and __len__
514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        all = [d0, d1, d2, u, u0, u1, u2, uu, uu0, uu1, uu2]
524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for a in all:
534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for b in all:
544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(cmp(a, b), cmp(len(a), len(b)))
554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test __getitem__
574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(u2["one"], 1)
584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, u1.__getitem__, "two")
594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test __setitem__
614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u3 = UserDict.UserDict(u2)
624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u3["two"] = 2
634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u3["three"] = 3
644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test __delitem__
664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del u3["three"]
674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, u3.__delitem__, "three")
684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test clear
704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u3.clear()
714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(u3, {})
724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test copy()
744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u2a = u2.copy()
754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(u2a, u2)
764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u2b = UserDict.UserDict(x=42, y=23)
774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        u2c = u2b.copy() # making a copy of a UserDict is special cased
784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(u2b, u2c)
794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class MyUserDict(UserDict.UserDict):
814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def display(self): print self
824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m2 = MyUserDict(u2)
844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m2a = m2.copy()
854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(m2a, m2)
864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # SF bug #476616 -- copy() of UserDict subclass shared data
884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        m2['foo'] = 'bar'
894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotEqual(m2a, m2)
904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test keys, items, values
924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(u2.keys(), d2.keys())
934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(u2.items(), d2.items())
944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(u2.values(), d2.values())
954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test has_key and "in".
974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in u2.keys():
984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertIn(i, u2)
994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(i in u1, i in d1)
1004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(i in u0, i in d0)
1014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            with test_support.check_py3k_warnings():
1024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertTrue(u2.has_key(i))
1034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(u1.has_key(i), d1.has_key(i))
1044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.assertEqual(u0.has_key(i), d0.has_key(i))
1054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test update
1074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = UserDict.UserDict()
1084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t.update(u2)
1094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(t, u2)
1104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class Items:
1114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def items(self):
1124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return (("x", 42), ("y", 23))
1134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = UserDict.UserDict()
1144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t.update(Items())
1154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(t, {"x": 42, "y": 23})
1164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test get
1184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in u2.keys():
1194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(u2.get(i), u2[i])
1204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(u1.get(i), d1.get(i))
1214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(u0.get(i), d0.get(i))
1224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test "in" iteration.
1244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for i in xrange(20):
1254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            u2[i] = str(i)
1264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ikeys = []
1274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for k in u2:
1284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            ikeys.append(k)
1294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        keys = u2.keys()
1304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(set(ikeys), set(keys))
1314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test setdefault
1334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = UserDict.UserDict()
1344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(t.setdefault("x", 42), 42)
1354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(t.has_key("x"))
1364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(t.setdefault("x", 23), 42)
1374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test pop
1394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = UserDict.UserDict(x=42)
1404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(t.pop("x"), 42)
1414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, t.pop, "x")
1424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(t.pop("x", 1), 1)
1434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t["x"] = 42
1444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(t.pop("x", 1), 42)
1454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test popitem
1474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = UserDict.UserDict(x=42)
1484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(t.popitem(), ("x", 42))
1494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, t.popitem)
1504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
1514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_missing(self):
1524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Make sure UserDict doesn't have a __missing__ method
1534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(hasattr(UserDict, "__missing__"), False)
1544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # Test several cases:
1554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (D) subclass defines __missing__ method returning a value
1564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (E) subclass defines __missing__ method raising RuntimeError
1574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (F) subclass sets __missing__ instance variable (no effect)
1584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # (G) subclass doesn't define __missing__ at a all
1594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class D(UserDict.UserDict):
1604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __missing__(self, key):
1614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                return 42
1624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = D({1: 2, 3: 4})
1634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d[1], 2)
1644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d[3], 4)
1654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(2, d)
1664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(2, d.keys())
1674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(d[2], 42)
1684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class E(UserDict.UserDict):
1694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __missing__(self, key):
1704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                raise RuntimeError(key)
1714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        e = E()
1724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            e[42]
1744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except RuntimeError, err:
1754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(err.args, (42,))
1764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("e[42] didn't raise RuntimeError")
1784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class F(UserDict.UserDict):
1794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            def __init__(self):
1804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                # An instance variable __missing__ should have no effect
1814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self.__missing__ = lambda key: None
1824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                UserDict.UserDict.__init__(self)
1834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        f = F()
1844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            f[42]
1864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except KeyError, err:
1874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(err.args, (42,))
1884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("f[42] didn't raise KeyError")
1904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        class G(UserDict.UserDict):
1914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            pass
1924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        g = G()
1934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
1944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            g[42]
1954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except KeyError, err:
1964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.assertEqual(err.args, (42,))
1974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        else:
1984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.fail("g[42] didn't raise KeyError")
1994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao##########################
2014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao# Test Dict Mixin
2024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass SeqDict(UserDict.DictMixin):
2044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """Dictionary lookalike implemented with lists.
2054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    Used to test and demonstrate DictMixin
2074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    """
2084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __init__(self, other=None, **kwargs):
2094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.keylist = []
2104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.valuelist = []
2114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        if other is not None:
2124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            for (key, value) in other:
2134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao                self[key] = value
2144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for (key, value) in kwargs.iteritems():
2154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self[key] = value
2164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __getitem__(self, key):
2174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            i = self.keylist.index(key)
2194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
2204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise KeyError
2214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return self.valuelist[i]
2224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __setitem__(self, key, value):
2234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            i = self.keylist.index(key)
2254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.valuelist[i] = value
2264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
2274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.keylist.append(key)
2284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            self.valuelist.append(value)
2294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def __delitem__(self, key):
2304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        try:
2314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            i = self.keylist.index(key)
2324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        except ValueError:
2334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            raise KeyError
2344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.keylist.pop(i)
2354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.valuelist.pop(i)
2364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def keys(self):
2374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return list(self.keylist)
2384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def copy(self):
2394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = self.__class__()
2404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for key, value in self.iteritems():
2414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            d[key] = value
2424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return d
2434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    @classmethod
2444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def fromkeys(cls, keys, value=None):
2454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        d = cls()
2464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        for key in keys:
2474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao            d[key] = value
2484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        return d
2494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoclass UserDictMixinTest(mapping_tests.TestMappingProtocol):
2514adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    type2test = SeqDict
2524adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2534adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    def test_all(self):
2544adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ## Setup test and verify working of the test class
2554adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2564adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check init
2574adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s = SeqDict()
2584adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2594adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # exercise setitem
2604adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s[10] = 'ten'
2614adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s[20] = 'twenty'
2624adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s[30] = 'thirty'
2634adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2644adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # exercise delitem
2654adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del s[20]
2664adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check getitem and setitem
2674adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s[10], 'ten')
2684adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # check keys() and delitem
2694adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.keys(), [10, 30])
2704adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2714adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        ## Now, test the DictMixin methods one by one
2724adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # has_key
2734adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(s.has_key(10))
2744adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertTrue(not s.has_key(20))
2754adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2764adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # __contains__
2774adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertIn(10, s)
2784adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(20, s)
2794adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2804adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # __iter__
2814adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual([k for k in s], [10, 30])
2824adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2834adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # __len__
2844adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(s), 2)
2854adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2864adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # iteritems
2874adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(list(s.iteritems()), [(10,'ten'), (30, 'thirty')])
2884adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2894adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # iterkeys
2904adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(list(s.iterkeys()), [10, 30])
2914adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2924adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # itervalues
2934adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(list(s.itervalues()), ['ten', 'thirty'])
2944adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2954adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # values
2964adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.values(), ['ten', 'thirty'])
2974adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
2984adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # items
2994adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.items(), [(10,'ten'), (30, 'thirty')])
3004adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3014adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # get
3024adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.get(10), 'ten')
3034adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.get(15,'fifteen'), 'fifteen')
3044adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.get(15), None)
3054adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3064adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # setdefault
3074adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.setdefault(40, 'forty'), 'forty')
3084adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.setdefault(10, 'null'), 'ten')
3094adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        del s[40]
3104adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3114adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # pop
3124adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.pop(10), 'ten')
3134adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(10, s)
3144adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s[10] = 'ten'
3154adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.pop("x", 1), 1)
3164adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s["x"] = 42
3174adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s.pop("x", 1), 42)
3184adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3194adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # popitem
3204adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        k, v = s.popitem()
3214adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertNotIn(k, s)
3224adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s[k] = v
3234adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3244adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # clear
3254adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.clear()
3264adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(len(s), 0)
3274adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3284adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # empty popitem
3294adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertRaises(KeyError, s.popitem)
3304adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3314adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # update
3324adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        s.update({10: 'ten', 20:'twenty'})
3334adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s[10], 'ten')
3344adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s[20], 'twenty')
3354adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3364adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        # cmp
3374adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s, {10: 'ten', 20:'twenty'})
3384adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t = SeqDict()
3394adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t[20] = 'twenty'
3404adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        t[10] = 'ten'
3414adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        self.assertEqual(s, t)
3424adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3434adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaodef test_main():
3444adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_support.run_unittest(
3454adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        UserDictTest,
3464adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao        UserDictMixinTest
3474adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    )
3484adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao
3494adfde8bc82dd39f59e0445588c3e599ada477dJosh Gaoif __name__ == "__main__":
3504adfde8bc82dd39f59e0445588c3e599ada477dJosh Gao    test_main()
351