| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- [case testI16BasicOps]
- from typing import Any, Tuple
- from mypy_extensions import i16, i32, i64
- from testutil import assertRaises
- def test_box_and_unbox() -> None:
- values = (list(range(-2**15, -2**15 + 100)) +
- list(range(-1000, 1000)) +
- list(range(2**15 - 100, 2**15)))
- for i in values:
- o: Any = i
- x: i16 = o
- o2: Any = x
- assert o == o2
- assert x == i
- with assertRaises(OverflowError, "int too large to convert to i16"):
- o = 2**15
- x2: i16 = o
- with assertRaises(OverflowError, "int too large to convert to i16"):
- o = -2**15 - 1
- x3: i16 = o
- def div_by_7(x: i16) -> i16:
- return x // 7
- def div_by_neg_7(x: i16) -> i16:
- return x // -7
- def div(x: i16, y: i16) -> i16:
- return x // y
- def test_divide_by_constant() -> None:
- for i in range(-1000, 1000):
- assert div_by_7(i) == i // 7
- for i in range(-2**15, -2**15 + 1000):
- assert div_by_7(i) == i // 7
- for i in range(2**15 - 1000, 2**15):
- assert div_by_7(i) == i // 7
- def test_divide_by_negative_constant() -> None:
- for i in range(-1000, 1000):
- assert div_by_neg_7(i) == i // -7
- for i in range(-2**15, -2**15 + 1000):
- assert div_by_neg_7(i) == i // -7
- for i in range(2**15 - 1000, 2**15):
- assert div_by_neg_7(i) == i // -7
- def test_divide_by_variable() -> None:
- values = (list(range(-50, 50)) +
- list(range(-2**15, -2**15 + 10)) +
- list(range(2**15 - 10, 2**15)))
- for x in values:
- for y in values:
- if y != 0:
- if x // y == 2**15:
- with assertRaises(OverflowError, "integer division overflow"):
- div(x, y)
- else:
- assert div(x, y) == x // y
- else:
- with assertRaises(ZeroDivisionError, "integer division or modulo by zero"):
- div(x, y)
- def mod_by_7(x: i16) -> i16:
- return x % 7
- def mod_by_neg_7(x: i16) -> i16:
- return x // -7
- def mod(x: i16, y: i16) -> i16:
- return x % y
- def test_mod_by_constant() -> None:
- for i in range(-1000, 1000):
- assert mod_by_7(i) == i % 7
- for i in range(-2**15, -2**15 + 1000):
- assert mod_by_7(i) == i % 7
- for i in range(2**15 - 1000, 2**15):
- assert mod_by_7(i) == i % 7
- def test_mod_by_negative_constant() -> None:
- for i in range(-1000, 1000):
- assert mod_by_neg_7(i) == i // -7
- for i in range(-2**15, -2**15 + 1000):
- assert mod_by_neg_7(i) == i // -7
- for i in range(2**15 - 1000, 2**15):
- assert mod_by_neg_7(i) == i // -7
- def test_mod_by_variable() -> None:
- values = (list(range(-50, 50)) +
- list(range(-2**15, -2**15 + 10)) +
- list(range(2**15 - 10, 2**15)))
- for x in values:
- for y in values:
- 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: i16 = int()
- one: i16 = zero + 1
- two: i16 = one + 1
- neg_one: i16 = -one
- assert one + one == 2
- assert one + two == 3
- assert one + neg_one == 0
- assert one - one == 0
- assert one - two == -1
- assert one * one == 1
- assert one * two == 2
- assert two * two == 4
- assert two * neg_one == -2
- assert neg_one * one == -1
- assert neg_one * neg_one == 1
- assert two * 0 == 0
- assert 0 * two == 0
- assert -one == -1
- assert -two == -2
- assert -neg_one == 1
- assert -zero == 0
- def test_bitwise_ops() -> None:
- x: i16 = 13855 + int()
- y: i16 = 367 + int()
- z: i16 = -11091 + int()
- zero: i16 = int()
- one: i16 = zero + 1
- two: i16 = zero + 2
- neg_one: i16 = -one
- assert x & y == 15
- assert x & z == 5133
- assert z & z == z
- assert x & zero == 0
- assert x | y == 14207
- assert x | z == -2369
- assert z | z == z
- assert x | 0 == x
- assert x ^ y == 14192
- assert x ^ z == -7502
- assert z ^ z == 0
- assert z ^ 0 == z
- assert x << one == 27710
- assert x << two == -10116
- assert z << two == 21172
- assert z << 0 == z
- assert x >> one == 6927
- assert x >> two == 3463
- assert z >> two == -2773
- assert z >> 0 == z
- assert ~x == -13856
- assert ~z == 11090
- assert ~zero == -1
- assert ~neg_one == 0
- def eq(x: i16, y: i16) -> bool:
- return x == y
- def test_eq() -> None:
- assert eq(int(), int())
- assert eq(5 + int(), 5 + int())
- assert eq(-5 + int(), -5 + int())
- assert not eq(int(), 1 + int())
- assert not eq(5 + int(), 6 + int())
- assert not eq(-5 + int(), -6 + int())
- assert not eq(-5 + int(), 5 + int())
- def test_comparisons() -> None:
- one: i16 = 1 + int()
- one2: i16 = 1 + int()
- two: i16 = 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:
- i16_3: i16 = int() + 3
- int_5 = int() + 5
- assert i16_3 < int_5
- assert int_5 > i16_3
- b = i16_3 > int_5
- assert not b
- int_largest = int() + (1 << 15) - 1
- assert int_largest > i16_3
- int_smallest = int() - (1 << 15)
- assert i16_3 > int_smallest
- int_too_big = int() + (1 << 15)
- int_too_small = int() - (1 << 15) - 1
- with assertRaises(OverflowError):
- assert i16_3 < int_too_big
- with assertRaises(OverflowError):
- assert int_too_big < i16_3
- with assertRaises(OverflowError):
- assert i16_3 > int_too_small
- with assertRaises(OverflowError):
- assert int_too_small < i16_3
- def test_mixed_arithmetic_and_bitwise_ops() -> None:
- i16_3: i16 = int() + 3
- int_5 = int() + 5
- assert i16_3 + int_5 == 8
- assert int_5 - i16_3 == 2
- assert i16_3 << int_5 == 96
- assert int_5 << i16_3 == 40
- assert i16_3 ^ int_5 == 6
- assert int_5 | i16_3 == 7
- int_largest = int() + (1 << 15) - 1
- assert int_largest - i16_3 == 32764
- int_smallest = int() - (1 << 15)
- assert int_smallest + i16_3 == -32765
- int_too_big = int() + (1 << 15)
- int_too_small = int() - (1 << 15) - 1
- with assertRaises(OverflowError):
- assert i16_3 & int_too_big
- with assertRaises(OverflowError):
- assert int_too_small & i16_3
- def test_coerce_to_and_from_int() -> None:
- for shift in range(0, 16):
- for sign in 1, -1:
- for delta in range(-5, 5):
- n = sign * (1 << shift) + delta
- if -(1 << 15) <= n < (1 << 15):
- x: i16 = n
- m: int = x
- assert m == n
- def test_explicit_conversion_to_i16() -> None:
- x = i16(5)
- assert x == 5
- y = int() - 113
- x = i16(y)
- assert x == -113
- n64: i64 = 1733
- x = i16(n64)
- assert x == 1733
- n32: i32 = -1733
- x = i16(n32)
- assert x == -1733
- z = i16(x)
- assert z == -1733
- def test_explicit_conversion_overflow() -> None:
- max_i16 = int() + 2**15 - 1
- x = i16(max_i16)
- assert x == 2**15 - 1
- assert int(x) == max_i16
- min_i16 = int() - 2**15
- y = i16(min_i16)
- assert y == -2**15
- assert int(y) == min_i16
- too_big = int() + 2**15
- with assertRaises(OverflowError):
- x = i16(too_big)
- too_small = int() - 2**15 - 1
- with assertRaises(OverflowError):
- x = i16(too_small)
- def test_i16_from_large_small_literal() -> None:
- x = i16(2**15 - 1)
- assert x == 2**15 - 1
- x = i16(-2**15)
- assert x == -2**15
- def test_i16_truncate_from_i64() -> None:
- large = i64(2**32 + 65536 + 157 + int())
- x = i16(large)
- assert x == 157
- small = i64(-2**32 - 65536 - 157 + int())
- x = i16(small)
- assert x == -157
- large2 = i64(2**15 + int())
- x = i16(large2)
- assert x == -2**15
- small2 = i64(-2**15 - 1 - int())
- x = i16(small2)
- assert x == 2**15 - 1
- def test_i16_truncate_from_i32() -> None:
- large = i32(2**16 + 2**30 + 5 + int())
- assert i16(large) == 5
- small = i32(-2**16 - 2**30 - 1 + int())
- assert i16(small) == -1
- def from_float(x: float) -> i16:
- return i16(x)
- def test_explicit_conversion_from_float() -> None:
- assert from_float(0.0) == 0
- assert from_float(1.456) == 1
- assert from_float(-1234.567) == -1234
- assert from_float(2**15 - 1) == 2**15 - 1
- assert from_float(-2**15) == -2**15
- # The error message could be better, but this is acceptable
- with assertRaises(OverflowError, "int too large to convert to i16"):
- assert from_float(float(2**15))
- with assertRaises(OverflowError, "int too large to convert to i16"):
- # One ulp below the lowest valid i64 value
- from_float(float(-2**15 - 1))
- def test_tuple_i16() -> None:
- a: i16 = 1
- b: i16 = 2
- t = (a, b)
- a, b = t
- assert a == 1
- assert b == 2
- x: Any = t
- tt: Tuple[i16, i16] = x
- assert tt == (1, 2)
|