PageRenderTime 28ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/python/Lib/test/test_userdict.py

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