blob: 1c19bfb11e767306e223b877cd28244c71f6ece6 [file] [log] [blame] [edit]
-- Test cases for vec[i64]. These also partially cover other unboxed item types,
-- which use a similar runtime representation.
[case testVecI64BasicOps_librt_experimental]
from typing import Final, Any, Iterable, Tuple
from mypy_extensions import i64, i32
from librt.vecs import vec, append, remove, pop
from testutil import assertRaises
ERROR: Final = -113
def test_create_empty() -> None:
v = vec[i64]()
assert len(v) == 0
def test_create_from_list_and_get_item() -> None:
v = vec[i64]([])
assert len(v) == 0
v = vec[i64]([ERROR, 0, 255, int() + (2**63 - 1)])
assert len(v) == 4
assert v[0] == -113
assert v[1] == 0
assert v[2] == 255
assert v[3] == 2**63 - 1
v = vec[i64]([1, 2, 3, 4, 5, 6, 7, 8, 9])
assert len(v) == 9
for i in range(i64(9)):
assert v[i] == i + 1
def test_append() -> None:
v = vec[i64]()
v = append(v, int() + 3)
assert len(v) == 1
x: i64 = ERROR + int()
v = append(v, x)
assert len(v) == 2
assert v[0] == 3
assert v[1] == ERROR
v = vec[i64]()
for i in range(1024):
v = append(v, i * 3)
assert len(v) == 1024
for i in range(1024):
assert v[i] == i * 3
def test_get_item() -> None:
v = vec[i64]([3, 4])
x: i64 = int()
assert v[x] == 3
assert v[int()] == 3
x += 1
assert v[x] == 4
assert v[int() + 1] == 4
with assertRaises(IndexError):
v[x + 1]
with assertRaises(IndexError):
v[2]
with assertRaises(IndexError):
v[2**63 - 1]
def test_get_item_negative() -> None:
v = vec[i64]([3, 4])
x: i64 = int() - 1
assert v[x] == 4
assert v[int() - 2] == 3
x -= 1
assert v[x] == 3
assert v[int() - 1] == 4
with assertRaises(IndexError):
v[x - 1]
with assertRaises(IndexError):
v[-3]
with assertRaises(IndexError):
v[-2**63]
with assertRaises(IndexError):
v[int() - 3]
def test_set_item() -> None:
v = vec[i64]([3, 4])
v[0] = 0
assert v[0] == 0
x: i64 = int()
v[x] = 4
assert v[x] == 4
v[int()] = 5
assert v[int()] == 5
x += 1
v[x] = -5
assert v[x] == -5
v[1 + int()] = ERROR
assert v[1] == ERROR
with assertRaises(IndexError):
v[1 + x] = 6
with assertRaises(IndexError):
v[2 + int()] = 6
def test_set_item_negative() -> None:
v = vec[i64]([3, 4])
v[-1] = 0
assert v[-1] == 0
x: i64 = int() - 1
v[x] = 4
assert v[x] == 4
v[int() - 2] = 5
assert v[int() - 2] == 5
x -= 1
v[x] = -5
assert v[x] == -5
v[-1 + int()] = ERROR
assert v[-1] == ERROR
with assertRaises(IndexError):
v[x - 1] = 6
with assertRaises(IndexError):
v[int() - 3] = 6
def test_operator_assignment() -> None:
v = vec[i64]([3, 4])
x: i64 = int()
v[x] += 2
assert v[0] == 5
v[x + 1] -= 10
assert v[1] == -6
y = int()
v[y] += 6
assert v[y] == 11
v[y + 1] *= 2
assert v[1 + y] == -12
def test_box_and_unbox() -> None:
v = vec[i64]([3, 5])
o: Any = v
assert len(o) == 2
assert o[0] == 3
assert o[1] == 5
o[1] = 6
v2: vec[i64] = o
assert len(v2) == 2
assert v2[0] == 3
assert v2[1] == 6
o2: Any = "x"
with assertRaises(TypeError, "vec[i64] object expected; got str"):
v2 = o2
o3: Any = vec[str]([])
# TODO: Better message
with assertRaises(TypeError, "vec[i64] object expected; got vec"):
v2 = o3
def check_opt(x: vec[i64] | None, is_none: bool) -> None:
if is_none:
assert x is None
else:
# If statements ensure type narrowing doesn't leak between blocks
if int() + 1:
assert x is not None
assert len(x) == 1
assert x[0] == 5
if int() + 2:
assert isinstance(x, vec)
assert len(x) == 1
assert x[0] == 5
if isinstance(x, vec):
assert x[0] == 5
assert not is_none
else:
assert is_none
def test_vec_optional() -> None:
v = vec[i64]([5])
check_opt(None, True)
check_opt(v, False)
a1: Any = None
check_opt(a1, True)
a2: Any = v
check_opt(a2, False)
a3: Any = str
with assertRaises(TypeError):
check_opt(a3, False)
def check_union(x: vec[i64] | str, is_str: bool) -> None:
if is_str:
assert isinstance(x, str)
assert x == "ss"
else:
if int() + 1:
assert not isinstance(x, str)
assert len(x) == 1
assert x[0] == 5
if int() + 2:
assert isinstance(x, vec)
assert len(x) == 1
assert x[0] == 5
if isinstance(x, vec):
assert x[0] == 5
assert not is_str
else:
assert is_str
assert x == "ss"
def test_vec_union() -> None:
v = vec[i64]([5])
check_union("ss", True)
check_union(v, False)
a1: Any = "ss"
check_union(a1, True)
a2: Any = v
check_union(a2, False)
a3: Any = b"ss"
with assertRaises(TypeError):
check_union(a3, False)
a4: Any = vec[i32]()
with assertRaises(TypeError, 'union[vec[i64], str] object expected; got vec[i32]'):
check_union(a4, False)
def test_construct_from_list_multiply() -> None:
for i in range(50):
v = vec[i64]([i + 1] * i)
assert len(v) == i
for j in range(i):
assert v[j] == i + 1
for i in range(50):
v = vec[i64](i * [i - 1])
assert len(v) == i
for j in range(i):
assert v[j] == i - 1
def test_construct_from_list_comprehension() -> None:
for i in range(50):
l = [i * i for i in range(i)]
v = vec[i64]([n + 5 for n in l])
assert len(v) == i
for j in range(i):
assert v[j] == j * j + 5
def test_construct_from_range() -> None:
v = vec[i64](range(0))
assert v == vec[i64]()
v = vec[i64](range(5))
assert v == vec[i64]([0, 1, 2, 3, 4])
v = vec[i64](range(2, 5))
assert v == vec[i64]([2, 3, 4])
def test_construct_from_iterable() -> None:
for i in range(50):
it: Iterable[i64] = iter([i * i for i in range(i)])
v = vec[i64](it)
assert len(v) == i
for j in range(i):
assert v[j] == j * j
for i in range(50):
it2: Iterable[int] = iter([i * i for i in range(i)])
v = vec[i64](it2)
assert len(v) == i
for j in range(i):
assert v[j] == j * j
def test_equality() -> None:
v0 = vec[i64]()
v0b = vec[i64]()
v1 = vec[i64]([1])
v1b = vec[i64]([3])
assert v0 == v0
assert v1 == v1
assert v0 == v0b
assert v0 != v1
assert v1 != v1b
assert v1 != v0
def test_str_conversion() -> None:
v = vec[i64]()
assert str(v) == "vec[i64]([])"
assert repr(v) == "vec[i64]([])"
v = vec[i64]([126])
assert str(v) == "vec[i64]([126])"
v = append(v, -5)
assert str(v) == "vec[i64]([126, -5])"
v = append(v, ERROR)
assert str(v) == "vec[i64]([126, -5, -113])"
def test_for_loop() -> None:
for n in vec[i64]():
assert False
a = []
for n in vec[i64]([5]):
a.append(n)
assert a == [5]
v = vec[i64]([ERROR, 9, 8])
a = []
for n in v:
a.append(n)
assert a == [ERROR, 9, 8]
assert len(v) == 3
def test_contains() -> None:
v = vec[i64]()
x: i64 = int()
assert x not in v
v = vec[i64]([0])
assert x in v
assert x + 1 not in v
v2 = vec[i64]([ERROR, 7, 9])
assert x + ERROR in v2
assert x + 7 in v2
assert int() + 9 in v2
assert x not in v2
assert int() not in v2
def test_slicing() -> None:
v = vec[i64]()
assert v[:] == vec[i64]([])
assert v[1:] == vec[i64]([])
assert v[:-5] == vec[i64]([])
v = vec[i64]([0, 1, 2, 3, 4])
assert v[1:4] == vec[i64]([1, 2, 3])
assert v[2:-1] == vec[i64]([2, 3])
assert v[-2:-1] == vec[i64]([3])
assert v[1:] == vec[i64]([1, 2, 3, 4])
assert v[:-1] == vec[i64]([0, 1, 2, 3])
assert v[:] == v
assert v[:] is not v
assert v[5:] == vec[i64]()
assert v[100:] == vec[i64]()
assert v[0:5] ==v
assert v[0:5] is not v
assert v[2:100] == vec[i64]([2, 3, 4])
assert v[-100:2] == vec[i64]([0, 1])
assert v[5:100] == vec[i64]([])
assert v[50:100] == vec[i64]([])
assert v[-100:-50] == vec[i64]([])
def test_slicing_with_step() -> None:
v = vec[i64]([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
assert v[1:5:2] == vec[i64]([1, 3])
assert v[1:6:2] == vec[i64]([1, 3, 5])
assert v[5:1:-2] == vec[i64]([5, 3])
assert v[6:1:-2] == vec[i64]([6, 4, 2])
v = vec[i64]([0, 1, 2, 3, 4])
assert v[::-1] == vec[i64]([4, 3, 2, 1, 0])
with assertRaises(ValueError):
v[1:3:0]
def test_remove() -> None:
a = [4, 7, ERROR]
for i in a:
v = vec[i64](a)
v = remove(v, i)
assert v == vec[i64]([j for j in a if j != i])
v = vec[i64](a)
v = remove(v, 4)
v = remove(v, 7)
v = remove(v, ERROR)
assert v == vec[i64]()
with assertRaises(ValueError):
remove(v, 4)
v = append(v, 5)
with assertRaises(ValueError):
remove(v, 7)
v = remove(v, 5)
assert len(v) == 0
v = vec[i64]([1, 1, 1])
v = remove(v, 1)
assert v == vec[i64]([1, 1])
v = remove(v, 1)
assert v == vec[i64]([1])
v = remove(v, 1)
assert v == vec[i64]()
f: Any = 1.1
with assertRaises(TypeError):
remove(v, f)
s: Any = 'x'
with assertRaises(TypeError):
remove(v, s)
def test_pop_last() -> None:
v = vec[i64]([4, 7, ERROR])
v, n = pop(v)
assert n == ERROR
assert v == vec[i64]([4, 7])
v, n = pop(v)
assert n == 7
assert v == vec[i64]([4])
v, n = pop(v)
assert n == 4
assert v == vec[i64]()
with assertRaises(IndexError):
pop(v)
def test_pop_index() -> None:
v = vec[i64]([4, 7, 9, 15, 22])
v, n = pop(v, 0)
assert n == 4
assert v == vec[i64]([7, 9, 15, 22])
v, n = pop(v, -1)
assert n == 22
assert v == vec[i64]([7, 9, 15])
v, n = pop(v, 1)
assert n == 9
assert v == vec[i64]([7, 15])
with assertRaises(IndexError):
pop(v, 2)
with assertRaises(IndexError):
pop(v, -3)
v, n = pop(v, -2)
assert n == 7
assert v == vec[i64]([15])
v, n = pop(v, 0)
assert n == 15
assert v == vec[i64]()
def f(x: vec[i64]) -> None:
pass
def test_wrapper_arg_check() -> None:
f_any: Any = f
with assertRaises(TypeError):
f_any([])
v: Final = vec[i64]([5, 6])
def test_final() -> None:
assert v == vec[i64]([5, 6])
def fdefault(v: vec[i64] = vec[i64]([5])) -> vec[i64]:
return v
def test_default_arg() -> None:
assert fdefault() == vec[i64]([5])
assert fdefault(vec[i64]()) == vec[i64]()
f_any: Any = fdefault
assert f_any() == vec[i64]([5])
assert f_any(vec[i64]([6])) == vec[i64]([6])
def ftuple(b: bool) -> Tuple[vec[i64], vec[i64]]:
if b:
raise RuntimeError()
return vec[i64]([5]), vec[i64]()
def test_tuple() -> None:
t = ftuple(False)
assert len(t) == 2
assert t[0] == vec[i64]([5])
assert t[1] == vec[i64]()
a, b = t
assert a == t[0]
assert b == t[1]
with assertRaises(RuntimeError):
ftuple(True)