PageRenderTime 48ms CodeModel.GetById 19ms RepoModel.GetById 1ms app.codeStats 0ms

/packages/django/contrib/gis/geos/tests/test_mutable_list.py

https://gitlab.com/gregtyka/Scryve-Webapp
Python | 398 lines | 320 code | 66 blank | 12 comment | 37 complexity | 313f0e64b0f59c69281aa9a79ba43341 MD5 | raw file
  1. # Copyright (c) 2008-2009 Aryeh Leib Taurog, http://www.aryehleib.com
  2. # All rights reserved.
  3. #
  4. # Modified from original contribution by Aryeh Leib Taurog, which was
  5. # released under the New BSD license.
  6. import unittest
  7. from django.contrib.gis.geos.mutable_list import ListMixin
  8. class UserListA(ListMixin):
  9. _mytype = tuple
  10. def __init__(self, i_list, *args, **kwargs):
  11. self._list = self._mytype(i_list)
  12. super(UserListA, self).__init__(*args, **kwargs)
  13. def __len__(self): return len(self._list)
  14. def __str__(self): return str(self._list)
  15. def __repr__(self): return repr(self._list)
  16. def _set_list(self, length, items):
  17. # this would work:
  18. # self._list = self._mytype(items)
  19. # but then we wouldn't be testing length parameter
  20. itemList = ['x'] * length
  21. for i, v in enumerate(items):
  22. itemList[i] = v
  23. self._list = self._mytype(itemList)
  24. def _get_single_external(self, index):
  25. return self._list[index]
  26. class UserListB(UserListA):
  27. _mytype = list
  28. def _set_single(self, index, value):
  29. self._list[index] = value
  30. def nextRange(length):
  31. nextRange.start += 100
  32. return range(nextRange.start, nextRange.start + length)
  33. nextRange.start = 0
  34. class ListMixinTest(unittest.TestCase):
  35. """
  36. Tests base class ListMixin by comparing a list clone which is
  37. a ListMixin subclass with a real Python list.
  38. """
  39. limit = 3
  40. listType = UserListA
  41. def lists_of_len(self, length=None):
  42. if length is None: length = self.limit
  43. pl = range(length)
  44. return pl, self.listType(pl)
  45. def limits_plus(self, b):
  46. return range(-self.limit - b, self.limit + b)
  47. def step_range(self):
  48. return range(-1 - self.limit, 0) + range(1, 1 + self.limit)
  49. def test01_getslice(self):
  50. 'Slice retrieval'
  51. pl, ul = self.lists_of_len()
  52. for i in self.limits_plus(1):
  53. self.assertEqual(pl[i:], ul[i:], 'slice [%d:]' % (i))
  54. self.assertEqual(pl[:i], ul[:i], 'slice [:%d]' % (i))
  55. for j in self.limits_plus(1):
  56. self.assertEqual(pl[i:j], ul[i:j], 'slice [%d:%d]' % (i,j))
  57. for k in self.step_range():
  58. self.assertEqual(pl[i:j:k], ul[i:j:k], 'slice [%d:%d:%d]' % (i,j,k))
  59. for k in self.step_range():
  60. self.assertEqual(pl[i::k], ul[i::k], 'slice [%d::%d]' % (i,k))
  61. self.assertEqual(pl[:i:k], ul[:i:k], 'slice [:%d:%d]' % (i,k))
  62. for k in self.step_range():
  63. self.assertEqual(pl[::k], ul[::k], 'slice [::%d]' % (k))
  64. def test02_setslice(self):
  65. 'Slice assignment'
  66. def setfcn(x,i,j,k,L): x[i:j:k] = range(L)
  67. pl, ul = self.lists_of_len()
  68. for slen in range(self.limit + 1):
  69. ssl = nextRange(slen)
  70. ul[:] = ssl
  71. pl[:] = ssl
  72. self.assertEqual(pl, ul[:], 'set slice [:]')
  73. for i in self.limits_plus(1):
  74. ssl = nextRange(slen)
  75. ul[i:] = ssl
  76. pl[i:] = ssl
  77. self.assertEqual(pl, ul[:], 'set slice [%d:]' % (i))
  78. ssl = nextRange(slen)
  79. ul[:i] = ssl
  80. pl[:i] = ssl
  81. self.assertEqual(pl, ul[:], 'set slice [:%d]' % (i))
  82. for j in self.limits_plus(1):
  83. ssl = nextRange(slen)
  84. ul[i:j] = ssl
  85. pl[i:j] = ssl
  86. self.assertEqual(pl, ul[:], 'set slice [%d:%d]' % (i, j))
  87. for k in self.step_range():
  88. ssl = nextRange( len(ul[i:j:k]) )
  89. ul[i:j:k] = ssl
  90. pl[i:j:k] = ssl
  91. self.assertEqual(pl, ul[:], 'set slice [%d:%d:%d]' % (i, j, k))
  92. sliceLen = len(ul[i:j:k])
  93. self.assertRaises(ValueError, setfcn, ul, i, j, k, sliceLen + 1)
  94. if sliceLen > 2:
  95. self.assertRaises(ValueError, setfcn, ul, i, j, k, sliceLen - 1)
  96. for k in self.step_range():
  97. ssl = nextRange( len(ul[i::k]) )
  98. ul[i::k] = ssl
  99. pl[i::k] = ssl
  100. self.assertEqual(pl, ul[:], 'set slice [%d::%d]' % (i, k))
  101. ssl = nextRange( len(ul[:i:k]) )
  102. ul[:i:k] = ssl
  103. pl[:i:k] = ssl
  104. self.assertEqual(pl, ul[:], 'set slice [:%d:%d]' % (i, k))
  105. for k in self.step_range():
  106. ssl = nextRange(len(ul[::k]))
  107. ul[::k] = ssl
  108. pl[::k] = ssl
  109. self.assertEqual(pl, ul[:], 'set slice [::%d]' % (k))
  110. def test03_delslice(self):
  111. 'Delete slice'
  112. for Len in range(self.limit):
  113. pl, ul = self.lists_of_len(Len)
  114. del pl[:]
  115. del ul[:]
  116. self.assertEqual(pl[:], ul[:], 'del slice [:]')
  117. for i in range(-Len - 1, Len + 1):
  118. pl, ul = self.lists_of_len(Len)
  119. del pl[i:]
  120. del ul[i:]
  121. self.assertEqual(pl[:], ul[:], 'del slice [%d:]' % (i))
  122. pl, ul = self.lists_of_len(Len)
  123. del pl[:i]
  124. del ul[:i]
  125. self.assertEqual(pl[:], ul[:], 'del slice [:%d]' % (i))
  126. for j in range(-Len - 1, Len + 1):
  127. pl, ul = self.lists_of_len(Len)
  128. del pl[i:j]
  129. del ul[i:j]
  130. self.assertEqual(pl[:], ul[:], 'del slice [%d:%d]' % (i,j))
  131. for k in range(-Len - 1,0) + range(1,Len):
  132. pl, ul = self.lists_of_len(Len)
  133. del pl[i:j:k]
  134. del ul[i:j:k]
  135. self.assertEqual(pl[:], ul[:], 'del slice [%d:%d:%d]' % (i,j,k))
  136. for k in range(-Len - 1,0) + range(1,Len):
  137. pl, ul = self.lists_of_len(Len)
  138. del pl[:i:k]
  139. del ul[:i:k]
  140. self.assertEqual(pl[:], ul[:], 'del slice [:%d:%d]' % (i,k))
  141. pl, ul = self.lists_of_len(Len)
  142. del pl[i::k]
  143. del ul[i::k]
  144. self.assertEqual(pl[:], ul[:], 'del slice [%d::%d]' % (i,k))
  145. for k in range(-Len - 1,0) + range(1,Len):
  146. pl, ul = self.lists_of_len(Len)
  147. del pl[::k]
  148. del ul[::k]
  149. self.assertEqual(pl[:], ul[:], 'del slice [::%d]' % (k))
  150. def test04_get_set_del_single(self):
  151. 'Get/set/delete single item'
  152. pl, ul = self.lists_of_len()
  153. for i in self.limits_plus(0):
  154. self.assertEqual(pl[i], ul[i], 'get single item [%d]' % i)
  155. for i in self.limits_plus(0):
  156. pl, ul = self.lists_of_len()
  157. pl[i] = 100
  158. ul[i] = 100
  159. self.assertEqual(pl[:], ul[:], 'set single item [%d]' % i)
  160. for i in self.limits_plus(0):
  161. pl, ul = self.lists_of_len()
  162. del pl[i]
  163. del ul[i]
  164. self.assertEqual(pl[:], ul[:], 'del single item [%d]' % i)
  165. def test05_out_of_range_exceptions(self):
  166. 'Out of range exceptions'
  167. def setfcn(x, i): x[i] = 20
  168. def getfcn(x, i): return x[i]
  169. def delfcn(x, i): del x[i]
  170. pl, ul = self.lists_of_len()
  171. for i in (-1 - self.limit, self.limit):
  172. self.assertRaises(IndexError, setfcn, ul, i) # 'set index %d' % i)
  173. self.assertRaises(IndexError, getfcn, ul, i) # 'get index %d' % i)
  174. self.assertRaises(IndexError, delfcn, ul, i) # 'del index %d' % i)
  175. def test06_list_methods(self):
  176. 'List methods'
  177. pl, ul = self.lists_of_len()
  178. pl.append(40)
  179. ul.append(40)
  180. self.assertEqual(pl[:], ul[:], 'append')
  181. pl.extend(range(50,55))
  182. ul.extend(range(50,55))
  183. self.assertEqual(pl[:], ul[:], 'extend')
  184. pl.reverse()
  185. ul.reverse()
  186. self.assertEqual(pl[:], ul[:], 'reverse')
  187. for i in self.limits_plus(1):
  188. pl, ul = self.lists_of_len()
  189. pl.insert(i,50)
  190. ul.insert(i,50)
  191. self.assertEqual(pl[:], ul[:], 'insert at %d' % i)
  192. for i in self.limits_plus(0):
  193. pl, ul = self.lists_of_len()
  194. self.assertEqual(pl.pop(i), ul.pop(i), 'popped value at %d' % i)
  195. self.assertEqual(pl[:], ul[:], 'after pop at %d' % i)
  196. pl, ul = self.lists_of_len()
  197. self.assertEqual(pl.pop(), ul.pop(i), 'popped value')
  198. self.assertEqual(pl[:], ul[:], 'after pop')
  199. pl, ul = self.lists_of_len()
  200. def popfcn(x, i): x.pop(i)
  201. self.assertRaises(IndexError, popfcn, ul, self.limit)
  202. self.assertRaises(IndexError, popfcn, ul, -1 - self.limit)
  203. pl, ul = self.lists_of_len()
  204. for val in range(self.limit):
  205. self.assertEqual(pl.index(val), ul.index(val), 'index of %d' % val)
  206. for val in self.limits_plus(2):
  207. self.assertEqual(pl.count(val), ul.count(val), 'count %d' % val)
  208. for val in range(self.limit):
  209. pl, ul = self.lists_of_len()
  210. pl.remove(val)
  211. ul.remove(val)
  212. self.assertEqual(pl[:], ul[:], 'after remove val %d' % val)
  213. def indexfcn(x, v): return x.index(v)
  214. def removefcn(x, v): return x.remove(v)
  215. self.assertRaises(ValueError, indexfcn, ul, 40)
  216. self.assertRaises(ValueError, removefcn, ul, 40)
  217. def test07_allowed_types(self):
  218. 'Type-restricted list'
  219. pl, ul = self.lists_of_len()
  220. ul._allowed = (int, long)
  221. ul[1] = 50
  222. ul[:2] = [60, 70, 80]
  223. def setfcn(x, i, v): x[i] = v
  224. self.assertRaises(TypeError, setfcn, ul, 2, 'hello')
  225. self.assertRaises(TypeError, setfcn, ul, slice(0,3,2), ('hello','goodbye'))
  226. def test08_min_length(self):
  227. 'Length limits'
  228. pl, ul = self.lists_of_len()
  229. ul._minlength = 1
  230. def delfcn(x,i): del x[:i]
  231. def setfcn(x,i): x[:i] = []
  232. for i in range(self.limit - ul._minlength + 1, self.limit + 1):
  233. self.assertRaises(ValueError, delfcn, ul, i)
  234. self.assertRaises(ValueError, setfcn, ul, i)
  235. del ul[:ul._minlength]
  236. ul._maxlength = 4
  237. for i in range(0, ul._maxlength - len(ul)):
  238. ul.append(i)
  239. self.assertRaises(ValueError, ul.append, 10)
  240. def test09_iterable_check(self):
  241. 'Error on assigning non-iterable to slice'
  242. pl, ul = self.lists_of_len(self.limit + 1)
  243. def setfcn(x, i, v): x[i] = v
  244. self.assertRaises(TypeError, setfcn, ul, slice(0,3,2), 2)
  245. def test10_checkindex(self):
  246. 'Index check'
  247. pl, ul = self.lists_of_len()
  248. for i in self.limits_plus(0):
  249. if i < 0:
  250. self.assertEqual(ul._checkindex(i), i + self.limit, '_checkindex(neg index)')
  251. else:
  252. self.assertEqual(ul._checkindex(i), i, '_checkindex(pos index)')
  253. for i in (-self.limit - 1, self.limit):
  254. self.assertRaises(IndexError, ul._checkindex, i)
  255. ul._IndexError = TypeError
  256. self.assertRaises(TypeError, ul._checkindex, -self.limit - 1)
  257. def test_11_sorting(self):
  258. 'Sorting'
  259. pl, ul = self.lists_of_len()
  260. pl.insert(0, pl.pop())
  261. ul.insert(0, ul.pop())
  262. pl.sort()
  263. ul.sort()
  264. self.assertEqual(pl[:], ul[:], 'sort')
  265. mid = pl[len(pl) / 2]
  266. pl.sort(key=lambda x: (mid-x)**2)
  267. ul.sort(key=lambda x: (mid-x)**2)
  268. self.assertEqual(pl[:], ul[:], 'sort w/ key')
  269. pl.insert(0, pl.pop())
  270. ul.insert(0, ul.pop())
  271. pl.sort(reverse=True)
  272. ul.sort(reverse=True)
  273. self.assertEqual(pl[:], ul[:], 'sort w/ reverse')
  274. mid = pl[len(pl) / 2]
  275. pl.sort(key=lambda x: (mid-x)**2)
  276. ul.sort(key=lambda x: (mid-x)**2)
  277. self.assertEqual(pl[:], ul[:], 'sort w/ key')
  278. def test_12_arithmetic(self):
  279. 'Arithmetic'
  280. pl, ul = self.lists_of_len()
  281. al = range(10,14)
  282. self.assertEqual(list(pl + al), list(ul + al), 'add')
  283. self.assertEqual(type(ul), type(ul + al), 'type of add result')
  284. self.assertEqual(list(al + pl), list(al + ul), 'radd')
  285. self.assertEqual(type(al), type(al + ul), 'type of radd result')
  286. objid = id(ul)
  287. pl += al
  288. ul += al
  289. self.assertEqual(pl[:], ul[:], 'in-place add')
  290. self.assertEqual(objid, id(ul), 'in-place add id')
  291. for n in (-1,0,1,3):
  292. pl, ul = self.lists_of_len()
  293. self.assertEqual(list(pl * n), list(ul * n), 'mul by %d' % n)
  294. self.assertEqual(type(ul), type(ul * n), 'type of mul by %d result' % n)
  295. self.assertEqual(list(n * pl), list(n * ul), 'rmul by %d' % n)
  296. self.assertEqual(type(ul), type(n * ul), 'type of rmul by %d result' % n)
  297. objid = id(ul)
  298. pl *= n
  299. ul *= n
  300. self.assertEqual(pl[:], ul[:], 'in-place mul by %d' % n)
  301. self.assertEqual(objid, id(ul), 'in-place mul by %d id' % n)
  302. pl, ul = self.lists_of_len()
  303. self.assertEqual(pl, ul, 'cmp for equal')
  304. self.assert_(pl >= ul, 'cmp for gte self')
  305. self.assert_(pl <= ul, 'cmp for lte self')
  306. self.assert_(ul >= pl, 'cmp for self gte')
  307. self.assert_(ul <= pl, 'cmp for self lte')
  308. self.assert_(pl + [5] > ul, 'cmp')
  309. self.assert_(pl + [5] >= ul, 'cmp')
  310. self.assert_(pl < ul + [2], 'cmp')
  311. self.assert_(pl <= ul + [2], 'cmp')
  312. self.assert_(ul + [5] > pl, 'cmp')
  313. self.assert_(ul + [5] >= pl, 'cmp')
  314. self.assert_(ul < pl + [2], 'cmp')
  315. self.assert_(ul <= pl + [2], 'cmp')
  316. pl[1] = 20
  317. self.assert_(pl > ul, 'cmp for gt self')
  318. self.assert_(ul < pl, 'cmp for self lt')
  319. pl[1] = -20
  320. self.assert_(pl < ul, 'cmp for lt self')
  321. self.assert_(pl < ul, 'cmp for lt self')
  322. class ListMixinTestSingle(ListMixinTest):
  323. listType = UserListB
  324. def suite():
  325. s = unittest.TestSuite()
  326. s.addTest(unittest.makeSuite(ListMixinTest))
  327. s.addTest(unittest.makeSuite(ListMixinTestSingle))
  328. return s
  329. def run(verbosity=2):
  330. unittest.TextTestRunner(verbosity=verbosity).run(suite())
  331. if __name__ == '__main__':
  332. run()