| [case testU8BasicOps] |
| from typing import Any, Tuple |
| |
| from mypy_extensions import u8, i16, i32, i64 |
| from typing_extensions import Final |
| |
| from testutil import assertRaises |
| |
| ERROR: Final = 239 |
| |
| def test_box_and_unbox() -> None: |
| for i in range(0, 256): |
| o: Any = i |
| x: u8 = o |
| o2: Any = x |
| assert o == o2 |
| assert x == i |
| with assertRaises(OverflowError, "int too large or small to convert to u8"): |
| o = 256 |
| x2: u8 = o |
| with assertRaises(OverflowError, "int too large or small to convert to u8"): |
| o = -1 |
| x3: u8 = o |
| |
| def div_by_7(x: u8) -> u8: |
| return x // 7 |
| |
| def div(x: u8, y: u8) -> u8: |
| return x // y |
| |
| def test_divide_by_constant() -> None: |
| for i in range(0, 256): |
| assert div_by_7(i) == i // 7 |
| |
| def test_divide_by_variable() -> None: |
| for x in range(0, 256): |
| for y in range(0, 256): |
| if y != 0: |
| assert div(x, y) == x // y |
| else: |
| with assertRaises(ZeroDivisionError, "integer division or modulo by zero"): |
| div(x, y) |
| |
| def mod_by_7(x: u8) -> u8: |
| return x % 7 |
| |
| def mod(x: u8, y: u8) -> u8: |
| return x % y |
| |
| def test_mod_by_constant() -> None: |
| for i in range(0, 256): |
| assert mod_by_7(i) == i % 7 |
| |
| def test_mod_by_variable() -> None: |
| for x in range(0, 256): |
| for y in range(0, 256): |
| if y != 0: |
| assert mod(x, y) == x % y |
| else: |
| with assertRaises(ZeroDivisionError, "integer division or modulo by zero"): |
| mod(x, y) |
| |
| def test_simple_arithmetic_ops() -> None: |
| zero: u8 = int() |
| one: u8 = zero + 1 |
| two: u8 = one + 1 |
| neg_one: u8 = -one |
| assert neg_one == 255 |
| assert one + one == 2 |
| assert one + two == 3 |
| assert one + neg_one == 0 |
| assert one - one == 0 |
| assert one - two == 255 |
| assert one * one == 1 |
| assert one * two == 2 |
| assert two * two == 4 |
| assert two * neg_one == 254 |
| assert neg_one * one == 255 |
| assert neg_one * neg_one == 1 |
| assert two * 0 == 0 |
| assert 0 * two == 0 |
| assert -one == 255 |
| assert -two == 254 |
| assert -neg_one == 1 |
| assert -zero == 0 |
| |
| def test_bitwise_ops() -> None: |
| x: u8 = 184 + int() |
| y: u8 = 79 + int() |
| z: u8 = 113 + int() |
| zero: u8 = int() |
| one: u8 = zero + 1 |
| two: u8 = zero + 2 |
| neg_one: u8 = -one |
| |
| assert x & y == 8 |
| assert x & z == 48 |
| assert z & z == z |
| assert x & zero == 0 |
| |
| assert x | y == 255 |
| assert x | z == 249 |
| assert z | z == z |
| assert x | 0 == x |
| |
| assert x ^ y == 247 |
| assert x ^ z == 201 |
| assert z ^ z == 0 |
| assert z ^ 0 == z |
| |
| assert x << one == 112 |
| assert x << two == 224 |
| assert z << two == 196 |
| assert z << 0 == z |
| |
| assert x >> one == 92 |
| assert x >> two == 46 |
| assert z >> two == 28 |
| assert z >> 0 == z |
| |
| for i in range(256): |
| t: u8 = i |
| assert ~t == (~(i + int()) & 0xff) |
| |
| def eq(x: u8, y: u8) -> bool: |
| return x == y |
| |
| def test_eq() -> None: |
| assert eq(int(), int()) |
| assert eq(5 + int(), 5 + int()) |
| assert not eq(int(), 1 + int()) |
| assert not eq(5 + int(), 6 + int()) |
| |
| def test_comparisons() -> None: |
| one: u8 = 1 + int() |
| one2: u8 = 1 + int() |
| two: u8 = 2 + int() |
| assert one < two |
| assert not (one < one2) |
| assert not (two < one) |
| assert two > one |
| assert not (one > one2) |
| assert not (one > two) |
| assert one <= two |
| assert one <= one2 |
| assert not (two <= one) |
| assert two >= one |
| assert one >= one2 |
| assert not (one >= two) |
| assert one == one2 |
| assert not (one == two) |
| assert one != two |
| assert not (one != one2) |
| |
| def test_mixed_comparisons() -> None: |
| u8_3: u8 = int() + 3 |
| int_5 = int() + 5 |
| assert u8_3 < int_5 |
| assert int_5 > u8_3 |
| b = u8_3 > int_5 |
| assert not b |
| |
| int_largest = int() + 255 |
| assert int_largest > u8_3 |
| int_smallest = int() |
| assert u8_3 > int_smallest |
| |
| int_too_big = int() + 256 |
| int_too_small = int() -1 |
| with assertRaises(OverflowError): |
| assert u8_3 < int_too_big |
| with assertRaises(OverflowError): |
| assert int_too_big < u8_3 |
| with assertRaises(OverflowError): |
| assert u8_3 > int_too_small |
| with assertRaises(OverflowError): |
| assert int_too_small < u8_3 |
| |
| def test_mixed_arithmetic_and_bitwise_ops() -> None: |
| u8_3: u8 = int() + 3 |
| int_5 = int() + 5 |
| assert u8_3 + int_5 == 8 |
| assert int_5 - u8_3 == 2 |
| assert u8_3 << int_5 == 96 |
| assert int_5 << u8_3 == 40 |
| assert u8_3 ^ int_5 == 6 |
| assert int_5 | u8_3 == 7 |
| |
| int_largest = int() + 255 |
| assert int_largest - u8_3 == 252 |
| int_smallest = int() |
| assert int_smallest + u8_3 == 3 |
| |
| int_too_big = int() + 256 |
| int_too_small = int() - 1 |
| with assertRaises(OverflowError): |
| assert u8_3 & int_too_big |
| with assertRaises(OverflowError): |
| assert int_too_small & u8_3 |
| |
| def test_coerce_to_and_from_int() -> None: |
| for n in range(0, 256): |
| x: u8 = n |
| m: int = x |
| assert m == n |
| |
| def test_explicit_conversion_to_u8() -> None: |
| x = u8(5) |
| assert x == 5 |
| y = int() + ERROR |
| x = u8(y) |
| assert x == ERROR |
| n64: i64 = 233 |
| x = u8(n64) |
| assert x == 233 |
| n32: i32 = 234 |
| x = u8(n32) |
| assert x == 234 |
| z = u8(x) |
| assert z == 234 |
| n16: i16 = 231 |
| x = u8(n16) |
| assert x == 231 |
| |
| def test_explicit_conversion_overflow() -> None: |
| max_u8 = int() + 255 |
| x = u8(max_u8) |
| assert x == 255 |
| assert int(x) == max_u8 |
| |
| min_u8 = int() |
| y = u8(min_u8) |
| assert y == 0 |
| assert int(y) == min_u8 |
| |
| too_big = int() + 256 |
| with assertRaises(OverflowError): |
| x = u8(too_big) |
| |
| too_small = int() - 1 |
| with assertRaises(OverflowError): |
| x = u8(too_small) |
| |
| def test_u8_from_large_small_literal() -> None: |
| x = u8(255) # XXX u8(2**15 - 1) |
| assert x == 255 |
| x = u8(0) |
| assert x == 0 |
| |
| def test_u8_truncate_from_i64() -> None: |
| large = i64(2**32 + 256 + 157 + int()) |
| x = u8(large) |
| assert x == 157 |
| small = i64(-2**32 - 256 - 157 + int()) |
| x = u8(small) |
| assert x == 256 - 157 |
| large2 = i64(2**8 + int()) |
| x = u8(large2) |
| assert x == 0 |
| small2 = i64(-2**8 - 1 - int()) |
| x = u8(small2) |
| assert x == 255 |
| |
| def test_u8_truncate_from_i32() -> None: |
| large = i32(2**16 + 2**8 + 5 + int()) |
| assert u8(large) == 5 |
| small = i32(-2**16 - 2**8 - 1 + int()) |
| assert u8(small) == 255 |
| |
| def from_float(x: float) -> u8: |
| return u8(x) |
| |
| def test_explicit_conversion_from_float() -> None: |
| assert from_float(0.0) == 0 |
| assert from_float(1.456) == 1 |
| assert from_float(234.567) == 234 |
| assert from_float(255) == 255 |
| assert from_float(0) == 0 |
| assert from_float(-0.999) == 0 |
| # The error message could be better, but this is acceptable |
| with assertRaises(OverflowError, "int too large or small to convert to u8"): |
| assert from_float(float(256)) |
| with assertRaises(OverflowError, "int too large or small to convert to u8"): |
| # One ulp below the lowest valid i64 value |
| from_float(float(-1.0)) |
| |
| def test_tuple_u8() -> None: |
| a: u8 = 1 |
| b: u8 = 2 |
| t = (a, b) |
| a, b = t |
| assert a == 1 |
| assert b == 2 |
| x: Any = t |
| tt: Tuple[u8, u8] = x |
| assert tt == (1, 2) |
| |
| def test_convert_u8_to_native_int() -> None: |
| for i in range(256): |
| x: u8 = i |
| assert i16(x) == i |
| assert i32(x) == i |
| assert i64(x) == i |