python-2.5.2/win32/Lib/test/test_userdict.py
changeset 0 ae805ac0140d
equal deleted inserted replaced
-1:000000000000 0:ae805ac0140d
       
     1 # Check every path through every method of UserDict
       
     2 
       
     3 import unittest
       
     4 from test import test_support, mapping_tests
       
     5 import UserDict
       
     6 
       
     7 d0 = {}
       
     8 d1 = {"one": 1}
       
     9 d2 = {"one": 1, "two": 2}
       
    10 d3 = {"one": 1, "two": 3, "three": 5}
       
    11 d4 = {"one": None, "two": None}
       
    12 d5 = {"one": 1, "two": 1}
       
    13 
       
    14 class UserDictTest(mapping_tests.TestHashMappingProtocol):
       
    15     type2test = UserDict.IterableUserDict
       
    16 
       
    17     def test_all(self):
       
    18         # Test constructors
       
    19         u = UserDict.UserDict()
       
    20         u0 = UserDict.UserDict(d0)
       
    21         u1 = UserDict.UserDict(d1)
       
    22         u2 = UserDict.IterableUserDict(d2)
       
    23 
       
    24         uu = UserDict.UserDict(u)
       
    25         uu0 = UserDict.UserDict(u0)
       
    26         uu1 = UserDict.UserDict(u1)
       
    27         uu2 = UserDict.UserDict(u2)
       
    28 
       
    29         # keyword arg constructor
       
    30         self.assertEqual(UserDict.UserDict(one=1, two=2), d2)
       
    31         # item sequence constructor
       
    32         self.assertEqual(UserDict.UserDict([('one',1), ('two',2)]), d2)
       
    33         self.assertEqual(UserDict.UserDict(dict=[('one',1), ('two',2)]), d2)
       
    34         # both together
       
    35         self.assertEqual(UserDict.UserDict([('one',1), ('two',2)], two=3, three=5), d3)
       
    36 
       
    37         # alternate constructor
       
    38         self.assertEqual(UserDict.UserDict.fromkeys('one two'.split()), d4)
       
    39         self.assertEqual(UserDict.UserDict().fromkeys('one two'.split()), d4)
       
    40         self.assertEqual(UserDict.UserDict.fromkeys('one two'.split(), 1), d5)
       
    41         self.assertEqual(UserDict.UserDict().fromkeys('one two'.split(), 1), d5)
       
    42         self.assert_(u1.fromkeys('one two'.split()) is not u1)
       
    43         self.assert_(isinstance(u1.fromkeys('one two'.split()), UserDict.UserDict))
       
    44         self.assert_(isinstance(u2.fromkeys('one two'.split()), UserDict.IterableUserDict))
       
    45 
       
    46         # Test __repr__
       
    47         self.assertEqual(str(u0), str(d0))
       
    48         self.assertEqual(repr(u1), repr(d1))
       
    49         self.assertEqual(`u2`, `d2`)
       
    50 
       
    51         # Test __cmp__ and __len__
       
    52         all = [d0, d1, d2, u, u0, u1, u2, uu, uu0, uu1, uu2]
       
    53         for a in all:
       
    54             for b in all:
       
    55                 self.assertEqual(cmp(a, b), cmp(len(a), len(b)))
       
    56 
       
    57         # Test __getitem__
       
    58         self.assertEqual(u2["one"], 1)
       
    59         self.assertRaises(KeyError, u1.__getitem__, "two")
       
    60 
       
    61         # Test __setitem__
       
    62         u3 = UserDict.UserDict(u2)
       
    63         u3["two"] = 2
       
    64         u3["three"] = 3
       
    65 
       
    66         # Test __delitem__
       
    67         del u3["three"]
       
    68         self.assertRaises(KeyError, u3.__delitem__, "three")
       
    69 
       
    70         # Test clear
       
    71         u3.clear()
       
    72         self.assertEqual(u3, {})
       
    73 
       
    74         # Test copy()
       
    75         u2a = u2.copy()
       
    76         self.assertEqual(u2a, u2)
       
    77         u2b = UserDict.UserDict(x=42, y=23)
       
    78         u2c = u2b.copy() # making a copy of a UserDict is special cased
       
    79         self.assertEqual(u2b, u2c)
       
    80 
       
    81         class MyUserDict(UserDict.UserDict):
       
    82             def display(self): print self
       
    83 
       
    84         m2 = MyUserDict(u2)
       
    85         m2a = m2.copy()
       
    86         self.assertEqual(m2a, m2)
       
    87 
       
    88         # SF bug #476616 -- copy() of UserDict subclass shared data
       
    89         m2['foo'] = 'bar'
       
    90         self.assertNotEqual(m2a, m2)
       
    91 
       
    92         # Test keys, items, values
       
    93         self.assertEqual(u2.keys(), d2.keys())
       
    94         self.assertEqual(u2.items(), d2.items())
       
    95         self.assertEqual(u2.values(), d2.values())
       
    96 
       
    97         # Test has_key and "in".
       
    98         for i in u2.keys():
       
    99             self.assert_(u2.has_key(i))
       
   100             self.assert_(i in u2)
       
   101             self.assertEqual(u1.has_key(i), d1.has_key(i))
       
   102             self.assertEqual(i in u1, i in d1)
       
   103             self.assertEqual(u0.has_key(i), d0.has_key(i))
       
   104             self.assertEqual(i in u0, i in d0)
       
   105 
       
   106         # Test update
       
   107         t = UserDict.UserDict()
       
   108         t.update(u2)
       
   109         self.assertEqual(t, u2)
       
   110         class Items:
       
   111             def items(self):
       
   112                 return (("x", 42), ("y", 23))
       
   113         t = UserDict.UserDict()
       
   114         t.update(Items())
       
   115         self.assertEqual(t, {"x": 42, "y": 23})
       
   116 
       
   117         # Test get
       
   118         for i in u2.keys():
       
   119             self.assertEqual(u2.get(i), u2[i])
       
   120             self.assertEqual(u1.get(i), d1.get(i))
       
   121             self.assertEqual(u0.get(i), d0.get(i))
       
   122 
       
   123         # Test "in" iteration.
       
   124         for i in xrange(20):
       
   125             u2[i] = str(i)
       
   126         ikeys = []
       
   127         for k in u2:
       
   128             ikeys.append(k)
       
   129         keys = u2.keys()
       
   130         self.assertEqual(set(ikeys), set(keys))
       
   131 
       
   132         # Test setdefault
       
   133         t = UserDict.UserDict()
       
   134         self.assertEqual(t.setdefault("x", 42), 42)
       
   135         self.assert_(t.has_key("x"))
       
   136         self.assertEqual(t.setdefault("x", 23), 42)
       
   137 
       
   138         # Test pop
       
   139         t = UserDict.UserDict(x=42)
       
   140         self.assertEqual(t.pop("x"), 42)
       
   141         self.assertRaises(KeyError, t.pop, "x")
       
   142         self.assertEqual(t.pop("x", 1), 1)
       
   143         t["x"] = 42
       
   144         self.assertEqual(t.pop("x", 1), 42)
       
   145 
       
   146         # Test popitem
       
   147         t = UserDict.UserDict(x=42)
       
   148         self.assertEqual(t.popitem(), ("x", 42))
       
   149         self.assertRaises(KeyError, t.popitem)
       
   150 
       
   151     def test_missing(self):
       
   152         # Make sure UserDict doesn't have a __missing__ method
       
   153         self.assertEqual(hasattr(UserDict, "__missing__"), False)
       
   154         # Test several cases:
       
   155         # (D) subclass defines __missing__ method returning a value
       
   156         # (E) subclass defines __missing__ method raising RuntimeError
       
   157         # (F) subclass sets __missing__ instance variable (no effect)
       
   158         # (G) subclass doesn't define __missing__ at a all
       
   159         class D(UserDict.UserDict):
       
   160             def __missing__(self, key):
       
   161                 return 42
       
   162         d = D({1: 2, 3: 4})
       
   163         self.assertEqual(d[1], 2)
       
   164         self.assertEqual(d[3], 4)
       
   165         self.assert_(2 not in d)
       
   166         self.assert_(2 not in d.keys())
       
   167         self.assertEqual(d[2], 42)
       
   168         class E(UserDict.UserDict):
       
   169             def __missing__(self, key):
       
   170                 raise RuntimeError(key)
       
   171         e = E()
       
   172         try:
       
   173             e[42]
       
   174         except RuntimeError, err:
       
   175             self.assertEqual(err.args, (42,))
       
   176         else:
       
   177             self.fail("e[42] didn't raise RuntimeError")
       
   178         class F(UserDict.UserDict):
       
   179             def __init__(self):
       
   180                 # An instance variable __missing__ should have no effect
       
   181                 self.__missing__ = lambda key: None
       
   182                 UserDict.UserDict.__init__(self)
       
   183         f = F()
       
   184         try:
       
   185             f[42]
       
   186         except KeyError, err:
       
   187             self.assertEqual(err.args, (42,))
       
   188         else:
       
   189             self.fail("f[42] didn't raise KeyError")
       
   190         class G(UserDict.UserDict):
       
   191             pass
       
   192         g = G()
       
   193         try:
       
   194             g[42]
       
   195         except KeyError, err:
       
   196             self.assertEqual(err.args, (42,))
       
   197         else:
       
   198             self.fail("g[42] didn't raise KeyError")
       
   199 
       
   200 ##########################
       
   201 # Test Dict Mixin
       
   202 
       
   203 class SeqDict(UserDict.DictMixin):
       
   204     """Dictionary lookalike implemented with lists.
       
   205 
       
   206     Used to test and demonstrate DictMixin
       
   207     """
       
   208     def __init__(self, other=None, **kwargs):
       
   209         self.keylist = []
       
   210         self.valuelist = []
       
   211         if other is not None:
       
   212             for (key, value) in other:
       
   213                 self[key] = value
       
   214         for (key, value) in kwargs.iteritems():
       
   215             self[key] = value
       
   216     def __getitem__(self, key):
       
   217         try:
       
   218             i = self.keylist.index(key)
       
   219         except ValueError:
       
   220             raise KeyError
       
   221         return self.valuelist[i]
       
   222     def __setitem__(self, key, value):
       
   223         try:
       
   224             i = self.keylist.index(key)
       
   225             self.valuelist[i] = value
       
   226         except ValueError:
       
   227             self.keylist.append(key)
       
   228             self.valuelist.append(value)
       
   229     def __delitem__(self, key):
       
   230         try:
       
   231             i = self.keylist.index(key)
       
   232         except ValueError:
       
   233             raise KeyError
       
   234         self.keylist.pop(i)
       
   235         self.valuelist.pop(i)
       
   236     def keys(self):
       
   237         return list(self.keylist)
       
   238     def copy(self):
       
   239         d = self.__class__()
       
   240         for key, value in self.iteritems():
       
   241             d[key] = value
       
   242         return d
       
   243     @classmethod
       
   244     def fromkeys(cls, keys, value=None):
       
   245         d = cls()
       
   246         for key in keys:
       
   247             d[key] = value
       
   248         return d
       
   249 
       
   250 class UserDictMixinTest(mapping_tests.TestMappingProtocol):
       
   251     type2test = SeqDict
       
   252 
       
   253     def test_all(self):
       
   254         ## Setup test and verify working of the test class
       
   255 
       
   256         # check init
       
   257         s = SeqDict()
       
   258 
       
   259         # exercise setitem
       
   260         s[10] = 'ten'
       
   261         s[20] = 'twenty'
       
   262         s[30] = 'thirty'
       
   263 
       
   264         # exercise delitem
       
   265         del s[20]
       
   266         # check getitem and setitem
       
   267         self.assertEqual(s[10], 'ten')
       
   268         # check keys() and delitem
       
   269         self.assertEqual(s.keys(), [10, 30])
       
   270 
       
   271         ## Now, test the DictMixin methods one by one
       
   272         # has_key
       
   273         self.assert_(s.has_key(10))
       
   274         self.assert_(not s.has_key(20))
       
   275 
       
   276         # __contains__
       
   277         self.assert_(10 in s)
       
   278         self.assert_(20 not in s)
       
   279 
       
   280         # __iter__
       
   281         self.assertEqual([k for k in s], [10, 30])
       
   282 
       
   283         # __len__
       
   284         self.assertEqual(len(s), 2)
       
   285 
       
   286         # iteritems
       
   287         self.assertEqual(list(s.iteritems()), [(10,'ten'), (30, 'thirty')])
       
   288 
       
   289         # iterkeys
       
   290         self.assertEqual(list(s.iterkeys()), [10, 30])
       
   291 
       
   292         # itervalues
       
   293         self.assertEqual(list(s.itervalues()), ['ten', 'thirty'])
       
   294 
       
   295         # values
       
   296         self.assertEqual(s.values(), ['ten', 'thirty'])
       
   297 
       
   298         # items
       
   299         self.assertEqual(s.items(), [(10,'ten'), (30, 'thirty')])
       
   300 
       
   301         # get
       
   302         self.assertEqual(s.get(10), 'ten')
       
   303         self.assertEqual(s.get(15,'fifteen'), 'fifteen')
       
   304         self.assertEqual(s.get(15), None)
       
   305 
       
   306         # setdefault
       
   307         self.assertEqual(s.setdefault(40, 'forty'), 'forty')
       
   308         self.assertEqual(s.setdefault(10, 'null'), 'ten')
       
   309         del s[40]
       
   310 
       
   311         # pop
       
   312         self.assertEqual(s.pop(10), 'ten')
       
   313         self.assert_(10 not in s)
       
   314         s[10] = 'ten'
       
   315         self.assertEqual(s.pop("x", 1), 1)
       
   316         s["x"] = 42
       
   317         self.assertEqual(s.pop("x", 1), 42)
       
   318 
       
   319         # popitem
       
   320         k, v = s.popitem()
       
   321         self.assert_(k not in s)
       
   322         s[k] = v
       
   323 
       
   324         # clear
       
   325         s.clear()
       
   326         self.assertEqual(len(s), 0)
       
   327 
       
   328         # empty popitem
       
   329         self.assertRaises(KeyError, s.popitem)
       
   330 
       
   331         # update
       
   332         s.update({10: 'ten', 20:'twenty'})
       
   333         self.assertEqual(s[10], 'ten')
       
   334         self.assertEqual(s[20], 'twenty')
       
   335 
       
   336         # cmp
       
   337         self.assertEqual(s, {10: 'ten', 20:'twenty'})
       
   338         t = SeqDict()
       
   339         t[20] = 'twenty'
       
   340         t[10] = 'ten'
       
   341         self.assertEqual(s, t)
       
   342 
       
   343 def test_main():
       
   344     test_support.run_unittest(
       
   345         UserDictTest,
       
   346         UserDictMixinTest
       
   347     )
       
   348 
       
   349 if __name__ == "__main__":
       
   350     test_main()