run-i16.test 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. [case testI16BasicOps]
  2. from typing import Any, Tuple
  3. from mypy_extensions import i16, i32, i64
  4. from testutil import assertRaises
  5. def test_box_and_unbox() -> None:
  6. values = (list(range(-2**15, -2**15 + 100)) +
  7. list(range(-1000, 1000)) +
  8. list(range(2**15 - 100, 2**15)))
  9. for i in values:
  10. o: Any = i
  11. x: i16 = o
  12. o2: Any = x
  13. assert o == o2
  14. assert x == i
  15. with assertRaises(OverflowError, "int too large to convert to i16"):
  16. o = 2**15
  17. x2: i16 = o
  18. with assertRaises(OverflowError, "int too large to convert to i16"):
  19. o = -2**15 - 1
  20. x3: i16 = o
  21. def div_by_7(x: i16) -> i16:
  22. return x // 7
  23. def div_by_neg_7(x: i16) -> i16:
  24. return x // -7
  25. def div(x: i16, y: i16) -> i16:
  26. return x // y
  27. def test_divide_by_constant() -> None:
  28. for i in range(-1000, 1000):
  29. assert div_by_7(i) == i // 7
  30. for i in range(-2**15, -2**15 + 1000):
  31. assert div_by_7(i) == i // 7
  32. for i in range(2**15 - 1000, 2**15):
  33. assert div_by_7(i) == i // 7
  34. def test_divide_by_negative_constant() -> None:
  35. for i in range(-1000, 1000):
  36. assert div_by_neg_7(i) == i // -7
  37. for i in range(-2**15, -2**15 + 1000):
  38. assert div_by_neg_7(i) == i // -7
  39. for i in range(2**15 - 1000, 2**15):
  40. assert div_by_neg_7(i) == i // -7
  41. def test_divide_by_variable() -> None:
  42. values = (list(range(-50, 50)) +
  43. list(range(-2**15, -2**15 + 10)) +
  44. list(range(2**15 - 10, 2**15)))
  45. for x in values:
  46. for y in values:
  47. if y != 0:
  48. if x // y == 2**15:
  49. with assertRaises(OverflowError, "integer division overflow"):
  50. div(x, y)
  51. else:
  52. assert div(x, y) == x // y
  53. else:
  54. with assertRaises(ZeroDivisionError, "integer division or modulo by zero"):
  55. div(x, y)
  56. def mod_by_7(x: i16) -> i16:
  57. return x % 7
  58. def mod_by_neg_7(x: i16) -> i16:
  59. return x // -7
  60. def mod(x: i16, y: i16) -> i16:
  61. return x % y
  62. def test_mod_by_constant() -> None:
  63. for i in range(-1000, 1000):
  64. assert mod_by_7(i) == i % 7
  65. for i in range(-2**15, -2**15 + 1000):
  66. assert mod_by_7(i) == i % 7
  67. for i in range(2**15 - 1000, 2**15):
  68. assert mod_by_7(i) == i % 7
  69. def test_mod_by_negative_constant() -> None:
  70. for i in range(-1000, 1000):
  71. assert mod_by_neg_7(i) == i // -7
  72. for i in range(-2**15, -2**15 + 1000):
  73. assert mod_by_neg_7(i) == i // -7
  74. for i in range(2**15 - 1000, 2**15):
  75. assert mod_by_neg_7(i) == i // -7
  76. def test_mod_by_variable() -> None:
  77. values = (list(range(-50, 50)) +
  78. list(range(-2**15, -2**15 + 10)) +
  79. list(range(2**15 - 10, 2**15)))
  80. for x in values:
  81. for y in values:
  82. if y != 0:
  83. assert mod(x, y) == x % y
  84. else:
  85. with assertRaises(ZeroDivisionError, "integer division or modulo by zero"):
  86. mod(x, y)
  87. def test_simple_arithmetic_ops() -> None:
  88. zero: i16 = int()
  89. one: i16 = zero + 1
  90. two: i16 = one + 1
  91. neg_one: i16 = -one
  92. assert one + one == 2
  93. assert one + two == 3
  94. assert one + neg_one == 0
  95. assert one - one == 0
  96. assert one - two == -1
  97. assert one * one == 1
  98. assert one * two == 2
  99. assert two * two == 4
  100. assert two * neg_one == -2
  101. assert neg_one * one == -1
  102. assert neg_one * neg_one == 1
  103. assert two * 0 == 0
  104. assert 0 * two == 0
  105. assert -one == -1
  106. assert -two == -2
  107. assert -neg_one == 1
  108. assert -zero == 0
  109. def test_bitwise_ops() -> None:
  110. x: i16 = 13855 + int()
  111. y: i16 = 367 + int()
  112. z: i16 = -11091 + int()
  113. zero: i16 = int()
  114. one: i16 = zero + 1
  115. two: i16 = zero + 2
  116. neg_one: i16 = -one
  117. assert x & y == 15
  118. assert x & z == 5133
  119. assert z & z == z
  120. assert x & zero == 0
  121. assert x | y == 14207
  122. assert x | z == -2369
  123. assert z | z == z
  124. assert x | 0 == x
  125. assert x ^ y == 14192
  126. assert x ^ z == -7502
  127. assert z ^ z == 0
  128. assert z ^ 0 == z
  129. assert x << one == 27710
  130. assert x << two == -10116
  131. assert z << two == 21172
  132. assert z << 0 == z
  133. assert x >> one == 6927
  134. assert x >> two == 3463
  135. assert z >> two == -2773
  136. assert z >> 0 == z
  137. assert ~x == -13856
  138. assert ~z == 11090
  139. assert ~zero == -1
  140. assert ~neg_one == 0
  141. def eq(x: i16, y: i16) -> bool:
  142. return x == y
  143. def test_eq() -> None:
  144. assert eq(int(), int())
  145. assert eq(5 + int(), 5 + int())
  146. assert eq(-5 + int(), -5 + int())
  147. assert not eq(int(), 1 + int())
  148. assert not eq(5 + int(), 6 + int())
  149. assert not eq(-5 + int(), -6 + int())
  150. assert not eq(-5 + int(), 5 + int())
  151. def test_comparisons() -> None:
  152. one: i16 = 1 + int()
  153. one2: i16 = 1 + int()
  154. two: i16 = 2 + int()
  155. assert one < two
  156. assert not (one < one2)
  157. assert not (two < one)
  158. assert two > one
  159. assert not (one > one2)
  160. assert not (one > two)
  161. assert one <= two
  162. assert one <= one2
  163. assert not (two <= one)
  164. assert two >= one
  165. assert one >= one2
  166. assert not (one >= two)
  167. assert one == one2
  168. assert not (one == two)
  169. assert one != two
  170. assert not (one != one2)
  171. def test_mixed_comparisons() -> None:
  172. i16_3: i16 = int() + 3
  173. int_5 = int() + 5
  174. assert i16_3 < int_5
  175. assert int_5 > i16_3
  176. b = i16_3 > int_5
  177. assert not b
  178. int_largest = int() + (1 << 15) - 1
  179. assert int_largest > i16_3
  180. int_smallest = int() - (1 << 15)
  181. assert i16_3 > int_smallest
  182. int_too_big = int() + (1 << 15)
  183. int_too_small = int() - (1 << 15) - 1
  184. with assertRaises(OverflowError):
  185. assert i16_3 < int_too_big
  186. with assertRaises(OverflowError):
  187. assert int_too_big < i16_3
  188. with assertRaises(OverflowError):
  189. assert i16_3 > int_too_small
  190. with assertRaises(OverflowError):
  191. assert int_too_small < i16_3
  192. def test_mixed_arithmetic_and_bitwise_ops() -> None:
  193. i16_3: i16 = int() + 3
  194. int_5 = int() + 5
  195. assert i16_3 + int_5 == 8
  196. assert int_5 - i16_3 == 2
  197. assert i16_3 << int_5 == 96
  198. assert int_5 << i16_3 == 40
  199. assert i16_3 ^ int_5 == 6
  200. assert int_5 | i16_3 == 7
  201. int_largest = int() + (1 << 15) - 1
  202. assert int_largest - i16_3 == 32764
  203. int_smallest = int() - (1 << 15)
  204. assert int_smallest + i16_3 == -32765
  205. int_too_big = int() + (1 << 15)
  206. int_too_small = int() - (1 << 15) - 1
  207. with assertRaises(OverflowError):
  208. assert i16_3 & int_too_big
  209. with assertRaises(OverflowError):
  210. assert int_too_small & i16_3
  211. def test_coerce_to_and_from_int() -> None:
  212. for shift in range(0, 16):
  213. for sign in 1, -1:
  214. for delta in range(-5, 5):
  215. n = sign * (1 << shift) + delta
  216. if -(1 << 15) <= n < (1 << 15):
  217. x: i16 = n
  218. m: int = x
  219. assert m == n
  220. def test_explicit_conversion_to_i16() -> None:
  221. x = i16(5)
  222. assert x == 5
  223. y = int() - 113
  224. x = i16(y)
  225. assert x == -113
  226. n64: i64 = 1733
  227. x = i16(n64)
  228. assert x == 1733
  229. n32: i32 = -1733
  230. x = i16(n32)
  231. assert x == -1733
  232. z = i16(x)
  233. assert z == -1733
  234. def test_explicit_conversion_overflow() -> None:
  235. max_i16 = int() + 2**15 - 1
  236. x = i16(max_i16)
  237. assert x == 2**15 - 1
  238. assert int(x) == max_i16
  239. min_i16 = int() - 2**15
  240. y = i16(min_i16)
  241. assert y == -2**15
  242. assert int(y) == min_i16
  243. too_big = int() + 2**15
  244. with assertRaises(OverflowError):
  245. x = i16(too_big)
  246. too_small = int() - 2**15 - 1
  247. with assertRaises(OverflowError):
  248. x = i16(too_small)
  249. def test_i16_from_large_small_literal() -> None:
  250. x = i16(2**15 - 1)
  251. assert x == 2**15 - 1
  252. x = i16(-2**15)
  253. assert x == -2**15
  254. def test_i16_truncate_from_i64() -> None:
  255. large = i64(2**32 + 65536 + 157 + int())
  256. x = i16(large)
  257. assert x == 157
  258. small = i64(-2**32 - 65536 - 157 + int())
  259. x = i16(small)
  260. assert x == -157
  261. large2 = i64(2**15 + int())
  262. x = i16(large2)
  263. assert x == -2**15
  264. small2 = i64(-2**15 - 1 - int())
  265. x = i16(small2)
  266. assert x == 2**15 - 1
  267. def test_i16_truncate_from_i32() -> None:
  268. large = i32(2**16 + 2**30 + 5 + int())
  269. assert i16(large) == 5
  270. small = i32(-2**16 - 2**30 - 1 + int())
  271. assert i16(small) == -1
  272. def from_float(x: float) -> i16:
  273. return i16(x)
  274. def test_explicit_conversion_from_float() -> None:
  275. assert from_float(0.0) == 0
  276. assert from_float(1.456) == 1
  277. assert from_float(-1234.567) == -1234
  278. assert from_float(2**15 - 1) == 2**15 - 1
  279. assert from_float(-2**15) == -2**15
  280. # The error message could be better, but this is acceptable
  281. with assertRaises(OverflowError, "int too large to convert to i16"):
  282. assert from_float(float(2**15))
  283. with assertRaises(OverflowError, "int too large to convert to i16"):
  284. # One ulp below the lowest valid i64 value
  285. from_float(float(-2**15 - 1))
  286. def test_tuple_i16() -> None:
  287. a: i16 = 1
  288. b: i16 = 2
  289. t = (a, b)
  290. a, b = t
  291. assert a == 1
  292. assert b == 2
  293. x: Any = t
  294. tt: Tuple[i16, i16] = x
  295. assert tt == (1, 2)