test_iter.py 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042
  1. # Test iterators.
  2. import sys
  3. import unittest
  4. from test.support import cpython_only
  5. from test.support.os_helper import TESTFN, unlink
  6. from test.support import check_free_after_iterating, ALWAYS_EQ, NEVER_EQ
  7. import pickle
  8. import collections.abc
  9. # Test result of triple loop (too big to inline)
  10. TRIPLETS = [(0, 0, 0), (0, 0, 1), (0, 0, 2),
  11. (0, 1, 0), (0, 1, 1), (0, 1, 2),
  12. (0, 2, 0), (0, 2, 1), (0, 2, 2),
  13. (1, 0, 0), (1, 0, 1), (1, 0, 2),
  14. (1, 1, 0), (1, 1, 1), (1, 1, 2),
  15. (1, 2, 0), (1, 2, 1), (1, 2, 2),
  16. (2, 0, 0), (2, 0, 1), (2, 0, 2),
  17. (2, 1, 0), (2, 1, 1), (2, 1, 2),
  18. (2, 2, 0), (2, 2, 1), (2, 2, 2)]
  19. # Helper classes
  20. class BasicIterClass:
  21. def __init__(self, n):
  22. self.n = n
  23. self.i = 0
  24. def __next__(self):
  25. res = self.i
  26. if res >= self.n:
  27. raise StopIteration
  28. self.i = res + 1
  29. return res
  30. def __iter__(self):
  31. return self
  32. class IteratingSequenceClass:
  33. def __init__(self, n):
  34. self.n = n
  35. def __iter__(self):
  36. return BasicIterClass(self.n)
  37. class IteratorProxyClass:
  38. def __init__(self, i):
  39. self.i = i
  40. def __next__(self):
  41. return next(self.i)
  42. def __iter__(self):
  43. return self
  44. class SequenceClass:
  45. def __init__(self, n):
  46. self.n = n
  47. def __getitem__(self, i):
  48. if 0 <= i < self.n:
  49. return i
  50. else:
  51. raise IndexError
  52. class SequenceProxyClass:
  53. def __init__(self, s):
  54. self.s = s
  55. def __getitem__(self, i):
  56. return self.s[i]
  57. class UnlimitedSequenceClass:
  58. def __getitem__(self, i):
  59. return i
  60. class DefaultIterClass:
  61. pass
  62. class NoIterClass:
  63. def __getitem__(self, i):
  64. return i
  65. __iter__ = None
  66. class BadIterableClass:
  67. def __iter__(self):
  68. raise ZeroDivisionError
  69. class CallableIterClass:
  70. def __init__(self):
  71. self.i = 0
  72. def __call__(self):
  73. i = self.i
  74. self.i = i + 1
  75. if i > 100:
  76. raise IndexError # Emergency stop
  77. return i
  78. # Main test suite
  79. class TestCase(unittest.TestCase):
  80. # Helper to check that an iterator returns a given sequence
  81. def check_iterator(self, it, seq, pickle=True):
  82. if pickle:
  83. self.check_pickle(it, seq)
  84. res = []
  85. while 1:
  86. try:
  87. val = next(it)
  88. except StopIteration:
  89. break
  90. res.append(val)
  91. self.assertEqual(res, seq)
  92. # Helper to check that a for loop generates a given sequence
  93. def check_for_loop(self, expr, seq, pickle=True):
  94. if pickle:
  95. self.check_pickle(iter(expr), seq)
  96. res = []
  97. for val in expr:
  98. res.append(val)
  99. self.assertEqual(res, seq)
  100. # Helper to check picklability
  101. def check_pickle(self, itorg, seq):
  102. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  103. d = pickle.dumps(itorg, proto)
  104. it = pickle.loads(d)
  105. # Cannot assert type equality because dict iterators unpickle as list
  106. # iterators.
  107. # self.assertEqual(type(itorg), type(it))
  108. self.assertTrue(isinstance(it, collections.abc.Iterator))
  109. self.assertEqual(list(it), seq)
  110. it = pickle.loads(d)
  111. try:
  112. next(it)
  113. except StopIteration:
  114. continue
  115. d = pickle.dumps(it, proto)
  116. it = pickle.loads(d)
  117. self.assertEqual(list(it), seq[1:])
  118. # Test basic use of iter() function
  119. def test_iter_basic(self):
  120. self.check_iterator(iter(range(10)), list(range(10)))
  121. # Test that iter(iter(x)) is the same as iter(x)
  122. def test_iter_idempotency(self):
  123. seq = list(range(10))
  124. it = iter(seq)
  125. it2 = iter(it)
  126. self.assertTrue(it is it2)
  127. # Test that for loops over iterators work
  128. def test_iter_for_loop(self):
  129. self.check_for_loop(iter(range(10)), list(range(10)))
  130. # Test several independent iterators over the same list
  131. def test_iter_independence(self):
  132. seq = range(3)
  133. res = []
  134. for i in iter(seq):
  135. for j in iter(seq):
  136. for k in iter(seq):
  137. res.append((i, j, k))
  138. self.assertEqual(res, TRIPLETS)
  139. # Test triple list comprehension using iterators
  140. def test_nested_comprehensions_iter(self):
  141. seq = range(3)
  142. res = [(i, j, k)
  143. for i in iter(seq) for j in iter(seq) for k in iter(seq)]
  144. self.assertEqual(res, TRIPLETS)
  145. # Test triple list comprehension without iterators
  146. def test_nested_comprehensions_for(self):
  147. seq = range(3)
  148. res = [(i, j, k) for i in seq for j in seq for k in seq]
  149. self.assertEqual(res, TRIPLETS)
  150. # Test a class with __iter__ in a for loop
  151. def test_iter_class_for(self):
  152. self.check_for_loop(IteratingSequenceClass(10), list(range(10)))
  153. # Test a class with __iter__ with explicit iter()
  154. def test_iter_class_iter(self):
  155. self.check_iterator(iter(IteratingSequenceClass(10)), list(range(10)))
  156. # Test for loop on a sequence class without __iter__
  157. def test_seq_class_for(self):
  158. self.check_for_loop(SequenceClass(10), list(range(10)))
  159. # Test iter() on a sequence class without __iter__
  160. def test_seq_class_iter(self):
  161. self.check_iterator(iter(SequenceClass(10)), list(range(10)))
  162. def test_mutating_seq_class_iter_pickle(self):
  163. orig = SequenceClass(5)
  164. for proto in range(pickle.HIGHEST_PROTOCOL + 1):
  165. # initial iterator
  166. itorig = iter(orig)
  167. d = pickle.dumps((itorig, orig), proto)
  168. it, seq = pickle.loads(d)
  169. seq.n = 7
  170. self.assertIs(type(it), type(itorig))
  171. self.assertEqual(list(it), list(range(7)))
  172. # running iterator
  173. next(itorig)
  174. d = pickle.dumps((itorig, orig), proto)
  175. it, seq = pickle.loads(d)
  176. seq.n = 7
  177. self.assertIs(type(it), type(itorig))
  178. self.assertEqual(list(it), list(range(1, 7)))
  179. # empty iterator
  180. for i in range(1, 5):
  181. next(itorig)
  182. d = pickle.dumps((itorig, orig), proto)
  183. it, seq = pickle.loads(d)
  184. seq.n = 7
  185. self.assertIs(type(it), type(itorig))
  186. self.assertEqual(list(it), list(range(5, 7)))
  187. # exhausted iterator
  188. self.assertRaises(StopIteration, next, itorig)
  189. d = pickle.dumps((itorig, orig), proto)
  190. it, seq = pickle.loads(d)
  191. seq.n = 7
  192. self.assertTrue(isinstance(it, collections.abc.Iterator))
  193. self.assertEqual(list(it), [])
  194. def test_mutating_seq_class_exhausted_iter(self):
  195. a = SequenceClass(5)
  196. exhit = iter(a)
  197. empit = iter(a)
  198. for x in exhit: # exhaust the iterator
  199. next(empit) # not exhausted
  200. a.n = 7
  201. self.assertEqual(list(exhit), [])
  202. self.assertEqual(list(empit), [5, 6])
  203. self.assertEqual(list(a), [0, 1, 2, 3, 4, 5, 6])
  204. # Test a new_style class with __iter__ but no next() method
  205. def test_new_style_iter_class(self):
  206. class IterClass(object):
  207. def __iter__(self):
  208. return self
  209. self.assertRaises(TypeError, iter, IterClass())
  210. # Test two-argument iter() with callable instance
  211. def test_iter_callable(self):
  212. self.check_iterator(iter(CallableIterClass(), 10), list(range(10)), pickle=True)
  213. # Test two-argument iter() with function
  214. def test_iter_function(self):
  215. def spam(state=[0]):
  216. i = state[0]
  217. state[0] = i+1
  218. return i
  219. self.check_iterator(iter(spam, 10), list(range(10)), pickle=False)
  220. # Test two-argument iter() with function that raises StopIteration
  221. def test_iter_function_stop(self):
  222. def spam(state=[0]):
  223. i = state[0]
  224. if i == 10:
  225. raise StopIteration
  226. state[0] = i+1
  227. return i
  228. self.check_iterator(iter(spam, 20), list(range(10)), pickle=False)
  229. # Test exception propagation through function iterator
  230. def test_exception_function(self):
  231. def spam(state=[0]):
  232. i = state[0]
  233. state[0] = i+1
  234. if i == 10:
  235. raise RuntimeError
  236. return i
  237. res = []
  238. try:
  239. for x in iter(spam, 20):
  240. res.append(x)
  241. except RuntimeError:
  242. self.assertEqual(res, list(range(10)))
  243. else:
  244. self.fail("should have raised RuntimeError")
  245. # Test exception propagation through sequence iterator
  246. def test_exception_sequence(self):
  247. class MySequenceClass(SequenceClass):
  248. def __getitem__(self, i):
  249. if i == 10:
  250. raise RuntimeError
  251. return SequenceClass.__getitem__(self, i)
  252. res = []
  253. try:
  254. for x in MySequenceClass(20):
  255. res.append(x)
  256. except RuntimeError:
  257. self.assertEqual(res, list(range(10)))
  258. else:
  259. self.fail("should have raised RuntimeError")
  260. # Test for StopIteration from __getitem__
  261. def test_stop_sequence(self):
  262. class MySequenceClass(SequenceClass):
  263. def __getitem__(self, i):
  264. if i == 10:
  265. raise StopIteration
  266. return SequenceClass.__getitem__(self, i)
  267. self.check_for_loop(MySequenceClass(20), list(range(10)), pickle=False)
  268. # Test a big range
  269. def test_iter_big_range(self):
  270. self.check_for_loop(iter(range(10000)), list(range(10000)))
  271. # Test an empty list
  272. def test_iter_empty(self):
  273. self.check_for_loop(iter([]), [])
  274. # Test a tuple
  275. def test_iter_tuple(self):
  276. self.check_for_loop(iter((0,1,2,3,4,5,6,7,8,9)), list(range(10)))
  277. # Test a range
  278. def test_iter_range(self):
  279. self.check_for_loop(iter(range(10)), list(range(10)))
  280. # Test a string
  281. def test_iter_string(self):
  282. self.check_for_loop(iter("abcde"), ["a", "b", "c", "d", "e"])
  283. # Test a directory
  284. def test_iter_dict(self):
  285. dict = {}
  286. for i in range(10):
  287. dict[i] = None
  288. self.check_for_loop(dict, list(dict.keys()))
  289. # Test a file
  290. def test_iter_file(self):
  291. f = open(TESTFN, "w", encoding="utf-8")
  292. try:
  293. for i in range(5):
  294. f.write("%d\n" % i)
  295. finally:
  296. f.close()
  297. f = open(TESTFN, "r", encoding="utf-8")
  298. try:
  299. self.check_for_loop(f, ["0\n", "1\n", "2\n", "3\n", "4\n"], pickle=False)
  300. self.check_for_loop(f, [], pickle=False)
  301. finally:
  302. f.close()
  303. try:
  304. unlink(TESTFN)
  305. except OSError:
  306. pass
  307. # Test list()'s use of iterators.
  308. def test_builtin_list(self):
  309. self.assertEqual(list(SequenceClass(5)), list(range(5)))
  310. self.assertEqual(list(SequenceClass(0)), [])
  311. self.assertEqual(list(()), [])
  312. d = {"one": 1, "two": 2, "three": 3}
  313. self.assertEqual(list(d), list(d.keys()))
  314. self.assertRaises(TypeError, list, list)
  315. self.assertRaises(TypeError, list, 42)
  316. f = open(TESTFN, "w", encoding="utf-8")
  317. try:
  318. for i in range(5):
  319. f.write("%d\n" % i)
  320. finally:
  321. f.close()
  322. f = open(TESTFN, "r", encoding="utf-8")
  323. try:
  324. self.assertEqual(list(f), ["0\n", "1\n", "2\n", "3\n", "4\n"])
  325. f.seek(0, 0)
  326. self.assertEqual(list(f),
  327. ["0\n", "1\n", "2\n", "3\n", "4\n"])
  328. finally:
  329. f.close()
  330. try:
  331. unlink(TESTFN)
  332. except OSError:
  333. pass
  334. # Test tuples()'s use of iterators.
  335. def test_builtin_tuple(self):
  336. self.assertEqual(tuple(SequenceClass(5)), (0, 1, 2, 3, 4))
  337. self.assertEqual(tuple(SequenceClass(0)), ())
  338. self.assertEqual(tuple([]), ())
  339. self.assertEqual(tuple(()), ())
  340. self.assertEqual(tuple("abc"), ("a", "b", "c"))
  341. d = {"one": 1, "two": 2, "three": 3}
  342. self.assertEqual(tuple(d), tuple(d.keys()))
  343. self.assertRaises(TypeError, tuple, list)
  344. self.assertRaises(TypeError, tuple, 42)
  345. f = open(TESTFN, "w", encoding="utf-8")
  346. try:
  347. for i in range(5):
  348. f.write("%d\n" % i)
  349. finally:
  350. f.close()
  351. f = open(TESTFN, "r", encoding="utf-8")
  352. try:
  353. self.assertEqual(tuple(f), ("0\n", "1\n", "2\n", "3\n", "4\n"))
  354. f.seek(0, 0)
  355. self.assertEqual(tuple(f),
  356. ("0\n", "1\n", "2\n", "3\n", "4\n"))
  357. finally:
  358. f.close()
  359. try:
  360. unlink(TESTFN)
  361. except OSError:
  362. pass
  363. # Test filter()'s use of iterators.
  364. def test_builtin_filter(self):
  365. self.assertEqual(list(filter(None, SequenceClass(5))),
  366. list(range(1, 5)))
  367. self.assertEqual(list(filter(None, SequenceClass(0))), [])
  368. self.assertEqual(list(filter(None, ())), [])
  369. self.assertEqual(list(filter(None, "abc")), ["a", "b", "c"])
  370. d = {"one": 1, "two": 2, "three": 3}
  371. self.assertEqual(list(filter(None, d)), list(d.keys()))
  372. self.assertRaises(TypeError, filter, None, list)
  373. self.assertRaises(TypeError, filter, None, 42)
  374. class Boolean:
  375. def __init__(self, truth):
  376. self.truth = truth
  377. def __bool__(self):
  378. return self.truth
  379. bTrue = Boolean(True)
  380. bFalse = Boolean(False)
  381. class Seq:
  382. def __init__(self, *args):
  383. self.vals = args
  384. def __iter__(self):
  385. class SeqIter:
  386. def __init__(self, vals):
  387. self.vals = vals
  388. self.i = 0
  389. def __iter__(self):
  390. return self
  391. def __next__(self):
  392. i = self.i
  393. self.i = i + 1
  394. if i < len(self.vals):
  395. return self.vals[i]
  396. else:
  397. raise StopIteration
  398. return SeqIter(self.vals)
  399. seq = Seq(*([bTrue, bFalse] * 25))
  400. self.assertEqual(list(filter(lambda x: not x, seq)), [bFalse]*25)
  401. self.assertEqual(list(filter(lambda x: not x, iter(seq))), [bFalse]*25)
  402. # Test max() and min()'s use of iterators.
  403. def test_builtin_max_min(self):
  404. self.assertEqual(max(SequenceClass(5)), 4)
  405. self.assertEqual(min(SequenceClass(5)), 0)
  406. self.assertEqual(max(8, -1), 8)
  407. self.assertEqual(min(8, -1), -1)
  408. d = {"one": 1, "two": 2, "three": 3}
  409. self.assertEqual(max(d), "two")
  410. self.assertEqual(min(d), "one")
  411. self.assertEqual(max(d.values()), 3)
  412. self.assertEqual(min(iter(d.values())), 1)
  413. f = open(TESTFN, "w", encoding="utf-8")
  414. try:
  415. f.write("medium line\n")
  416. f.write("xtra large line\n")
  417. f.write("itty-bitty line\n")
  418. finally:
  419. f.close()
  420. f = open(TESTFN, "r", encoding="utf-8")
  421. try:
  422. self.assertEqual(min(f), "itty-bitty line\n")
  423. f.seek(0, 0)
  424. self.assertEqual(max(f), "xtra large line\n")
  425. finally:
  426. f.close()
  427. try:
  428. unlink(TESTFN)
  429. except OSError:
  430. pass
  431. # Test map()'s use of iterators.
  432. def test_builtin_map(self):
  433. self.assertEqual(list(map(lambda x: x+1, SequenceClass(5))),
  434. list(range(1, 6)))
  435. d = {"one": 1, "two": 2, "three": 3}
  436. self.assertEqual(list(map(lambda k, d=d: (k, d[k]), d)),
  437. list(d.items()))
  438. dkeys = list(d.keys())
  439. expected = [(i < len(d) and dkeys[i] or None,
  440. i,
  441. i < len(d) and dkeys[i] or None)
  442. for i in range(3)]
  443. f = open(TESTFN, "w", encoding="utf-8")
  444. try:
  445. for i in range(10):
  446. f.write("xy" * i + "\n") # line i has len 2*i+1
  447. finally:
  448. f.close()
  449. f = open(TESTFN, "r", encoding="utf-8")
  450. try:
  451. self.assertEqual(list(map(len, f)), list(range(1, 21, 2)))
  452. finally:
  453. f.close()
  454. try:
  455. unlink(TESTFN)
  456. except OSError:
  457. pass
  458. # Test zip()'s use of iterators.
  459. def test_builtin_zip(self):
  460. self.assertEqual(list(zip()), [])
  461. self.assertEqual(list(zip(*[])), [])
  462. self.assertEqual(list(zip(*[(1, 2), 'ab'])), [(1, 'a'), (2, 'b')])
  463. self.assertRaises(TypeError, zip, None)
  464. self.assertRaises(TypeError, zip, range(10), 42)
  465. self.assertRaises(TypeError, zip, range(10), zip)
  466. self.assertEqual(list(zip(IteratingSequenceClass(3))),
  467. [(0,), (1,), (2,)])
  468. self.assertEqual(list(zip(SequenceClass(3))),
  469. [(0,), (1,), (2,)])
  470. d = {"one": 1, "two": 2, "three": 3}
  471. self.assertEqual(list(d.items()), list(zip(d, d.values())))
  472. # Generate all ints starting at constructor arg.
  473. class IntsFrom:
  474. def __init__(self, start):
  475. self.i = start
  476. def __iter__(self):
  477. return self
  478. def __next__(self):
  479. i = self.i
  480. self.i = i+1
  481. return i
  482. f = open(TESTFN, "w", encoding="utf-8")
  483. try:
  484. f.write("a\n" "bbb\n" "cc\n")
  485. finally:
  486. f.close()
  487. f = open(TESTFN, "r", encoding="utf-8")
  488. try:
  489. self.assertEqual(list(zip(IntsFrom(0), f, IntsFrom(-100))),
  490. [(0, "a\n", -100),
  491. (1, "bbb\n", -99),
  492. (2, "cc\n", -98)])
  493. finally:
  494. f.close()
  495. try:
  496. unlink(TESTFN)
  497. except OSError:
  498. pass
  499. self.assertEqual(list(zip(range(5))), [(i,) for i in range(5)])
  500. # Classes that lie about their lengths.
  501. class NoGuessLen5:
  502. def __getitem__(self, i):
  503. if i >= 5:
  504. raise IndexError
  505. return i
  506. class Guess3Len5(NoGuessLen5):
  507. def __len__(self):
  508. return 3
  509. class Guess30Len5(NoGuessLen5):
  510. def __len__(self):
  511. return 30
  512. def lzip(*args):
  513. return list(zip(*args))
  514. self.assertEqual(len(Guess3Len5()), 3)
  515. self.assertEqual(len(Guess30Len5()), 30)
  516. self.assertEqual(lzip(NoGuessLen5()), lzip(range(5)))
  517. self.assertEqual(lzip(Guess3Len5()), lzip(range(5)))
  518. self.assertEqual(lzip(Guess30Len5()), lzip(range(5)))
  519. expected = [(i, i) for i in range(5)]
  520. for x in NoGuessLen5(), Guess3Len5(), Guess30Len5():
  521. for y in NoGuessLen5(), Guess3Len5(), Guess30Len5():
  522. self.assertEqual(lzip(x, y), expected)
  523. def test_unicode_join_endcase(self):
  524. # This class inserts a Unicode object into its argument's natural
  525. # iteration, in the 3rd position.
  526. class OhPhooey:
  527. def __init__(self, seq):
  528. self.it = iter(seq)
  529. self.i = 0
  530. def __iter__(self):
  531. return self
  532. def __next__(self):
  533. i = self.i
  534. self.i = i+1
  535. if i == 2:
  536. return "fooled you!"
  537. return next(self.it)
  538. f = open(TESTFN, "w", encoding="utf-8")
  539. try:
  540. f.write("a\n" + "b\n" + "c\n")
  541. finally:
  542. f.close()
  543. f = open(TESTFN, "r", encoding="utf-8")
  544. # Nasty: string.join(s) can't know whether unicode.join() is needed
  545. # until it's seen all of s's elements. But in this case, f's
  546. # iterator cannot be restarted. So what we're testing here is
  547. # whether string.join() can manage to remember everything it's seen
  548. # and pass that on to unicode.join().
  549. try:
  550. got = " - ".join(OhPhooey(f))
  551. self.assertEqual(got, "a\n - b\n - fooled you! - c\n")
  552. finally:
  553. f.close()
  554. try:
  555. unlink(TESTFN)
  556. except OSError:
  557. pass
  558. # Test iterators with 'x in y' and 'x not in y'.
  559. def test_in_and_not_in(self):
  560. for sc5 in IteratingSequenceClass(5), SequenceClass(5):
  561. for i in range(5):
  562. self.assertIn(i, sc5)
  563. for i in "abc", -1, 5, 42.42, (3, 4), [], {1: 1}, 3-12j, sc5:
  564. self.assertNotIn(i, sc5)
  565. self.assertIn(ALWAYS_EQ, IteratorProxyClass(iter([1])))
  566. self.assertIn(ALWAYS_EQ, SequenceProxyClass([1]))
  567. self.assertNotIn(ALWAYS_EQ, IteratorProxyClass(iter([NEVER_EQ])))
  568. self.assertNotIn(ALWAYS_EQ, SequenceProxyClass([NEVER_EQ]))
  569. self.assertIn(NEVER_EQ, IteratorProxyClass(iter([ALWAYS_EQ])))
  570. self.assertIn(NEVER_EQ, SequenceProxyClass([ALWAYS_EQ]))
  571. self.assertRaises(TypeError, lambda: 3 in 12)
  572. self.assertRaises(TypeError, lambda: 3 not in map)
  573. self.assertRaises(ZeroDivisionError, lambda: 3 in BadIterableClass())
  574. d = {"one": 1, "two": 2, "three": 3, 1j: 2j}
  575. for k in d:
  576. self.assertIn(k, d)
  577. self.assertNotIn(k, d.values())
  578. for v in d.values():
  579. self.assertIn(v, d.values())
  580. self.assertNotIn(v, d)
  581. for k, v in d.items():
  582. self.assertIn((k, v), d.items())
  583. self.assertNotIn((v, k), d.items())
  584. f = open(TESTFN, "w", encoding="utf-8")
  585. try:
  586. f.write("a\n" "b\n" "c\n")
  587. finally:
  588. f.close()
  589. f = open(TESTFN, "r", encoding="utf-8")
  590. try:
  591. for chunk in "abc":
  592. f.seek(0, 0)
  593. self.assertNotIn(chunk, f)
  594. f.seek(0, 0)
  595. self.assertIn((chunk + "\n"), f)
  596. finally:
  597. f.close()
  598. try:
  599. unlink(TESTFN)
  600. except OSError:
  601. pass
  602. # Test iterators with operator.countOf (PySequence_Count).
  603. def test_countOf(self):
  604. from operator import countOf
  605. self.assertEqual(countOf([1,2,2,3,2,5], 2), 3)
  606. self.assertEqual(countOf((1,2,2,3,2,5), 2), 3)
  607. self.assertEqual(countOf("122325", "2"), 3)
  608. self.assertEqual(countOf("122325", "6"), 0)
  609. self.assertRaises(TypeError, countOf, 42, 1)
  610. self.assertRaises(TypeError, countOf, countOf, countOf)
  611. d = {"one": 3, "two": 3, "three": 3, 1j: 2j}
  612. for k in d:
  613. self.assertEqual(countOf(d, k), 1)
  614. self.assertEqual(countOf(d.values(), 3), 3)
  615. self.assertEqual(countOf(d.values(), 2j), 1)
  616. self.assertEqual(countOf(d.values(), 1j), 0)
  617. f = open(TESTFN, "w", encoding="utf-8")
  618. try:
  619. f.write("a\n" "b\n" "c\n" "b\n")
  620. finally:
  621. f.close()
  622. f = open(TESTFN, "r", encoding="utf-8")
  623. try:
  624. for letter, count in ("a", 1), ("b", 2), ("c", 1), ("d", 0):
  625. f.seek(0, 0)
  626. self.assertEqual(countOf(f, letter + "\n"), count)
  627. finally:
  628. f.close()
  629. try:
  630. unlink(TESTFN)
  631. except OSError:
  632. pass
  633. # Test iterators with operator.indexOf (PySequence_Index).
  634. def test_indexOf(self):
  635. from operator import indexOf
  636. self.assertEqual(indexOf([1,2,2,3,2,5], 1), 0)
  637. self.assertEqual(indexOf((1,2,2,3,2,5), 2), 1)
  638. self.assertEqual(indexOf((1,2,2,3,2,5), 3), 3)
  639. self.assertEqual(indexOf((1,2,2,3,2,5), 5), 5)
  640. self.assertRaises(ValueError, indexOf, (1,2,2,3,2,5), 0)
  641. self.assertRaises(ValueError, indexOf, (1,2,2,3,2,5), 6)
  642. self.assertEqual(indexOf("122325", "2"), 1)
  643. self.assertEqual(indexOf("122325", "5"), 5)
  644. self.assertRaises(ValueError, indexOf, "122325", "6")
  645. self.assertRaises(TypeError, indexOf, 42, 1)
  646. self.assertRaises(TypeError, indexOf, indexOf, indexOf)
  647. self.assertRaises(ZeroDivisionError, indexOf, BadIterableClass(), 1)
  648. f = open(TESTFN, "w", encoding="utf-8")
  649. try:
  650. f.write("a\n" "b\n" "c\n" "d\n" "e\n")
  651. finally:
  652. f.close()
  653. f = open(TESTFN, "r", encoding="utf-8")
  654. try:
  655. fiter = iter(f)
  656. self.assertEqual(indexOf(fiter, "b\n"), 1)
  657. self.assertEqual(indexOf(fiter, "d\n"), 1)
  658. self.assertEqual(indexOf(fiter, "e\n"), 0)
  659. self.assertRaises(ValueError, indexOf, fiter, "a\n")
  660. finally:
  661. f.close()
  662. try:
  663. unlink(TESTFN)
  664. except OSError:
  665. pass
  666. iclass = IteratingSequenceClass(3)
  667. for i in range(3):
  668. self.assertEqual(indexOf(iclass, i), i)
  669. self.assertRaises(ValueError, indexOf, iclass, -1)
  670. # Test iterators with file.writelines().
  671. def test_writelines(self):
  672. f = open(TESTFN, "w", encoding="utf-8")
  673. try:
  674. self.assertRaises(TypeError, f.writelines, None)
  675. self.assertRaises(TypeError, f.writelines, 42)
  676. f.writelines(["1\n", "2\n"])
  677. f.writelines(("3\n", "4\n"))
  678. f.writelines({'5\n': None})
  679. f.writelines({})
  680. # Try a big chunk too.
  681. class Iterator:
  682. def __init__(self, start, finish):
  683. self.start = start
  684. self.finish = finish
  685. self.i = self.start
  686. def __next__(self):
  687. if self.i >= self.finish:
  688. raise StopIteration
  689. result = str(self.i) + '\n'
  690. self.i += 1
  691. return result
  692. def __iter__(self):
  693. return self
  694. class Whatever:
  695. def __init__(self, start, finish):
  696. self.start = start
  697. self.finish = finish
  698. def __iter__(self):
  699. return Iterator(self.start, self.finish)
  700. f.writelines(Whatever(6, 6+2000))
  701. f.close()
  702. f = open(TESTFN, encoding="utf-8")
  703. expected = [str(i) + "\n" for i in range(1, 2006)]
  704. self.assertEqual(list(f), expected)
  705. finally:
  706. f.close()
  707. try:
  708. unlink(TESTFN)
  709. except OSError:
  710. pass
  711. # Test iterators on RHS of unpacking assignments.
  712. def test_unpack_iter(self):
  713. a, b = 1, 2
  714. self.assertEqual((a, b), (1, 2))
  715. a, b, c = IteratingSequenceClass(3)
  716. self.assertEqual((a, b, c), (0, 1, 2))
  717. try: # too many values
  718. a, b = IteratingSequenceClass(3)
  719. except ValueError:
  720. pass
  721. else:
  722. self.fail("should have raised ValueError")
  723. try: # not enough values
  724. a, b, c = IteratingSequenceClass(2)
  725. except ValueError:
  726. pass
  727. else:
  728. self.fail("should have raised ValueError")
  729. try: # not iterable
  730. a, b, c = len
  731. except TypeError:
  732. pass
  733. else:
  734. self.fail("should have raised TypeError")
  735. a, b, c = {1: 42, 2: 42, 3: 42}.values()
  736. self.assertEqual((a, b, c), (42, 42, 42))
  737. f = open(TESTFN, "w", encoding="utf-8")
  738. lines = ("a\n", "bb\n", "ccc\n")
  739. try:
  740. for line in lines:
  741. f.write(line)
  742. finally:
  743. f.close()
  744. f = open(TESTFN, "r", encoding="utf-8")
  745. try:
  746. a, b, c = f
  747. self.assertEqual((a, b, c), lines)
  748. finally:
  749. f.close()
  750. try:
  751. unlink(TESTFN)
  752. except OSError:
  753. pass
  754. (a, b), (c,) = IteratingSequenceClass(2), {42: 24}
  755. self.assertEqual((a, b, c), (0, 1, 42))
  756. @cpython_only
  757. def test_ref_counting_behavior(self):
  758. class C(object):
  759. count = 0
  760. def __new__(cls):
  761. cls.count += 1
  762. return object.__new__(cls)
  763. def __del__(self):
  764. cls = self.__class__
  765. assert cls.count > 0
  766. cls.count -= 1
  767. x = C()
  768. self.assertEqual(C.count, 1)
  769. del x
  770. self.assertEqual(C.count, 0)
  771. l = [C(), C(), C()]
  772. self.assertEqual(C.count, 3)
  773. try:
  774. a, b = iter(l)
  775. except ValueError:
  776. pass
  777. del l
  778. self.assertEqual(C.count, 0)
  779. # Make sure StopIteration is a "sink state".
  780. # This tests various things that weren't sink states in Python 2.2.1,
  781. # plus various things that always were fine.
  782. def test_sinkstate_list(self):
  783. # This used to fail
  784. a = list(range(5))
  785. b = iter(a)
  786. self.assertEqual(list(b), list(range(5)))
  787. a.extend(range(5, 10))
  788. self.assertEqual(list(b), [])
  789. def test_sinkstate_tuple(self):
  790. a = (0, 1, 2, 3, 4)
  791. b = iter(a)
  792. self.assertEqual(list(b), list(range(5)))
  793. self.assertEqual(list(b), [])
  794. def test_sinkstate_string(self):
  795. a = "abcde"
  796. b = iter(a)
  797. self.assertEqual(list(b), ['a', 'b', 'c', 'd', 'e'])
  798. self.assertEqual(list(b), [])
  799. def test_sinkstate_sequence(self):
  800. # This used to fail
  801. a = SequenceClass(5)
  802. b = iter(a)
  803. self.assertEqual(list(b), list(range(5)))
  804. a.n = 10
  805. self.assertEqual(list(b), [])
  806. def test_sinkstate_callable(self):
  807. # This used to fail
  808. def spam(state=[0]):
  809. i = state[0]
  810. state[0] = i+1
  811. if i == 10:
  812. raise AssertionError("shouldn't have gotten this far")
  813. return i
  814. b = iter(spam, 5)
  815. self.assertEqual(list(b), list(range(5)))
  816. self.assertEqual(list(b), [])
  817. def test_sinkstate_dict(self):
  818. # XXX For a more thorough test, see towards the end of:
  819. # http://mail.python.org/pipermail/python-dev/2002-July/026512.html
  820. a = {1:1, 2:2, 0:0, 4:4, 3:3}
  821. for b in iter(a), a.keys(), a.items(), a.values():
  822. b = iter(a)
  823. self.assertEqual(len(list(b)), 5)
  824. self.assertEqual(list(b), [])
  825. def test_sinkstate_yield(self):
  826. def gen():
  827. for i in range(5):
  828. yield i
  829. b = gen()
  830. self.assertEqual(list(b), list(range(5)))
  831. self.assertEqual(list(b), [])
  832. def test_sinkstate_range(self):
  833. a = range(5)
  834. b = iter(a)
  835. self.assertEqual(list(b), list(range(5)))
  836. self.assertEqual(list(b), [])
  837. def test_sinkstate_enumerate(self):
  838. a = range(5)
  839. e = enumerate(a)
  840. b = iter(e)
  841. self.assertEqual(list(b), list(zip(range(5), range(5))))
  842. self.assertEqual(list(b), [])
  843. def test_3720(self):
  844. # Avoid a crash, when an iterator deletes its next() method.
  845. class BadIterator(object):
  846. def __iter__(self):
  847. return self
  848. def __next__(self):
  849. del BadIterator.__next__
  850. return 1
  851. try:
  852. for i in BadIterator() :
  853. pass
  854. except TypeError:
  855. pass
  856. def test_extending_list_with_iterator_does_not_segfault(self):
  857. # The code to extend a list with an iterator has a fair
  858. # amount of nontrivial logic in terms of guessing how
  859. # much memory to allocate in advance, "stealing" refs,
  860. # and then shrinking at the end. This is a basic smoke
  861. # test for that scenario.
  862. def gen():
  863. for i in range(500):
  864. yield i
  865. lst = [0] * 500
  866. for i in range(240):
  867. lst.pop(0)
  868. lst.extend(gen())
  869. self.assertEqual(len(lst), 760)
  870. @cpython_only
  871. def test_iter_overflow(self):
  872. # Test for the issue 22939
  873. it = iter(UnlimitedSequenceClass())
  874. # Manually set `it_index` to PY_SSIZE_T_MAX-2 without a loop
  875. it.__setstate__(sys.maxsize - 2)
  876. self.assertEqual(next(it), sys.maxsize - 2)
  877. self.assertEqual(next(it), sys.maxsize - 1)
  878. with self.assertRaises(OverflowError):
  879. next(it)
  880. # Check that Overflow error is always raised
  881. with self.assertRaises(OverflowError):
  882. next(it)
  883. def test_iter_neg_setstate(self):
  884. it = iter(UnlimitedSequenceClass())
  885. it.__setstate__(-42)
  886. self.assertEqual(next(it), 0)
  887. self.assertEqual(next(it), 1)
  888. def test_free_after_iterating(self):
  889. check_free_after_iterating(self, iter, SequenceClass, (0,))
  890. def test_error_iter(self):
  891. for typ in (DefaultIterClass, NoIterClass):
  892. self.assertRaises(TypeError, iter, typ())
  893. self.assertRaises(ZeroDivisionError, iter, BadIterableClass())
  894. if __name__ == "__main__":
  895. unittest.main()