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

/pypy/interpreter/test/test_generator.py

https://bitbucket.org/dac_io/pypy
Python | 281 lines | 275 code | 6 blank | 0 comment | 2 complexity | e97c6a69ce3664561d6e1884db973305 MD5 | raw file
  1. class AppTestGenerator:
  2. def test_generator(self):
  3. def f():
  4. yield 1
  5. assert f().next() == 1
  6. def test_generator2(self):
  7. def f():
  8. yield 1
  9. g = f()
  10. assert g.next() == 1
  11. raises(StopIteration, g.next)
  12. def test_attributes(self):
  13. def f():
  14. yield 1
  15. assert g.gi_running
  16. g = f()
  17. assert g.gi_code is f.func_code
  18. assert g.__name__ == 'f'
  19. assert g.gi_frame is not None
  20. assert not g.gi_running
  21. g.next()
  22. assert not g.gi_running
  23. raises(StopIteration, g.next)
  24. assert not g.gi_running
  25. assert g.gi_frame is None
  26. assert g.gi_code is f.func_code
  27. assert g.__name__ == 'f'
  28. def test_generator3(self):
  29. def f():
  30. yield 1
  31. g = f()
  32. assert list(g) == [1]
  33. def test_generator4(self):
  34. def f():
  35. yield 1
  36. g = f()
  37. assert [x for x in g] == [1]
  38. def test_generator5(self):
  39. d = {}
  40. exec """if 1:
  41. def f():
  42. v = (yield )
  43. yield v
  44. g = f()
  45. g.next()
  46. """ in d
  47. g = d['g']
  48. assert g.send(42) == 42
  49. def test_throw1(self):
  50. def f():
  51. yield 2
  52. g = f()
  53. raises(NameError, g.throw, NameError, "Error")
  54. def test_throw2(self):
  55. def f():
  56. yield 2
  57. g = f()
  58. raises(NameError, g.throw, NameError("Error"))
  59. def test_throw3(self):
  60. def f():
  61. try:
  62. yield 1
  63. yield 2
  64. except:
  65. yield 3
  66. g = f()
  67. assert g.next() == 1
  68. assert g.throw(NameError("Error")) == 3
  69. raises(StopIteration, g.next)
  70. def test_throw4(self):
  71. d = {}
  72. exec """if 1:
  73. def f():
  74. try:
  75. yield 1
  76. v = (yield 2)
  77. except:
  78. yield 3
  79. g = f()
  80. """ in d
  81. g = d['g']
  82. assert g.next() == 1
  83. assert g.next() == 2
  84. assert g.throw(NameError("Error")) == 3
  85. raises(StopIteration, g.next)
  86. def test_throw5(self):
  87. def f():
  88. try:
  89. yield 1
  90. except:
  91. x = 3
  92. try:
  93. yield x
  94. except:
  95. pass
  96. g = f()
  97. g.next()
  98. # String exceptions are not allowed anymore
  99. raises(TypeError, g.throw, "Error")
  100. assert g.throw(Exception) == 3
  101. raises(StopIteration, g.throw, Exception)
  102. def test_throw6(self):
  103. def f():
  104. yield 2
  105. g = f()
  106. raises(NameError, g.throw, NameError, "Error", None)
  107. def test_throw_fail(self):
  108. def f():
  109. yield 1
  110. g = f()
  111. raises(TypeError, g.throw, NameError("Error"), "error")
  112. def test_throw_fail2(self):
  113. def f():
  114. yield 1
  115. g = f()
  116. raises(TypeError, g.throw, list())
  117. def test_throw_fail3(self):
  118. def f():
  119. yield 1
  120. g = f()
  121. raises(TypeError, g.throw, NameError("Error"), None, "not tb object")
  122. def test_throw_finishes_generator(self):
  123. def f():
  124. yield 1
  125. g = f()
  126. assert g.gi_frame is not None
  127. raises(ValueError, g.throw, ValueError)
  128. assert g.gi_frame is None
  129. def test_throw_bug(self):
  130. def f():
  131. try:
  132. x.throw(IndexError) # => "generator already executing"
  133. except ValueError:
  134. yield 1
  135. x = f()
  136. res = list(x)
  137. assert res == [1]
  138. def test_throw_on_finished_generator(self):
  139. def f():
  140. yield 1
  141. g = f()
  142. res = g.next()
  143. assert res == 1
  144. raises(StopIteration, g.next)
  145. raises(NameError, g.throw, NameError)
  146. def test_close(self):
  147. def f():
  148. yield 1
  149. g = f()
  150. assert g.close() is None
  151. def test_close2(self):
  152. def f():
  153. try:
  154. yield 1
  155. except GeneratorExit:
  156. raise StopIteration
  157. g = f()
  158. g.next()
  159. assert g.close() is None
  160. def test_close3(self):
  161. def f():
  162. try:
  163. yield 1
  164. except GeneratorExit:
  165. raise NameError
  166. g = f()
  167. g.next()
  168. raises(NameError, g.close)
  169. def test_close_fail(self):
  170. def f():
  171. try:
  172. yield 1
  173. except GeneratorExit:
  174. yield 2
  175. g = f()
  176. g.next()
  177. raises(RuntimeError, g.close)
  178. def test_close_on_collect(self):
  179. ## we need to exec it, else it won't run on python2.4
  180. d = {}
  181. exec """
  182. def f():
  183. try:
  184. yield
  185. finally:
  186. f.x = 42
  187. """.strip() in d
  188. g = d['f']()
  189. g.next()
  190. del g
  191. import gc
  192. gc.collect()
  193. assert d['f'].x == 42
  194. def test_generator_raises_typeerror(self):
  195. def f():
  196. yield 1
  197. g = f()
  198. raises(TypeError, g.send, 1)
  199. def test_generator_explicit_stopiteration(self):
  200. def f():
  201. yield 1
  202. raise StopIteration
  203. g = f()
  204. assert [x for x in g] == [1]
  205. def test_generator_propagate_stopiteration(self):
  206. def f():
  207. it = iter([1])
  208. while 1: yield it.next()
  209. g = f()
  210. assert [x for x in g] == [1]
  211. def test_generator_restart(self):
  212. def g():
  213. i = me.next()
  214. yield i
  215. me = g()
  216. raises(ValueError, me.next)
  217. def test_generator_expression(self):
  218. exec "res = sum(i*i for i in range(5))"
  219. assert res == 30
  220. def test_generator_expression_2(self):
  221. d = {}
  222. exec """
  223. def f():
  224. total = sum(i for i in [x for x in z])
  225. return total, x
  226. z = [1, 2, 7]
  227. res = f()
  228. """ in d
  229. assert d['res'] == (10, 7)
  230. def test_repr(self):
  231. def myFunc():
  232. yield 1
  233. g = myFunc()
  234. r = repr(g)
  235. assert r.startswith("<generator object myFunc at 0x")
  236. assert list(g) == [1]
  237. assert repr(g) == r
  238. def test_unpackiterable_gen(self):
  239. g = (i*i for i in range(-5, 3))
  240. assert set(g) == set([0, 1, 4, 9, 16, 25])
  241. assert set(g) == set()
  242. assert set(i for i in range(0)) == set()
  243. def test_explicit_stop_iteration_unpackiterable(self):
  244. def f():
  245. yield 1
  246. raise StopIteration
  247. assert tuple(f()) == (1,)