PageRenderTime 25ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/rpython/test/test_rrange.py

https://bitbucket.org/pypy/pypy/
Python | 194 lines | 170 code | 24 blank | 0 comment | 26 complexity | 571713e1cdb9cc9765043ca0ce60a534 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, Apache-2.0
  1. from pypy.rpython.rrange import *
  2. from pypy.rpython.test.tool import BaseRtypingTest, LLRtypeMixin, OORtypeMixin
  3. from pypy.rlib.rarithmetic import intmask
  4. class BaseTestRrange(BaseRtypingTest):
  5. def test_rlist_range(self):
  6. def test1(start, stop, step, varstep):
  7. expected = range(start, stop, step)
  8. length = len(expected)
  9. if varstep:
  10. l = self.rrange.ll_newrangest(start, stop, step)
  11. step = l.step
  12. else:
  13. RANGE = self.rrange.RangeRepr(step).RANGE
  14. l = self.rrange.ll_newrange(RANGE,start,stop)
  15. assert ll_rangelen(l, step) == length
  16. lst = [ll_rangeitem(dum_nocheck, l, i, step) for i in range(length)]
  17. assert lst == expected
  18. lst = [ll_rangeitem_nonneg(dum_nocheck, l, i, step) for i in range(length)]
  19. assert lst == expected
  20. lst = [ll_rangeitem(dum_nocheck, l, i-length, step) for i in range(length)]
  21. assert lst == expected
  22. for start in (-10, 0, 1, 10):
  23. for stop in (-8, 0, 4, 8, 25):
  24. for step in (1, 2, 3, -1, -2):
  25. for varstep in False, True:
  26. test1(start, stop, step, varstep)
  27. def test_range(self):
  28. def dummyfn(N):
  29. total = 0
  30. for i in range(N):
  31. total += i
  32. return total
  33. res = self.interpret(dummyfn, [10])
  34. assert res == 45
  35. def test_range_is_lazy(self):
  36. def dummyfn(N, M):
  37. total = 0
  38. for i in range(M):
  39. if i == N:
  40. break
  41. total += i
  42. return total
  43. res = self.interpret(dummyfn, [10, 2147418112])
  44. assert res == 45
  45. def test_range_item(self):
  46. def dummyfn(start, stop, i):
  47. r = range(start, stop)
  48. return r[i]
  49. res = self.interpret(dummyfn, [10, 17, 4])
  50. assert res == 14
  51. res = self.interpret(dummyfn, [10, 17, -2])
  52. assert res == 15
  53. def test_xrange(self):
  54. def dummyfn(N):
  55. total = 0
  56. for i in xrange(N):
  57. total += i
  58. return total
  59. res = self.interpret(dummyfn, [10])
  60. assert res == 45
  61. def test_range_len_nostep(self):
  62. def dummyfn(start, stop):
  63. r = range(start, stop)
  64. return len(r)
  65. start, stop = 10, 17
  66. res = self.interpret(dummyfn, [start, stop])
  67. assert res == dummyfn(start, stop)
  68. start, stop = 17, 10
  69. res = self.interpret(dummyfn, [start, stop])
  70. assert res == 0
  71. def test_range_len_step_const(self):
  72. def dummyfn(start, stop):
  73. r = range(start, stop, -2)
  74. return len(r)
  75. start, stop = 10, 17
  76. res = self.interpret(dummyfn, [start, stop])
  77. assert res == 0
  78. start, stop = 17, 10
  79. res = self.interpret(dummyfn, [start, stop])
  80. assert res == dummyfn(start, stop)
  81. def test_range_len_step_nonconst(self):
  82. def dummyfn(start, stop, step):
  83. r = range(start, stop, step)
  84. return len(r)
  85. start, stop, step = 10, 17, -3
  86. res = self.interpret(dummyfn, [start, stop, step])
  87. assert res == 0
  88. start, stop, step = 17, 10, -3
  89. res = self.interpret(dummyfn, [start, stop, step])
  90. assert res == dummyfn(start, stop, step)
  91. def test_range2list(self):
  92. def dummyfn(start, stop):
  93. r = range(start, stop)
  94. r.reverse()
  95. return r[0]
  96. start, stop = 10, 17
  97. res = self.interpret(dummyfn, [start, stop])
  98. assert res == dummyfn(start, stop)
  99. def check_failed(self, func, *args):
  100. try:
  101. self.interpret(func, *args, **kwargs)
  102. except:
  103. return True
  104. else:
  105. return False
  106. def test_range_extra(self):
  107. def failingfn_const():
  108. r = range(10, 17, 0)
  109. return r[-1]
  110. assert self.check_failed(failingfn_const, [])
  111. def failingfn_var(step):
  112. r = range(10, 17, step)
  113. return r[-1]
  114. step = 3
  115. res = self.interpret(failingfn_var, [step])
  116. assert res == failingfn_var(step)
  117. step = 0
  118. assert self.check_failed(failingfn_var, [step])
  119. def test_range_iter(self):
  120. def fn(start, stop, step):
  121. res = 0
  122. if step == 0:
  123. if stop >= start:
  124. r = range(start, stop, 1)
  125. else:
  126. r = range(start, stop, -1)
  127. else:
  128. r = range(start, stop, step)
  129. for i in r:
  130. res = res * 51 + i
  131. return res
  132. for args in [2, 7, 0], [7, 2, 0], [10, 50, 7], [50, -10, -3]:
  133. res = self.interpret(fn, args)
  134. assert res == intmask(fn(*args))
  135. def test_empty_range(self):
  136. def g(lst):
  137. total = 0
  138. for i in range(len(lst)):
  139. total += lst[i]
  140. return total
  141. def fn():
  142. return g([])
  143. res = self.interpret(fn, [])
  144. assert res == 0
  145. def test_enumerate(self):
  146. def fn(n):
  147. for i, x in enumerate([123, 456, 789, 654]):
  148. if i == n:
  149. return x
  150. return 5
  151. res = self.interpret(fn, [2])
  152. assert res == 789
  153. def test_enumerate_instances(self):
  154. class A:
  155. pass
  156. def fn(n):
  157. a = A()
  158. b = A()
  159. a.k = 10
  160. b.k = 20
  161. for i, x in enumerate([a, b]):
  162. if i == n:
  163. return x.k
  164. return 5
  165. res = self.interpret(fn, [1])
  166. assert res == 20
  167. class TestLLtype(BaseTestRrange, LLRtypeMixin):
  168. from pypy.rpython.lltypesystem import rrange
  169. class TestOOtype(BaseTestRrange, OORtypeMixin):
  170. from pypy.rpython.ootypesystem import rrange