PageRenderTime 26ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/astropy/utils/tests/odict_mapping.py

https://gitlab.com/Rockyspade/astropy
Python | 311 lines | 233 code | 44 blank | 34 comment | 14 complexity | 209ebb09b49c3dcf30a742a8040fd366 MD5 | raw file
  1. # Licensed under a 3-clause BSD style license - see LICENSE.rst
  2. import unittest
  3. from . import odict_support as test_support
  4. class BasicTestMappingProtocol(unittest.TestCase):
  5. # This base class can be used to check that an object conforms to the
  6. # mapping protocol
  7. # Functions that can be useful to override to adapt to dictionary
  8. # semantics
  9. type2test = None # which class is being tested (overwrite in subclasses)
  10. def _reference(self):
  11. """Return a dictionary of values which are invariant by storage
  12. in the object under test."""
  13. return {1:2, "key1":"value1", "key2":(1,2,3)}
  14. def _empty_mapping(self):
  15. """Return an empty mapping object"""
  16. return self.type2test()
  17. def _full_mapping(self, data):
  18. """Return a mapping object with the value contained in data
  19. dictionary"""
  20. x = self._empty_mapping()
  21. for key, value in data.items():
  22. x[key] = value
  23. return x
  24. def __init__(self, *args, **kw):
  25. unittest.TestCase.__init__(self, *args, **kw)
  26. self.reference = self._reference().copy()
  27. # A (key, value) pair not in the mapping
  28. key, value = self.reference.popitem()
  29. self.other = {key:value}
  30. # A (key, value) pair in the mapping
  31. key, value = self.reference.popitem()
  32. self.inmapping = {key:value}
  33. self.reference[key] = value
  34. def test_read(self):
  35. # Test for read only operations on mapping
  36. p = self._empty_mapping()
  37. p1 = dict(p) #workaround for singleton objects
  38. d = self._full_mapping(self.reference)
  39. if d is p:
  40. p = p1
  41. #Indexing
  42. for key, value in self.reference.items():
  43. self.assertEqual(d[key], value)
  44. knownkey = self.other.keys()[0]
  45. self.assertRaises(KeyError, lambda:d[knownkey])
  46. #len
  47. self.assertEqual(len(p), 0)
  48. self.assertEqual(len(d), len(self.reference))
  49. #in
  50. for k in self.reference:
  51. self.assertIn(k, d)
  52. for k in self.other:
  53. self.assertNotIn(k, d)
  54. #has_key
  55. with test_support.check_py3k_warnings(quiet=True):
  56. for k in self.reference:
  57. self.assertTrue(d.has_key(k))
  58. for k in self.other:
  59. self.assertFalse(d.has_key(k))
  60. #cmp
  61. self.assertEqual(cmp(p,p), 0)
  62. self.assertEqual(cmp(d,d), 0)
  63. self.assertEqual(cmp(p,d), -1)
  64. self.assertEqual(cmp(d,p), 1)
  65. #__non__zero__
  66. if p: self.fail("Empty mapping must compare to False")
  67. if not d: self.fail("Full mapping must compare to True")
  68. # keys(), items(), iterkeys() ...
  69. def check_iterandlist(iter, lst, ref):
  70. self.assertTrue(hasattr(iter, 'next'))
  71. self.assertTrue(hasattr(iter, '__iter__'))
  72. x = list(iter)
  73. self.assertTrue(set(x)==set(lst)==set(ref))
  74. check_iterandlist(d.iterkeys(), d.keys(), self.reference.keys())
  75. check_iterandlist(iter(d), d.keys(), self.reference.keys())
  76. check_iterandlist(d.itervalues(), d.values(), self.reference.values())
  77. check_iterandlist(d.iteritems(), d.items(), self.reference.items())
  78. #get
  79. key, value = d.iteritems().next()
  80. knownkey, knownvalue = self.other.iteritems().next()
  81. self.assertEqual(d.get(key, knownvalue), value)
  82. self.assertEqual(d.get(knownkey, knownvalue), knownvalue)
  83. self.assertNotIn(knownkey, d)
  84. def test_write(self):
  85. # Test for write operations on mapping
  86. p = self._empty_mapping()
  87. #Indexing
  88. for key, value in self.reference.items():
  89. p[key] = value
  90. self.assertEqual(p[key], value)
  91. for key in self.reference.keys():
  92. del p[key]
  93. self.assertRaises(KeyError, lambda:p[key])
  94. p = self._empty_mapping()
  95. #update
  96. p.update(self.reference)
  97. self.assertEqual(dict(p), self.reference)
  98. items = p.items()
  99. p = self._empty_mapping()
  100. p.update(items)
  101. self.assertEqual(dict(p), self.reference)
  102. d = self._full_mapping(self.reference)
  103. #setdefault
  104. key, value = d.iteritems().next()
  105. knownkey, knownvalue = self.other.iteritems().next()
  106. self.assertEqual(d.setdefault(key, knownvalue), value)
  107. self.assertEqual(d[key], value)
  108. self.assertEqual(d.setdefault(knownkey, knownvalue), knownvalue)
  109. self.assertEqual(d[knownkey], knownvalue)
  110. #pop
  111. self.assertEqual(d.pop(knownkey), knownvalue)
  112. self.assertNotIn(knownkey, d)
  113. self.assertRaises(KeyError, d.pop, knownkey)
  114. default = 909
  115. d[knownkey] = knownvalue
  116. self.assertEqual(d.pop(knownkey, default), knownvalue)
  117. self.assertNotIn(knownkey, d)
  118. self.assertEqual(d.pop(knownkey, default), default)
  119. #popitem
  120. key, value = d.popitem()
  121. self.assertNotIn(key, d)
  122. self.assertEqual(value, self.reference[key])
  123. p=self._empty_mapping()
  124. self.assertRaises(KeyError, p.popitem)
  125. def test_constructor(self):
  126. self.assertEqual(self._empty_mapping(), self._empty_mapping())
  127. def test_bool(self):
  128. self.assertTrue(not self._empty_mapping())
  129. self.assertTrue(self.reference)
  130. self.assertTrue(bool(self._empty_mapping()) is False)
  131. self.assertTrue(bool(self.reference) is True)
  132. def test_keys(self):
  133. d = self._empty_mapping()
  134. self.assertEqual(d.keys(), [])
  135. d = self.reference
  136. self.assertIn(self.inmapping.keys()[0], d.keys())
  137. self.assertNotIn(self.other.keys()[0], d.keys())
  138. self.assertRaises(TypeError, d.keys, None)
  139. def test_values(self):
  140. d = self._empty_mapping()
  141. self.assertEqual(d.values(), [])
  142. self.assertRaises(TypeError, d.values, None)
  143. def test_items(self):
  144. d = self._empty_mapping()
  145. self.assertEqual(d.items(), [])
  146. self.assertRaises(TypeError, d.items, None)
  147. def test_len(self):
  148. d = self._empty_mapping()
  149. self.assertEqual(len(d), 0)
  150. def test_getitem(self):
  151. d = self.reference
  152. self.assertEqual(d[self.inmapping.keys()[0]], self.inmapping.values()[0])
  153. self.assertRaises(TypeError, d.__getitem__)
  154. def test_update(self):
  155. # mapping argument
  156. d = self._empty_mapping()
  157. d.update(self.other)
  158. self.assertEqual(d.items(), self.other.items())
  159. # No argument
  160. d = self._empty_mapping()
  161. d.update()
  162. self.assertEqual(d, self._empty_mapping())
  163. # item sequence
  164. d = self._empty_mapping()
  165. d.update(self.other.items())
  166. self.assertEqual(d.items(), self.other.items())
  167. # Iterator
  168. d = self._empty_mapping()
  169. d.update(self.other.iteritems())
  170. self.assertEqual(d.items(), self.other.items())
  171. # FIXME: Doesn't work with UserDict
  172. # self.assertRaises((TypeError, AttributeError), d.update, None)
  173. self.assertRaises((TypeError, AttributeError), d.update, 42)
  174. outerself = self
  175. class SimpleUserDict:
  176. def __init__(self):
  177. self.d = outerself.reference
  178. def keys(self):
  179. return self.d.keys()
  180. def __getitem__(self, i):
  181. return self.d[i]
  182. d.clear()
  183. d.update(SimpleUserDict())
  184. i1 = d.items()
  185. i2 = self.reference.items()
  186. i1.sort()
  187. i2.sort()
  188. self.assertEqual(i1, i2)
  189. class Exc(Exception): pass
  190. d = self._empty_mapping()
  191. class FailingUserDict:
  192. def keys(self):
  193. raise Exc
  194. self.assertRaises(Exc, d.update, FailingUserDict())
  195. d.clear()
  196. class FailingUserDict2:
  197. def keys(self):
  198. class BogonIter:
  199. def __init__(self):
  200. self.i = 1
  201. def __iter__(self):
  202. return self
  203. def next(self):
  204. if self.i:
  205. self.i = 0
  206. return 'a'
  207. raise Exc
  208. return BogonIter()
  209. def __getitem__(self, key):
  210. return key
  211. self.assertRaises(Exc, d.update, FailingUserDict2())
  212. class FailingUserDict3:
  213. def keys(self):
  214. class BogonIter:
  215. def __init__(self):
  216. self.i = ord('a')
  217. def __iter__(self):
  218. return self
  219. def next(self):
  220. if self.i <= ord('z'):
  221. rtn = chr(self.i)
  222. self.i += 1
  223. return rtn
  224. raise StopIteration
  225. return BogonIter()
  226. def __getitem__(self, key):
  227. raise Exc
  228. self.assertRaises(Exc, d.update, FailingUserDict3())
  229. d = self._empty_mapping()
  230. class badseq(object):
  231. def __iter__(self):
  232. return self
  233. def next(self):
  234. raise Exc()
  235. self.assertRaises(Exc, d.update, badseq())
  236. self.assertRaises(ValueError, d.update, [(1, 2, 3)])
  237. # no test_fromkeys or test_copy as both os.environ and selves don't support it
  238. def test_get(self):
  239. d = self._empty_mapping()
  240. self.assertTrue(d.get(self.other.keys()[0]) is None)
  241. self.assertEqual(d.get(self.other.keys()[0], 3), 3)
  242. d = self.reference
  243. self.assertTrue(d.get(self.other.keys()[0]) is None)
  244. self.assertEqual(d.get(self.other.keys()[0], 3), 3)
  245. self.assertEqual(d.get(self.inmapping.keys()[0]), self.inmapping.values()[0])
  246. self.assertEqual(d.get(self.inmapping.keys()[0], 3), self.inmapping.values()[0])
  247. self.assertRaises(TypeError, d.get)
  248. self.assertRaises(TypeError, d.get, None, None, None)
  249. def test_setdefault(self):
  250. d = self._empty_mapping()
  251. self.assertRaises(TypeError, d.setdefault)
  252. def test_popitem(self):
  253. d = self._empty_mapping()
  254. self.assertRaises(KeyError, d.popitem)
  255. self.assertRaises(TypeError, d.popitem, 42)
  256. def test_pop(self):
  257. d = self._empty_mapping()
  258. k, v = self.inmapping.items()[0]
  259. d[k] = v
  260. self.assertRaises(KeyError, d.pop, self.other.keys()[0])
  261. self.assertEqual(d.pop(k), v)
  262. self.assertEqual(len(d), 0)
  263. self.assertRaises(KeyError, d.pop, k)
  264. def assertIn(self, key, d):
  265. self.assertTrue(key in d)
  266. def assertNotIn(self, key, d):
  267. self.assertFalse(key in d)