PageRenderTime 43ms CodeModel.GetById 11ms RepoModel.GetById 0ms app.codeStats 0ms

/rpython/rtyper/test/test_generator.py

https://bitbucket.org/pypy/pypy/
Python | 133 lines | 121 code | 10 blank | 2 comment | 16 complexity | 32a53e6b7adab8e66d0a37cef2a010ec MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. import py
  2. from rpython.rtyper.test.tool import BaseRtypingTest
  3. class TestGenerator(BaseRtypingTest):
  4. def test_simple_explicit(self):
  5. def g(a, b, c):
  6. yield a
  7. yield b
  8. yield c
  9. def f():
  10. gen = g(3, 5, 8)
  11. x = gen.next() * 100
  12. x += gen.next() * 10
  13. x += gen.next()
  14. return x
  15. res = self.interpret(f, [])
  16. assert res == 358
  17. def test_cannot_merge(self):
  18. # merging two different generators is not supported
  19. # right now, but we can use workarounds like here
  20. class MyGen:
  21. _immutable_ = True
  22. def next(self):
  23. raise NotImplementedError
  24. class MyG1(MyGen):
  25. _immutable_ = True
  26. def __init__(self, a):
  27. self._gen = self.g1(a)
  28. def next(self):
  29. return self._gen.next()
  30. @staticmethod
  31. def g1(a):
  32. yield a + 1
  33. yield a + 2
  34. class MyG2(MyGen):
  35. _immutable_ = True
  36. def __init__(self):
  37. self._gen = self.g2()
  38. def next(self):
  39. return self._gen.next()
  40. @staticmethod
  41. def g2():
  42. yield 42
  43. def f(n):
  44. if n > 0:
  45. gen = MyG1(n)
  46. else:
  47. gen = MyG2()
  48. return gen.next()
  49. res = self.interpret(f, [10])
  50. assert res == 11
  51. res = self.interpret(f, [0])
  52. assert res == 42
  53. def test_except_block(self):
  54. def foo():
  55. raise ValueError
  56. def g(a, b, c):
  57. yield a
  58. yield b
  59. try:
  60. foo()
  61. except ValueError:
  62. pass
  63. yield c
  64. def f():
  65. gen = g(3, 5, 8)
  66. x = gen.next() * 100
  67. x += gen.next() * 10
  68. x += gen.next()
  69. return x
  70. res = self.interpret(f, [])
  71. assert res == 358
  72. @py.test.mark.xfail
  73. def test_different_exception(self):
  74. def h(c):
  75. if c == 8:
  76. raise ValueError
  77. def g(c):
  78. try:
  79. h(c)
  80. except Exception as e:
  81. if isinstance(e, ValueError):
  82. raise
  83. raise StopIteration
  84. yield c
  85. def f(x):
  86. try:
  87. for x in g(x):
  88. pass
  89. except ValueError:
  90. return -5
  91. return 5
  92. assert f(8) == -5
  93. res = self.interpret(f, [8])
  94. assert res == -5
  95. def test_iterating_generator(self):
  96. def f():
  97. yield 1
  98. yield 2
  99. yield 3
  100. def g():
  101. s = 0
  102. for x in f():
  103. s += x
  104. return s
  105. res = self.interpret(g, [])
  106. assert res == 6
  107. def test_generator_with_unreachable_yields(self):
  108. def f(n):
  109. if n < 0:
  110. yield 42
  111. yield n
  112. if n < 0:
  113. yield 43
  114. yield n
  115. if n < 0:
  116. yield 44
  117. def main(n):
  118. y = 0
  119. for x in f(abs(n)):
  120. y += x
  121. return y
  122. res = self.interpret(main, [-100])
  123. assert res == 200