seq_tests.py 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. """
  2. Tests common to tuple, list and UserList.UserList
  3. """
  4. import unittest
  5. import sys
  6. import pickle
  7. from test import support
  8. from test.support import ALWAYS_EQ, NEVER_EQ
  9. # Various iterables
  10. # This is used for checking the constructor (here and in test_deque.py)
  11. def iterfunc(seqn):
  12. 'Regular generator'
  13. for i in seqn:
  14. yield i
  15. class Sequence:
  16. 'Sequence using __getitem__'
  17. def __init__(self, seqn):
  18. self.seqn = seqn
  19. def __getitem__(self, i):
  20. return self.seqn[i]
  21. class IterFunc:
  22. 'Sequence using iterator protocol'
  23. def __init__(self, seqn):
  24. self.seqn = seqn
  25. self.i = 0
  26. def __iter__(self):
  27. return self
  28. def __next__(self):
  29. if self.i >= len(self.seqn): raise StopIteration
  30. v = self.seqn[self.i]
  31. self.i += 1
  32. return v
  33. class IterGen:
  34. 'Sequence using iterator protocol defined with a generator'
  35. def __init__(self, seqn):
  36. self.seqn = seqn
  37. self.i = 0
  38. def __iter__(self):
  39. for val in self.seqn:
  40. yield val
  41. class IterNextOnly:
  42. 'Missing __getitem__ and __iter__'
  43. def __init__(self, seqn):
  44. self.seqn = seqn
  45. self.i = 0
  46. def __next__(self):
  47. if self.i >= len(self.seqn): raise StopIteration
  48. v = self.seqn[self.i]
  49. self.i += 1
  50. return v
  51. class IterNoNext:
  52. 'Iterator missing __next__()'
  53. def __init__(self, seqn):
  54. self.seqn = seqn
  55. self.i = 0
  56. def __iter__(self):
  57. return self
  58. class IterGenExc:
  59. 'Test propagation of exceptions'
  60. def __init__(self, seqn):
  61. self.seqn = seqn
  62. self.i = 0
  63. def __iter__(self):
  64. return self
  65. def __next__(self):
  66. 3 // 0
  67. class IterFuncStop:
  68. 'Test immediate stop'
  69. def __init__(self, seqn):
  70. pass
  71. def __iter__(self):
  72. return self
  73. def __next__(self):
  74. raise StopIteration
  75. from itertools import chain
  76. def itermulti(seqn):
  77. 'Test multiple tiers of iterators'
  78. return chain(map(lambda x:x, iterfunc(IterGen(Sequence(seqn)))))
  79. class LyingTuple(tuple):
  80. def __iter__(self):
  81. yield 1
  82. class LyingList(list):
  83. def __iter__(self):
  84. yield 1
  85. class CommonTest(unittest.TestCase):
  86. # The type to be tested
  87. type2test = None
  88. def test_constructors(self):
  89. l0 = []
  90. l1 = [0]
  91. l2 = [0, 1]
  92. u = self.type2test()
  93. u0 = self.type2test(l0)
  94. u1 = self.type2test(l1)
  95. u2 = self.type2test(l2)
  96. uu = self.type2test(u)
  97. uu0 = self.type2test(u0)
  98. uu1 = self.type2test(u1)
  99. uu2 = self.type2test(u2)
  100. v = self.type2test(tuple(u))
  101. class OtherSeq:
  102. def __init__(self, initseq):
  103. self.__data = initseq
  104. def __len__(self):
  105. return len(self.__data)
  106. def __getitem__(self, i):
  107. return self.__data[i]
  108. s = OtherSeq(u0)
  109. v0 = self.type2test(s)
  110. self.assertEqual(len(v0), len(s))
  111. s = "this is also a sequence"
  112. vv = self.type2test(s)
  113. self.assertEqual(len(vv), len(s))
  114. # Create from various iteratables
  115. for s in ("123", "", range(1000), ('do', 1.2), range(2000,2200,5)):
  116. for g in (Sequence, IterFunc, IterGen,
  117. itermulti, iterfunc):
  118. self.assertEqual(self.type2test(g(s)), self.type2test(s))
  119. self.assertEqual(self.type2test(IterFuncStop(s)), self.type2test())
  120. self.assertEqual(self.type2test(c for c in "123"), self.type2test("123"))
  121. self.assertRaises(TypeError, self.type2test, IterNextOnly(s))
  122. self.assertRaises(TypeError, self.type2test, IterNoNext(s))
  123. self.assertRaises(ZeroDivisionError, self.type2test, IterGenExc(s))
  124. # Issue #23757
  125. self.assertEqual(self.type2test(LyingTuple((2,))), self.type2test((1,)))
  126. self.assertEqual(self.type2test(LyingList([2])), self.type2test([1]))
  127. with self.assertRaises(TypeError):
  128. self.type2test(unsupported_arg=[])
  129. def test_truth(self):
  130. self.assertFalse(self.type2test())
  131. self.assertTrue(self.type2test([42]))
  132. def test_getitem(self):
  133. u = self.type2test([0, 1, 2, 3, 4])
  134. for i in range(len(u)):
  135. self.assertEqual(u[i], i)
  136. self.assertEqual(u[int(i)], i)
  137. for i in range(-len(u), -1):
  138. self.assertEqual(u[i], len(u)+i)
  139. self.assertEqual(u[int(i)], len(u)+i)
  140. self.assertRaises(IndexError, u.__getitem__, -len(u)-1)
  141. self.assertRaises(IndexError, u.__getitem__, len(u))
  142. self.assertRaises(ValueError, u.__getitem__, slice(0,10,0))
  143. u = self.type2test()
  144. self.assertRaises(IndexError, u.__getitem__, 0)
  145. self.assertRaises(IndexError, u.__getitem__, -1)
  146. self.assertRaises(TypeError, u.__getitem__)
  147. a = self.type2test([10, 11])
  148. self.assertEqual(a[0], 10)
  149. self.assertEqual(a[1], 11)
  150. self.assertEqual(a[-2], 10)
  151. self.assertEqual(a[-1], 11)
  152. self.assertRaises(IndexError, a.__getitem__, -3)
  153. self.assertRaises(IndexError, a.__getitem__, 3)
  154. def test_getslice(self):
  155. l = [0, 1, 2, 3, 4]
  156. u = self.type2test(l)
  157. self.assertEqual(u[0:0], self.type2test())
  158. self.assertEqual(u[1:2], self.type2test([1]))
  159. self.assertEqual(u[-2:-1], self.type2test([3]))
  160. self.assertEqual(u[-1000:1000], u)
  161. self.assertEqual(u[1000:-1000], self.type2test([]))
  162. self.assertEqual(u[:], u)
  163. self.assertEqual(u[1:None], self.type2test([1, 2, 3, 4]))
  164. self.assertEqual(u[None:3], self.type2test([0, 1, 2]))
  165. # Extended slices
  166. self.assertEqual(u[::], u)
  167. self.assertEqual(u[::2], self.type2test([0, 2, 4]))
  168. self.assertEqual(u[1::2], self.type2test([1, 3]))
  169. self.assertEqual(u[::-1], self.type2test([4, 3, 2, 1, 0]))
  170. self.assertEqual(u[::-2], self.type2test([4, 2, 0]))
  171. self.assertEqual(u[3::-2], self.type2test([3, 1]))
  172. self.assertEqual(u[3:3:-2], self.type2test([]))
  173. self.assertEqual(u[3:2:-2], self.type2test([3]))
  174. self.assertEqual(u[3:1:-2], self.type2test([3]))
  175. self.assertEqual(u[3:0:-2], self.type2test([3, 1]))
  176. self.assertEqual(u[::-100], self.type2test([4]))
  177. self.assertEqual(u[100:-100:], self.type2test([]))
  178. self.assertEqual(u[-100:100:], u)
  179. self.assertEqual(u[100:-100:-1], u[::-1])
  180. self.assertEqual(u[-100:100:-1], self.type2test([]))
  181. self.assertEqual(u[-100:100:2], self.type2test([0, 2, 4]))
  182. # Test extreme cases with long ints
  183. a = self.type2test([0,1,2,3,4])
  184. self.assertEqual(a[ -pow(2,128): 3 ], self.type2test([0,1,2]))
  185. self.assertEqual(a[ 3: pow(2,145) ], self.type2test([3,4]))
  186. self.assertEqual(a[3::sys.maxsize], self.type2test([3]))
  187. def test_contains(self):
  188. u = self.type2test([0, 1, 2])
  189. for i in u:
  190. self.assertIn(i, u)
  191. for i in min(u)-1, max(u)+1:
  192. self.assertNotIn(i, u)
  193. self.assertRaises(TypeError, u.__contains__)
  194. def test_contains_fake(self):
  195. # Sequences must use rich comparison against each item
  196. # (unless "is" is true, or an earlier item answered)
  197. # So ALWAYS_EQ must be found in all non-empty sequences.
  198. self.assertNotIn(ALWAYS_EQ, self.type2test([]))
  199. self.assertIn(ALWAYS_EQ, self.type2test([1]))
  200. self.assertIn(1, self.type2test([ALWAYS_EQ]))
  201. self.assertNotIn(NEVER_EQ, self.type2test([]))
  202. self.assertNotIn(ALWAYS_EQ, self.type2test([NEVER_EQ]))
  203. self.assertIn(NEVER_EQ, self.type2test([ALWAYS_EQ]))
  204. def test_contains_order(self):
  205. # Sequences must test in-order. If a rich comparison has side
  206. # effects, these will be visible to tests against later members.
  207. # In this test, the "side effect" is a short-circuiting raise.
  208. class DoNotTestEq(Exception):
  209. pass
  210. class StopCompares:
  211. def __eq__(self, other):
  212. raise DoNotTestEq
  213. checkfirst = self.type2test([1, StopCompares()])
  214. self.assertIn(1, checkfirst)
  215. checklast = self.type2test([StopCompares(), 1])
  216. self.assertRaises(DoNotTestEq, checklast.__contains__, 1)
  217. def test_len(self):
  218. self.assertEqual(len(self.type2test()), 0)
  219. self.assertEqual(len(self.type2test([])), 0)
  220. self.assertEqual(len(self.type2test([0])), 1)
  221. self.assertEqual(len(self.type2test([0, 1, 2])), 3)
  222. def test_minmax(self):
  223. u = self.type2test([0, 1, 2])
  224. self.assertEqual(min(u), 0)
  225. self.assertEqual(max(u), 2)
  226. def test_addmul(self):
  227. u1 = self.type2test([0])
  228. u2 = self.type2test([0, 1])
  229. self.assertEqual(u1, u1 + self.type2test())
  230. self.assertEqual(u1, self.type2test() + u1)
  231. self.assertEqual(u1 + self.type2test([1]), u2)
  232. self.assertEqual(self.type2test([-1]) + u1, self.type2test([-1, 0]))
  233. self.assertEqual(self.type2test(), u2*0)
  234. self.assertEqual(self.type2test(), 0*u2)
  235. self.assertEqual(self.type2test(), u2*0)
  236. self.assertEqual(self.type2test(), 0*u2)
  237. self.assertEqual(u2, u2*1)
  238. self.assertEqual(u2, 1*u2)
  239. self.assertEqual(u2, u2*1)
  240. self.assertEqual(u2, 1*u2)
  241. self.assertEqual(u2+u2, u2*2)
  242. self.assertEqual(u2+u2, 2*u2)
  243. self.assertEqual(u2+u2, u2*2)
  244. self.assertEqual(u2+u2, 2*u2)
  245. self.assertEqual(u2+u2+u2, u2*3)
  246. self.assertEqual(u2+u2+u2, 3*u2)
  247. class subclass(self.type2test):
  248. pass
  249. u3 = subclass([0, 1])
  250. self.assertEqual(u3, u3*1)
  251. self.assertIsNot(u3, u3*1)
  252. def test_iadd(self):
  253. u = self.type2test([0, 1])
  254. u += self.type2test()
  255. self.assertEqual(u, self.type2test([0, 1]))
  256. u += self.type2test([2, 3])
  257. self.assertEqual(u, self.type2test([0, 1, 2, 3]))
  258. u += self.type2test([4, 5])
  259. self.assertEqual(u, self.type2test([0, 1, 2, 3, 4, 5]))
  260. u = self.type2test("spam")
  261. u += self.type2test("eggs")
  262. self.assertEqual(u, self.type2test("spameggs"))
  263. def test_imul(self):
  264. u = self.type2test([0, 1])
  265. u *= 3
  266. self.assertEqual(u, self.type2test([0, 1, 0, 1, 0, 1]))
  267. u *= 0
  268. self.assertEqual(u, self.type2test([]))
  269. def test_getitemoverwriteiter(self):
  270. # Verify that __getitem__ overrides are not recognized by __iter__
  271. class T(self.type2test):
  272. def __getitem__(self, key):
  273. return str(key) + '!!!'
  274. self.assertEqual(next(iter(T((1,2)))), 1)
  275. def test_repeat(self):
  276. for m in range(4):
  277. s = tuple(range(m))
  278. for n in range(-3, 5):
  279. self.assertEqual(self.type2test(s*n), self.type2test(s)*n)
  280. self.assertEqual(self.type2test(s)*(-4), self.type2test([]))
  281. self.assertEqual(id(s), id(s*1))
  282. def test_bigrepeat(self):
  283. if sys.maxsize <= 2147483647:
  284. x = self.type2test([0])
  285. x *= 2**16
  286. self.assertRaises(MemoryError, x.__mul__, 2**16)
  287. if hasattr(x, '__imul__'):
  288. self.assertRaises(MemoryError, x.__imul__, 2**16)
  289. def test_subscript(self):
  290. a = self.type2test([10, 11])
  291. self.assertEqual(a.__getitem__(0), 10)
  292. self.assertEqual(a.__getitem__(1), 11)
  293. self.assertEqual(a.__getitem__(-2), 10)
  294. self.assertEqual(a.__getitem__(-1), 11)
  295. self.assertRaises(IndexError, a.__getitem__, -3)
  296. self.assertRaises(IndexError, a.__getitem__, 3)
  297. self.assertEqual(a.__getitem__(slice(0,1)), self.type2test([10]))
  298. self.assertEqual(a.__getitem__(slice(1,2)), self.type2test([11]))
  299. self.assertEqual(a.__getitem__(slice(0,2)), self.type2test([10, 11]))
  300. self.assertEqual(a.__getitem__(slice(0,3)), self.type2test([10, 11]))
  301. self.assertEqual(a.__getitem__(slice(3,5)), self.type2test([]))
  302. self.assertRaises(ValueError, a.__getitem__, slice(0, 10, 0))
  303. self.assertRaises(TypeError, a.__getitem__, 'x')
  304. def test_count(self):
  305. a = self.type2test([0, 1, 2])*3
  306. self.assertEqual(a.count(0), 3)
  307. self.assertEqual(a.count(1), 3)
  308. self.assertEqual(a.count(3), 0)
  309. self.assertEqual(a.count(ALWAYS_EQ), 9)
  310. self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).count(1), 2)
  311. self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).count(NEVER_EQ), 2)
  312. self.assertEqual(self.type2test([NEVER_EQ, NEVER_EQ]).count(ALWAYS_EQ), 0)
  313. self.assertRaises(TypeError, a.count)
  314. class BadExc(Exception):
  315. pass
  316. class BadCmp:
  317. def __eq__(self, other):
  318. if other == 2:
  319. raise BadExc()
  320. return False
  321. self.assertRaises(BadExc, a.count, BadCmp())
  322. def test_index(self):
  323. u = self.type2test([0, 1])
  324. self.assertEqual(u.index(0), 0)
  325. self.assertEqual(u.index(1), 1)
  326. self.assertRaises(ValueError, u.index, 2)
  327. u = self.type2test([-2, -1, 0, 0, 1, 2])
  328. self.assertEqual(u.count(0), 2)
  329. self.assertEqual(u.index(0), 2)
  330. self.assertEqual(u.index(0, 2), 2)
  331. self.assertEqual(u.index(-2, -10), 0)
  332. self.assertEqual(u.index(0, 3), 3)
  333. self.assertEqual(u.index(0, 3, 4), 3)
  334. self.assertRaises(ValueError, u.index, 2, 0, -10)
  335. self.assertEqual(u.index(ALWAYS_EQ), 0)
  336. self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).index(1), 0)
  337. self.assertEqual(self.type2test([ALWAYS_EQ, ALWAYS_EQ]).index(NEVER_EQ), 0)
  338. self.assertRaises(ValueError, self.type2test([NEVER_EQ, NEVER_EQ]).index, ALWAYS_EQ)
  339. self.assertRaises(TypeError, u.index)
  340. class BadExc(Exception):
  341. pass
  342. class BadCmp:
  343. def __eq__(self, other):
  344. if other == 2:
  345. raise BadExc()
  346. return False
  347. a = self.type2test([0, 1, 2, 3])
  348. self.assertRaises(BadExc, a.index, BadCmp())
  349. a = self.type2test([-2, -1, 0, 0, 1, 2])
  350. self.assertEqual(a.index(0), 2)
  351. self.assertEqual(a.index(0, 2), 2)
  352. self.assertEqual(a.index(0, -4), 2)
  353. self.assertEqual(a.index(-2, -10), 0)
  354. self.assertEqual(a.index(0, 3), 3)
  355. self.assertEqual(a.index(0, -3), 3)
  356. self.assertEqual(a.index(0, 3, 4), 3)
  357. self.assertEqual(a.index(0, -3, -2), 3)
  358. self.assertEqual(a.index(0, -4*sys.maxsize, 4*sys.maxsize), 2)
  359. self.assertRaises(ValueError, a.index, 0, 4*sys.maxsize,-4*sys.maxsize)
  360. self.assertRaises(ValueError, a.index, 2, 0, -10)
  361. def test_pickle(self):
  362. lst = self.type2test([4, 5, 6, 7])
  363. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  364. lst2 = pickle.loads(pickle.dumps(lst, proto))
  365. self.assertEqual(lst2, lst)
  366. self.assertNotEqual(id(lst2), id(lst))
  367. def test_free_after_iterating(self):
  368. support.check_free_after_iterating(self, iter, self.type2test)
  369. support.check_free_after_iterating(self, reversed, self.type2test)