run-u8.test 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. [case testU8BasicOps]
  2. from typing import Any, Tuple
  3. from mypy_extensions import u8, i16, i32, i64
  4. from typing_extensions import Final
  5. from testutil import assertRaises
  6. ERROR: Final = 239
  7. def test_box_and_unbox() -> None:
  8. for i in range(0, 256):
  9. o: Any = i
  10. x: u8 = o
  11. o2: Any = x
  12. assert o == o2
  13. assert x == i
  14. with assertRaises(OverflowError, "int too large or small to convert to u8"):
  15. o = 256
  16. x2: u8 = o
  17. with assertRaises(OverflowError, "int too large or small to convert to u8"):
  18. o = -1
  19. x3: u8 = o
  20. def div_by_7(x: u8) -> u8:
  21. return x // 7
  22. def div(x: u8, y: u8) -> u8:
  23. return x // y
  24. def test_divide_by_constant() -> None:
  25. for i in range(0, 256):
  26. assert div_by_7(i) == i // 7
  27. def test_divide_by_variable() -> None:
  28. for x in range(0, 256):
  29. for y in range(0, 256):
  30. if y != 0:
  31. assert div(x, y) == x // y
  32. else:
  33. with assertRaises(ZeroDivisionError, "integer division or modulo by zero"):
  34. div(x, y)
  35. def mod_by_7(x: u8) -> u8:
  36. return x % 7
  37. def mod(x: u8, y: u8) -> u8:
  38. return x % y
  39. def test_mod_by_constant() -> None:
  40. for i in range(0, 256):
  41. assert mod_by_7(i) == i % 7
  42. def test_mod_by_variable() -> None:
  43. for x in range(0, 256):
  44. for y in range(0, 256):
  45. if y != 0:
  46. assert mod(x, y) == x % y
  47. else:
  48. with assertRaises(ZeroDivisionError, "integer division or modulo by zero"):
  49. mod(x, y)
  50. def test_simple_arithmetic_ops() -> None:
  51. zero: u8 = int()
  52. one: u8 = zero + 1
  53. two: u8 = one + 1
  54. neg_one: u8 = -one
  55. assert neg_one == 255
  56. assert one + one == 2
  57. assert one + two == 3
  58. assert one + neg_one == 0
  59. assert one - one == 0
  60. assert one - two == 255
  61. assert one * one == 1
  62. assert one * two == 2
  63. assert two * two == 4
  64. assert two * neg_one == 254
  65. assert neg_one * one == 255
  66. assert neg_one * neg_one == 1
  67. assert two * 0 == 0
  68. assert 0 * two == 0
  69. assert -one == 255
  70. assert -two == 254
  71. assert -neg_one == 1
  72. assert -zero == 0
  73. def test_bitwise_ops() -> None:
  74. x: u8 = 184 + int()
  75. y: u8 = 79 + int()
  76. z: u8 = 113 + int()
  77. zero: u8 = int()
  78. one: u8 = zero + 1
  79. two: u8 = zero + 2
  80. neg_one: u8 = -one
  81. assert x & y == 8
  82. assert x & z == 48
  83. assert z & z == z
  84. assert x & zero == 0
  85. assert x | y == 255
  86. assert x | z == 249
  87. assert z | z == z
  88. assert x | 0 == x
  89. assert x ^ y == 247
  90. assert x ^ z == 201
  91. assert z ^ z == 0
  92. assert z ^ 0 == z
  93. assert x << one == 112
  94. assert x << two == 224
  95. assert z << two == 196
  96. assert z << 0 == z
  97. assert x >> one == 92
  98. assert x >> two == 46
  99. assert z >> two == 28
  100. assert z >> 0 == z
  101. for i in range(256):
  102. t: u8 = i
  103. assert ~t == (~(i + int()) & 0xff)
  104. def eq(x: u8, y: u8) -> bool:
  105. return x == y
  106. def test_eq() -> None:
  107. assert eq(int(), int())
  108. assert eq(5 + int(), 5 + int())
  109. assert not eq(int(), 1 + int())
  110. assert not eq(5 + int(), 6 + int())
  111. def test_comparisons() -> None:
  112. one: u8 = 1 + int()
  113. one2: u8 = 1 + int()
  114. two: u8 = 2 + int()
  115. assert one < two
  116. assert not (one < one2)
  117. assert not (two < one)
  118. assert two > one
  119. assert not (one > one2)
  120. assert not (one > two)
  121. assert one <= two
  122. assert one <= one2
  123. assert not (two <= one)
  124. assert two >= one
  125. assert one >= one2
  126. assert not (one >= two)
  127. assert one == one2
  128. assert not (one == two)
  129. assert one != two
  130. assert not (one != one2)
  131. def test_mixed_comparisons() -> None:
  132. u8_3: u8 = int() + 3
  133. int_5 = int() + 5
  134. assert u8_3 < int_5
  135. assert int_5 > u8_3
  136. b = u8_3 > int_5
  137. assert not b
  138. int_largest = int() + 255
  139. assert int_largest > u8_3
  140. int_smallest = int()
  141. assert u8_3 > int_smallest
  142. int_too_big = int() + 256
  143. int_too_small = int() -1
  144. with assertRaises(OverflowError):
  145. assert u8_3 < int_too_big
  146. with assertRaises(OverflowError):
  147. assert int_too_big < u8_3
  148. with assertRaises(OverflowError):
  149. assert u8_3 > int_too_small
  150. with assertRaises(OverflowError):
  151. assert int_too_small < u8_3
  152. def test_mixed_arithmetic_and_bitwise_ops() -> None:
  153. u8_3: u8 = int() + 3
  154. int_5 = int() + 5
  155. assert u8_3 + int_5 == 8
  156. assert int_5 - u8_3 == 2
  157. assert u8_3 << int_5 == 96
  158. assert int_5 << u8_3 == 40
  159. assert u8_3 ^ int_5 == 6
  160. assert int_5 | u8_3 == 7
  161. int_largest = int() + 255
  162. assert int_largest - u8_3 == 252
  163. int_smallest = int()
  164. assert int_smallest + u8_3 == 3
  165. int_too_big = int() + 256
  166. int_too_small = int() - 1
  167. with assertRaises(OverflowError):
  168. assert u8_3 & int_too_big
  169. with assertRaises(OverflowError):
  170. assert int_too_small & u8_3
  171. def test_coerce_to_and_from_int() -> None:
  172. for n in range(0, 256):
  173. x: u8 = n
  174. m: int = x
  175. assert m == n
  176. def test_explicit_conversion_to_u8() -> None:
  177. x = u8(5)
  178. assert x == 5
  179. y = int() + ERROR
  180. x = u8(y)
  181. assert x == ERROR
  182. n64: i64 = 233
  183. x = u8(n64)
  184. assert x == 233
  185. n32: i32 = 234
  186. x = u8(n32)
  187. assert x == 234
  188. z = u8(x)
  189. assert z == 234
  190. n16: i16 = 231
  191. x = u8(n16)
  192. assert x == 231
  193. def test_explicit_conversion_overflow() -> None:
  194. max_u8 = int() + 255
  195. x = u8(max_u8)
  196. assert x == 255
  197. assert int(x) == max_u8
  198. min_u8 = int()
  199. y = u8(min_u8)
  200. assert y == 0
  201. assert int(y) == min_u8
  202. too_big = int() + 256
  203. with assertRaises(OverflowError):
  204. x = u8(too_big)
  205. too_small = int() - 1
  206. with assertRaises(OverflowError):
  207. x = u8(too_small)
  208. def test_u8_from_large_small_literal() -> None:
  209. x = u8(255) # XXX u8(2**15 - 1)
  210. assert x == 255
  211. x = u8(0)
  212. assert x == 0
  213. def test_u8_truncate_from_i64() -> None:
  214. large = i64(2**32 + 256 + 157 + int())
  215. x = u8(large)
  216. assert x == 157
  217. small = i64(-2**32 - 256 - 157 + int())
  218. x = u8(small)
  219. assert x == 256 - 157
  220. large2 = i64(2**8 + int())
  221. x = u8(large2)
  222. assert x == 0
  223. small2 = i64(-2**8 - 1 - int())
  224. x = u8(small2)
  225. assert x == 255
  226. def test_u8_truncate_from_i32() -> None:
  227. large = i32(2**16 + 2**8 + 5 + int())
  228. assert u8(large) == 5
  229. small = i32(-2**16 - 2**8 - 1 + int())
  230. assert u8(small) == 255
  231. def from_float(x: float) -> u8:
  232. return u8(x)
  233. def test_explicit_conversion_from_float() -> None:
  234. assert from_float(0.0) == 0
  235. assert from_float(1.456) == 1
  236. assert from_float(234.567) == 234
  237. assert from_float(255) == 255
  238. assert from_float(0) == 0
  239. assert from_float(-0.999) == 0
  240. # The error message could be better, but this is acceptable
  241. with assertRaises(OverflowError, "int too large or small to convert to u8"):
  242. assert from_float(float(256))
  243. with assertRaises(OverflowError, "int too large or small to convert to u8"):
  244. # One ulp below the lowest valid i64 value
  245. from_float(float(-1.0))
  246. def test_tuple_u8() -> None:
  247. a: u8 = 1
  248. b: u8 = 2
  249. t = (a, b)
  250. a, b = t
  251. assert a == 1
  252. assert b == 2
  253. x: Any = t
  254. tt: Tuple[u8, u8] = x
  255. assert tt == (1, 2)
  256. def test_convert_u8_to_native_int() -> None:
  257. for i in range(256):
  258. x: u8 = i
  259. assert i16(x) == i
  260. assert i32(x) == i
  261. assert i64(x) == i