run-loops.test 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. # Test cases for "range" objects, "for" and "while" loops (compile and run)
  2. [case testFor]
  3. from typing import List, Tuple
  4. def count(n: int) -> None:
  5. for i in range(n):
  6. print(i)
  7. def count_between(n: int, k: int) -> None:
  8. for i in range(n, k):
  9. print(i)
  10. print('n=', n)
  11. def count_down(n: int, k: int) -> None:
  12. for i in range(n, k, -1):
  13. print(i)
  14. def count_double(n: int, k: int) -> None:
  15. for i in range(n, k, 2):
  16. print(i)
  17. def list_iter(l: List[int]) -> None:
  18. for i in l:
  19. print(i)
  20. def tuple_iter(l: Tuple[int, ...]) -> None:
  21. for i in l:
  22. print(i)
  23. def str_iter(l: str) -> None:
  24. for i in l:
  25. print(i)
  26. def list_rev_iter(l: List[int]) -> None:
  27. for i in reversed(l):
  28. print(i)
  29. def list_rev_iter_lol(l: List[int]) -> None:
  30. for i in reversed(l):
  31. print(i)
  32. if i == 3:
  33. while l:
  34. l.pop()
  35. def count_down_short() -> None:
  36. for i in range(10, 0, -1):
  37. print(i)
  38. [file driver.py]
  39. from native import (
  40. count, list_iter, list_rev_iter, list_rev_iter_lol, count_between, count_down, count_double,
  41. count_down_short, tuple_iter, str_iter,
  42. )
  43. count(5)
  44. list_iter(list(reversed(range(5))))
  45. list_rev_iter(list(reversed(range(5))))
  46. count_between(11, 15)
  47. count_between(10**20, 10**20+3)
  48. count_down(20, 10)
  49. count_double(10, 15)
  50. count_down_short()
  51. print('==')
  52. list_rev_iter_lol(list(reversed(range(5))))
  53. tuple_iter((1, 2, 3))
  54. str_iter("abc")
  55. [out]
  56. 0
  57. 1
  58. 2
  59. 3
  60. 4
  61. 4
  62. 3
  63. 2
  64. 1
  65. 0
  66. 0
  67. 1
  68. 2
  69. 3
  70. 4
  71. 11
  72. 12
  73. 13
  74. 14
  75. n= 11
  76. 100000000000000000000
  77. 100000000000000000001
  78. 100000000000000000002
  79. n= 100000000000000000000
  80. 20
  81. 19
  82. 18
  83. 17
  84. 16
  85. 15
  86. 14
  87. 13
  88. 12
  89. 11
  90. 10
  91. 12
  92. 14
  93. 10
  94. 9
  95. 8
  96. 7
  97. 6
  98. 5
  99. 4
  100. 3
  101. 2
  102. 1
  103. ==
  104. 0
  105. 1
  106. 2
  107. 3
  108. 1
  109. 2
  110. 3
  111. a
  112. b
  113. c
  114. [case testLoopElse]
  115. from typing import Iterator
  116. def run_for_range(n: int) -> None:
  117. for i in range(n):
  118. if i == 3:
  119. break
  120. print(i)
  121. else:
  122. print(n+1)
  123. def run_for_list(n: int) -> None:
  124. for i in list(range(n)):
  125. if i == 3:
  126. break
  127. print(i)
  128. else:
  129. print(n+1)
  130. def run_for_iter(n: int) -> None:
  131. def identity(x: Iterator[int]) -> Iterator[int]:
  132. return x
  133. for i in identity(range(n)):
  134. if i == 3:
  135. break
  136. print(i)
  137. else:
  138. print(n+1)
  139. def count(n: int) -> int:
  140. i = 1
  141. while i <= n:
  142. i = i + 1
  143. if i == 5:
  144. break
  145. else:
  146. i *= -1
  147. return i
  148. def nested_while() -> int:
  149. while True:
  150. while False:
  151. pass
  152. else:
  153. break
  154. else:
  155. return -1
  156. return 0
  157. def nested_for() -> int:
  158. for x in range(1000):
  159. for y in [1,2,3]:
  160. pass
  161. else:
  162. break
  163. else:
  164. return -1
  165. return 0
  166. [file driver.py]
  167. from native import run_for_range, run_for_list, run_for_iter, count, nested_while, nested_for
  168. assert nested_while() == 0
  169. assert nested_for() == 0
  170. assert count(0) == -1
  171. assert count(1) == -2
  172. assert count(5) == 5
  173. assert count(6) == 5
  174. run_for_range(3)
  175. run_for_range(5)
  176. print('==')
  177. run_for_list(3)
  178. run_for_list(5)
  179. print('==')
  180. run_for_iter(3)
  181. run_for_iter(5)
  182. [out]
  183. 0
  184. 1
  185. 2
  186. 4
  187. 0
  188. 1
  189. 2
  190. ==
  191. 0
  192. 1
  193. 2
  194. 4
  195. 0
  196. 1
  197. 2
  198. ==
  199. 0
  200. 1
  201. 2
  202. 4
  203. 0
  204. 1
  205. 2
  206. [case testNestedLoopSameIdx]
  207. from typing import List, Generator
  208. def nested_enumerate() -> None:
  209. l1 = [0,1,2]
  210. l2 = [0,1,2]
  211. outer_seen = []
  212. outer = 0
  213. for i, j in enumerate(l1):
  214. assert i == outer
  215. outer_seen.append(i)
  216. inner = 0
  217. for i, k in enumerate(l2):
  218. assert i == inner
  219. inner += 1
  220. outer += 1
  221. assert outer_seen == l1
  222. def nested_range() -> None:
  223. outer = 0
  224. outer_seen = []
  225. for i in range(3):
  226. assert i == outer
  227. outer_seen.append(i)
  228. inner = 0
  229. for i in range(3):
  230. assert i == inner
  231. inner += 1
  232. outer += 1
  233. assert outer_seen == [0,1,2]
  234. def nested_list() -> None:
  235. l1 = [0,1,2]
  236. l2 = [0,1,2]
  237. outer_seen = []
  238. outer = 0
  239. for i in l1:
  240. assert i == outer
  241. outer_seen.append(i)
  242. inner = 0
  243. for i in l2:
  244. assert i == inner
  245. inner += 1
  246. outer += 1
  247. assert outer_seen == l1
  248. def nested_yield() -> Generator:
  249. for i in range(3):
  250. for i in range(3):
  251. yield i
  252. yield i
  253. [file driver.py]
  254. from native import nested_enumerate, nested_range, nested_list, nested_yield
  255. nested_enumerate()
  256. nested_range()
  257. nested_list()
  258. gen = nested_yield()
  259. for k in range(12):
  260. assert next(gen) == k % 4
  261. [out]
  262. [case testForIterable]
  263. from typing import Iterable, Dict, Any, Tuple
  264. def iterate_over_any(a: Any) -> None:
  265. for element in a:
  266. print(element)
  267. def iterate_over_iterable(iterable: Iterable[T]) -> None:
  268. for element in iterable:
  269. print(element)
  270. def iterate_and_delete(d: Dict[int, int]) -> None:
  271. for key in d:
  272. d.pop(key)
  273. def sum_over_values(d: Dict[int, int]) -> int:
  274. s = 0
  275. for key in d:
  276. s = s + d[key]
  277. return s
  278. def sum_over_even_values(d: Dict[int, int]) -> int:
  279. s = 0
  280. for key in d:
  281. if d[key] % 2:
  282. continue
  283. s = s + d[key]
  284. return s
  285. def sum_over_two_values(d: Dict[int, int]) -> int:
  286. s = 0
  287. i = 0
  288. for key in d:
  289. if i == 2:
  290. break
  291. s = s + d[key]
  292. i = i + 1
  293. return s
  294. def iterate_over_tuple(iterable: Tuple[int, int, int]) -> None:
  295. for element in iterable:
  296. print(element)
  297. [file driver.py]
  298. from native import iterate_over_any, iterate_over_iterable, iterate_and_delete, sum_over_values, sum_over_even_values, sum_over_two_values, iterate_over_tuple
  299. import traceback
  300. def broken_generator(n):
  301. num = 0
  302. while num < n:
  303. yield num
  304. num += 1
  305. raise Exception('Exception Manually Raised')
  306. d = {1:1, 2:2, 3:3, 4:4, 5:5}
  307. print(sum_over_values(d))
  308. print(sum_over_even_values(d))
  309. print(sum_over_two_values(d))
  310. try:
  311. iterate_over_any(5)
  312. except TypeError:
  313. traceback.print_exc()
  314. try:
  315. iterate_over_iterable(broken_generator(5))
  316. except Exception:
  317. traceback.print_exc()
  318. try:
  319. iterate_and_delete(d)
  320. except RuntimeError:
  321. traceback.print_exc()
  322. iterate_over_tuple((1, 2, 3))
  323. [out]
  324. Traceback (most recent call last):
  325. File "driver.py", line 16, in <module>
  326. iterate_over_any(5)
  327. File "native.py", line 3, in iterate_over_any
  328. for element in a:
  329. TypeError: 'int' object is not iterable
  330. Traceback (most recent call last):
  331. File "driver.py", line 20, in <module>
  332. iterate_over_iterable(broken_generator(5))
  333. File "native.py", line 7, in iterate_over_iterable
  334. for element in iterable:
  335. File "driver.py", line 8, in broken_generator
  336. raise Exception('Exception Manually Raised')
  337. Exception: Exception Manually Raised
  338. Traceback (most recent call last):
  339. File "driver.py", line 24, in <module>
  340. iterate_and_delete(d)
  341. File "native.py", line 11, in iterate_and_delete
  342. for key in d:
  343. RuntimeError: dictionary changed size during iteration
  344. 15
  345. 6
  346. 3
  347. 0
  348. 1
  349. 2
  350. 3
  351. 4
  352. 1
  353. 2
  354. 3
  355. [case testContinueFor]
  356. def f() -> None:
  357. for n in range(5):
  358. continue
  359. [file driver.py]
  360. from native import f
  361. f()
  362. [case testMultipleVarsWithLoops]
  363. # Test comprehensions and for loops with multiple index variables
  364. l = [(1, 2, 'a'), (3, 4, 'b'), (5, 6, 'c')]
  365. l2 = [str(a*100+b)+' '+c for a, b, c in l]
  366. l3 = []
  367. for a, b, c in l:
  368. l3.append(str(a*1000+b)+' '+c)
  369. [file driver.py]
  370. from native import l, l2, l3
  371. for a in l2 + l3:
  372. print(a)
  373. [out]
  374. 102 a
  375. 304 b
  376. 506 c
  377. 1002 a
  378. 3004 b
  379. 5006 c
  380. [case testForZipAndEnumerate]
  381. from typing import Iterable, List, Any
  382. def f(a: Iterable[int], b: List[int]) -> List[Any]:
  383. res = []
  384. for (x, y), z in zip(enumerate(a), b):
  385. res.append((x, y, z))
  386. return res
  387. def g(a: Iterable[int], b: Iterable[str]) -> List[Any]:
  388. res = []
  389. for x, (y, z) in enumerate(zip(a, b)):
  390. res.append((x, y, z))
  391. return res
  392. [file driver.py]
  393. from native import f, g
  394. assert f([6, 7], [8, 9]) == [(0, 6, 8), (1, 7, 9)]
  395. assert g([6, 7], ['a', 'b']) == [(0, 6, 'a'), (1, 7, 'b')]
  396. assert f([6, 7], [8]) == [(0, 6, 8)]
  397. assert f([6], [8, 9]) == [(0, 6, 8)]
  398. [case testIterTypeTrickiness]
  399. # Test inferring the type of a for loop body doesn't cause us grief
  400. # Extracted from somethings that broke in mypy
  401. from typing import Optional
  402. # really I only care that this one build
  403. def foo(x: object) -> None:
  404. if isinstance(x, dict):
  405. for a in x:
  406. pass
  407. def bar(x: Optional[str]) -> None:
  408. vars = (
  409. ("a", 'lol'),
  410. ("b", 'asdf'),
  411. ("lol", x),
  412. ("an int", 10),
  413. )
  414. for name, value in vars:
  415. pass
  416. [file driver.py]
  417. from native import bar
  418. bar(None)
  419. [case testRangeObject]
  420. from typing import Any
  421. def f(x: range) -> int:
  422. sum = 0
  423. for i in x:
  424. sum += i
  425. return sum
  426. def test_range_object() -> None:
  427. r1 = range(4, 12, 2)
  428. tmp_list = [x for x in r1]
  429. assert tmp_list == [4, 6, 8, 10]
  430. assert f(r1) == 28
  431. r2: Any = range(10)
  432. assert f(r2) == 45
  433. r3: Any = 'x'
  434. try:
  435. f(r3)
  436. except TypeError as e:
  437. assert "range object expected; got str" in str(e)
  438. try:
  439. ff: Any = f
  440. ff(r3)
  441. except TypeError as e:
  442. assert "range object expected; got str" in str(e)
  443. try:
  444. r4 = range(4, 12, 0)
  445. except ValueError as e:
  446. assert "range() arg 3 must not be zero" in str(e)