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

/lib/django-1.5/tests/regressiontests/utils/datastructures.py

https://github.com/theosp/google_appengine
Python | 306 lines | 278 code | 11 blank | 17 comment | 2 complexity | 31425a4ab564489eefcbac09cc1a1bea MD5 | raw file
  1. """
  2. Tests for stuff in django.utils.datastructures.
  3. """
  4. import copy
  5. import pickle
  6. import warnings
  7. from django.test import SimpleTestCase
  8. from django.utils.datastructures import (DictWrapper, ImmutableList,
  9. MultiValueDict, MultiValueDictKeyError, MergeDict, SortedDict)
  10. from django.utils import six
  11. class SortedDictTests(SimpleTestCase):
  12. def setUp(self):
  13. self.d1 = SortedDict()
  14. self.d1[7] = 'seven'
  15. self.d1[1] = 'one'
  16. self.d1[9] = 'nine'
  17. self.d2 = SortedDict()
  18. self.d2[1] = 'one'
  19. self.d2[9] = 'nine'
  20. self.d2[0] = 'nil'
  21. self.d2[7] = 'seven'
  22. def test_basic_methods(self):
  23. self.assertEqual(list(six.iterkeys(self.d1)), [7, 1, 9])
  24. self.assertEqual(list(six.itervalues(self.d1)), ['seven', 'one', 'nine'])
  25. self.assertEqual(list(six.iteritems(self.d1)), [(7, 'seven'), (1, 'one'), (9, 'nine')])
  26. def test_overwrite_ordering(self):
  27. """ Overwriting an item keeps its place. """
  28. self.d1[1] = 'ONE'
  29. self.assertEqual(list(six.itervalues(self.d1)), ['seven', 'ONE', 'nine'])
  30. def test_append_items(self):
  31. """ New items go to the end. """
  32. self.d1[0] = 'nil'
  33. self.assertEqual(list(six.iterkeys(self.d1)), [7, 1, 9, 0])
  34. def test_delete_and_insert(self):
  35. """
  36. Deleting an item, then inserting the same key again will place it
  37. at the end.
  38. """
  39. del self.d2[7]
  40. self.assertEqual(list(six.iterkeys(self.d2)), [1, 9, 0])
  41. self.d2[7] = 'lucky number 7'
  42. self.assertEqual(list(six.iterkeys(self.d2)), [1, 9, 0, 7])
  43. if not six.PY3:
  44. def test_change_keys(self):
  45. """
  46. Changing the keys won't do anything, it's only a copy of the
  47. keys dict.
  48. This test doesn't make sense under Python 3 because keys is
  49. an iterator.
  50. """
  51. k = self.d2.keys()
  52. k.remove(9)
  53. self.assertEqual(self.d2.keys(), [1, 9, 0, 7])
  54. def test_init_keys(self):
  55. """
  56. Initialising a SortedDict with two keys will just take the first one.
  57. A real dict will actually take the second value so we will too, but
  58. we'll keep the ordering from the first key found.
  59. """
  60. tuples = ((2, 'two'), (1, 'one'), (2, 'second-two'))
  61. d = SortedDict(tuples)
  62. self.assertEqual(list(six.iterkeys(d)), [2, 1])
  63. real_dict = dict(tuples)
  64. self.assertEqual(sorted(six.itervalues(real_dict)), ['one', 'second-two'])
  65. # Here the order of SortedDict values *is* what we are testing
  66. self.assertEqual(list(six.itervalues(d)), ['second-two', 'one'])
  67. def test_overwrite(self):
  68. self.d1[1] = 'not one'
  69. self.assertEqual(self.d1[1], 'not one')
  70. self.assertEqual(list(six.iterkeys(self.d1)), list(six.iterkeys(self.d1.copy())))
  71. def test_append(self):
  72. self.d1[13] = 'thirteen'
  73. self.assertEqual(
  74. repr(self.d1),
  75. "{7: 'seven', 1: 'one', 9: 'nine', 13: 'thirteen'}"
  76. )
  77. def test_pop(self):
  78. self.assertEqual(self.d1.pop(1, 'missing'), 'one')
  79. self.assertEqual(self.d1.pop(1, 'missing'), 'missing')
  80. # We don't know which item will be popped in popitem(), so we'll
  81. # just check that the number of keys has decreased.
  82. l = len(self.d1)
  83. self.d1.popitem()
  84. self.assertEqual(l - len(self.d1), 1)
  85. def test_dict_equality(self):
  86. d = SortedDict((i, i) for i in range(3))
  87. self.assertEqual(d, {0: 0, 1: 1, 2: 2})
  88. def test_tuple_init(self):
  89. d = SortedDict(((1, "one"), (0, "zero"), (2, "two")))
  90. self.assertEqual(repr(d), "{1: 'one', 0: 'zero', 2: 'two'}")
  91. def test_pickle(self):
  92. self.assertEqual(
  93. pickle.loads(pickle.dumps(self.d1, 2)),
  94. {7: 'seven', 1: 'one', 9: 'nine'}
  95. )
  96. def test_copy(self):
  97. orig = SortedDict(((1, "one"), (0, "zero"), (2, "two")))
  98. copied = copy.copy(orig)
  99. self.assertEqual(list(six.iterkeys(orig)), [1, 0, 2])
  100. self.assertEqual(list(six.iterkeys(copied)), [1, 0, 2])
  101. def test_clear(self):
  102. self.d1.clear()
  103. self.assertEqual(self.d1, {})
  104. self.assertEqual(self.d1.keyOrder, [])
  105. def test_reversed(self):
  106. self.assertEqual(list(self.d1), [7, 1, 9])
  107. self.assertEqual(list(self.d2), [1, 9, 0, 7])
  108. self.assertEqual(list(reversed(self.d1)), [9, 1, 7])
  109. self.assertEqual(list(reversed(self.d2)), [7, 0, 9, 1])
  110. def test_insert(self):
  111. d = SortedDict()
  112. with warnings.catch_warnings(record=True) as w:
  113. warnings.simplefilter("always")
  114. d.insert(0, "hello", "world")
  115. assert w[0].category is PendingDeprecationWarning
  116. def test_value_for_index(self):
  117. d = SortedDict({"a": 3})
  118. with warnings.catch_warnings(record=True) as w:
  119. warnings.simplefilter("always")
  120. self.assertEqual(d.value_for_index(0), 3)
  121. assert w[0].category is PendingDeprecationWarning
  122. class MergeDictTests(SimpleTestCase):
  123. def test_simple_mergedict(self):
  124. d1 = {'chris':'cool', 'camri':'cute', 'cotton':'adorable',
  125. 'tulip':'snuggable', 'twoofme':'firstone'}
  126. d2 = {'chris2':'cool2', 'camri2':'cute2', 'cotton2':'adorable2',
  127. 'tulip2':'snuggable2'}
  128. d3 = {'chris3':'cool3', 'camri3':'cute3', 'cotton3':'adorable3',
  129. 'tulip3':'snuggable3'}
  130. d4 = {'twoofme': 'secondone'}
  131. md = MergeDict(d1, d2, d3)
  132. self.assertEqual(md['chris'], 'cool')
  133. self.assertEqual(md['camri'], 'cute')
  134. self.assertEqual(md['twoofme'], 'firstone')
  135. md2 = md.copy()
  136. self.assertEqual(md2['chris'], 'cool')
  137. def test_mergedict_merges_multivaluedict(self):
  138. """ MergeDict can merge MultiValueDicts """
  139. multi1 = MultiValueDict({'key1': ['value1'],
  140. 'key2': ['value2', 'value3']})
  141. multi2 = MultiValueDict({'key2': ['value4'],
  142. 'key4': ['value5', 'value6']})
  143. mm = MergeDict(multi1, multi2)
  144. # Although 'key2' appears in both dictionaries,
  145. # only the first value is used.
  146. self.assertEqual(mm.getlist('key2'), ['value2', 'value3'])
  147. self.assertEqual(mm.getlist('key4'), ['value5', 'value6'])
  148. self.assertEqual(mm.getlist('undefined'), [])
  149. self.assertEqual(sorted(six.iterkeys(mm)), ['key1', 'key2', 'key4'])
  150. self.assertEqual(len(list(six.itervalues(mm))), 3)
  151. self.assertTrue('value1' in six.itervalues(mm))
  152. self.assertEqual(sorted(six.iteritems(mm), key=lambda k: k[0]),
  153. [('key1', 'value1'), ('key2', 'value3'),
  154. ('key4', 'value6')])
  155. self.assertEqual([(k,mm.getlist(k)) for k in sorted(mm)],
  156. [('key1', ['value1']),
  157. ('key2', ['value2', 'value3']),
  158. ('key4', ['value5', 'value6'])])
  159. class MultiValueDictTests(SimpleTestCase):
  160. def test_multivaluedict(self):
  161. d = MultiValueDict({'name': ['Adrian', 'Simon'],
  162. 'position': ['Developer']})
  163. self.assertEqual(d['name'], 'Simon')
  164. self.assertEqual(d.get('name'), 'Simon')
  165. self.assertEqual(d.getlist('name'), ['Adrian', 'Simon'])
  166. self.assertEqual(sorted(list(six.iteritems(d))),
  167. [('name', 'Simon'), ('position', 'Developer')])
  168. self.assertEqual(sorted(list(six.iterlists(d))),
  169. [('name', ['Adrian', 'Simon']),
  170. ('position', ['Developer'])])
  171. # MultiValueDictKeyError: "Key 'lastname' not found in
  172. # <MultiValueDict: {'position': ['Developer'],
  173. # 'name': ['Adrian', 'Simon']}>"
  174. six.assertRaisesRegex(self, MultiValueDictKeyError,
  175. r'"Key \'lastname\' not found in <MultiValueDict',
  176. d.__getitem__, 'lastname')
  177. self.assertEqual(d.get('lastname'), None)
  178. self.assertEqual(d.get('lastname', 'nonexistent'), 'nonexistent')
  179. self.assertEqual(d.getlist('lastname'), [])
  180. self.assertEqual(d.getlist('doesnotexist', ['Adrian', 'Simon']),
  181. ['Adrian', 'Simon'])
  182. d.setlist('lastname', ['Holovaty', 'Willison'])
  183. self.assertEqual(d.getlist('lastname'), ['Holovaty', 'Willison'])
  184. self.assertEqual(sorted(list(six.itervalues(d))),
  185. ['Developer', 'Simon', 'Willison'])
  186. def test_appendlist(self):
  187. d = MultiValueDict()
  188. d.appendlist('name', 'Adrian')
  189. d.appendlist('name', 'Simon')
  190. self.assertEqual(d.getlist('name'), ['Adrian', 'Simon'])
  191. def test_copy(self):
  192. for copy_func in [copy.copy, lambda d: d.copy()]:
  193. d1 = MultiValueDict({
  194. "developers": ["Carl", "Fred"]
  195. })
  196. self.assertEqual(d1["developers"], "Fred")
  197. d2 = copy_func(d1)
  198. d2.update({"developers": "Groucho"})
  199. self.assertEqual(d2["developers"], "Groucho")
  200. self.assertEqual(d1["developers"], "Fred")
  201. d1 = MultiValueDict({
  202. "key": [[]]
  203. })
  204. self.assertEqual(d1["key"], [])
  205. d2 = copy_func(d1)
  206. d2["key"].append("Penguin")
  207. self.assertEqual(d1["key"], ["Penguin"])
  208. self.assertEqual(d2["key"], ["Penguin"])
  209. def test_dict_translation(self):
  210. mvd = MultiValueDict({
  211. 'devs': ['Bob', 'Joe'],
  212. 'pm': ['Rory'],
  213. })
  214. d = mvd.dict()
  215. self.assertEqual(list(six.iterkeys(d)), list(six.iterkeys(mvd)))
  216. for key in six.iterkeys(mvd):
  217. self.assertEqual(d[key], mvd[key])
  218. self.assertEqual({}, MultiValueDict().dict())
  219. class ImmutableListTests(SimpleTestCase):
  220. def test_sort(self):
  221. d = ImmutableList(range(10))
  222. # AttributeError: ImmutableList object is immutable.
  223. self.assertRaisesMessage(AttributeError,
  224. 'ImmutableList object is immutable.', d.sort)
  225. self.assertEqual(repr(d), '(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)')
  226. def test_custom_warning(self):
  227. d = ImmutableList(range(10), warning="Object is immutable!")
  228. self.assertEqual(d[1], 1)
  229. # AttributeError: Object is immutable!
  230. self.assertRaisesMessage(AttributeError,
  231. 'Object is immutable!', d.__setitem__, 1, 'test')
  232. class DictWrapperTests(SimpleTestCase):
  233. def test_dictwrapper(self):
  234. f = lambda x: "*%s" % x
  235. d = DictWrapper({'a': 'a'}, f, 'xx_')
  236. self.assertEqual("Normal: %(a)s. Modified: %(xx_a)s" % d,
  237. 'Normal: a. Modified: *a')