blob: 153428148518e187c199d2b1b5da35136a6f7dd9 [file] [log] [blame] [edit]
-- Test cases for vec[t] where t is a boxed, non-vec type (PyObject *).
-- Also tests for vec[t | None], which uses the same representation.
[case testVecTBasicOps_librt_experimental]
from typing import Final, Any, Iterable, Optional, Tuple
from mypy_extensions import i64
from librt.vecs import vec, append, remove, pop
from testutil import assertRaises
def test_create_empty() -> None:
v = vec[str]()
assert len(v) == 0
v2 = vec[Optional[str]]()
assert len(v2) == 0
def test_create_from_list_and_get_item() -> None:
v = vec[str]([])
assert len(v) == 0
v = vec[str](["xyz", "0" + str(), str(), "foo"])
assert len(v) == 4
assert v[0] == "xyz"
assert v[1] == "0"
assert v[2] == ""
assert v[3] == "foo"
v = vec[str](["1", "2", "3", "4", "5", "6", "7", "8", "9"])
assert len(v) == 9
for i in range(i64(9)):
assert v[i] == str(i + 1)
def test_create_optional_and_get_item() -> None:
v = vec[Optional[str]](["xyz", None])
assert len(v) == 2
assert v[0] == "xyz"
assert v[1] is None
def test_append() -> None:
v = vec[str]()
v = append(v, str() + "3")
assert len(v) == 1
x = "xyz" + str()
v = append(v, x)
assert len(v) == 2
assert v[0] == "3"
assert v[1] == "xyz"
v = vec[str]()
for i in range(1024):
v = append(v, str(i * 3))
assert len(v) == 1024
for i in range(1024):
assert v[i] == str(i * 3)
def test_get_item() -> None:
v = vec[str](["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_set_item() -> None:
v = vec[str](["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()] = "xyz"
assert v[1] == "xyz"
with assertRaises(IndexError):
v[1 + x] = "6"
with assertRaises(IndexError):
v[2 + int()] = "6"
def test_set_item_optional() -> None:
v = vec[Optional[str]](["3", None])
v[1] = str() + "a"
assert v[1] == "a"
v[0] = None
assert v[0] is None
def test_box_and_unbox() -> None:
v = vec[str](["3", "5"])
o: Any = v
assert len(o) == 2
assert o[0] == "3"
assert o[1] == "5"
o[1] = "6"
v2: vec[str] = o
assert len(v2) == 2
assert v2[0] == "3"
assert v2[1] == "6"
o2: Any = None
with assertRaises(TypeError, "vec[str] object expected; got None"):
v2 = o2
o3: Any = vec[bytes]([])
with assertRaises(TypeError, "vec[str] object expected; got vec"):
v2 = o3
def test_box_and_unbox_optional() -> None:
v = vec[Optional[str]](["3", "4"])
o: Any = v
o[0] = None
v = o
assert v == vec[Optional[str]]([None, "4"])
v2 = vec[str](["4"])
o2: Any = v2
o2[0] = "5"
v2 = o2
assert v2 == vec[str](["5"])
o3: Any = vec[str]()
with assertRaises(TypeError, "vec[str | None] object expected; got vec"):
v = o3
o4: Any = vec[Optional[str]](["3"])
with assertRaises(TypeError, "vec[str] object expected; got vec"):
v2 = o4
def test_construct_from_list_multiply() -> None:
for i in range(50):
v = vec[str]([str(i + 1)] * i)
assert len(v) == i
for j in range(i):
assert v[j] == str(i + 1)
for i in range(50):
v = vec[str](i * [str(i - 1)])
assert len(v) == i
for j in range(i):
assert v[j] == str(i - 1)
def test_construct_from_list_comprehension() -> None:
for i in range(50):
l = [i * i for i in range(i)]
v = vec[str]([str(n + 5) for n in l])
assert len(v) == i
for j in range(i):
assert v[j] == str(j * j + 5)
def test_construct_from_iterable() -> None:
for i in range(50):
it: Iterable[str] = iter([str(i * i) for i in range(i)])
v = vec[str](it)
assert len(v) == i
for j in range(i):
assert v[j] == str(j * j)
def test_equality() -> None:
v0 = vec[str]()
v0b = vec[str]()
v1 = vec[str](["1"])
v1b = vec[str](["3"])
assert v0 == v0
assert v1 == v1
assert v0 == v0b
assert v0 != v1
assert v1 != v1b
assert v1 != v0
def test_equality_optional() -> None:
v = vec[str]()
vo = vec[Optional[str]]()
assert v != vo
assert vo == vo
vo2 = vec[Optional[str]](["x", None])
assert vo2 == vec[Optional[str]](["x", None])
assert vo2 != vec[Optional[str]](["x", "y"])
assert vo2 != vec[Optional[str]]([None, None])
assert vo2 != vec[Optional[str]](["x", None, None])
def test_str_conversion() -> None:
v = vec[str]()
assert str(v) == "vec[str]([])"
assert repr(v) == "vec[str]([])"
v = vec[str](["126"])
assert str(v) == "vec[str](['126'])"
v = append(v, "5")
assert str(v) == "vec[str](['126', '5'])"
v = append(v, "xyz")
assert str(v) == "vec[str](['126', '5', 'xyz'])"
v2 = vec[Optional[str]]()
assert str(v2) == "vec[str | None]([])"
v2 = vec[Optional[str]](["x", None])
assert str(v2) == "vec[str | None](['x', None])"
def test_for_loop() -> None:
for n in vec[str]():
assert False
a = []
for n in vec[str](["5"]):
a.append(n)
assert a == ["5"]
v = vec[str](["xyz", "9", "8"])
a = []
for n in v:
a.append(n)
assert a == ["xyz", "9", "8"]
assert len(v) == 3
def test_contains() -> None:
v = vec[str]()
x = str()
assert x not in v
v = vec[str](["x"])
assert x + "x" in v
assert x not in v
v2 = vec[str](["xyz", "7", "9"])
assert x + "xyz" in v2
assert x + "7" in v2
assert x + "9" in v2
assert x not in v2
assert x + "x" not in v2
def test_slicing() -> None:
v = vec[str]()
assert v[:] == vec[str]([])
assert v[1:] == vec[str]([])
assert v[:-5] == vec[str]([])
v = vec[str](["0", "1", "2", "3", "4"])
assert v[1:4] == vec[str](["1", "2", "3"])
assert v[2:-1] == vec[str](["2", "3"])
assert v[-2:-1] == vec[str](["3"])
assert v[1:] == vec[str](["1", "2", "3", "4"])
assert v[:-1] == vec[str](["0", "1", "2", "3"])
assert v[:] == v
assert v[:] is not v
assert v[5:] == vec[str]()
assert v[100:] == vec[str]()
assert v[0:5] ==v
assert v[0:5] is not v
assert v[2:100] == vec[str](["2", "3", "4"])
assert v[-100:2] == vec[str](["0", "1"])
assert v[5:100] == vec[str]([])
assert v[50:100] == vec[str]([])
assert v[-100:-50] == vec[str]([])
def test_slicing_with_step() -> None:
v = vec[str](["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"])
assert v[1:5:2] == vec[str](["1", "3"])
assert v[1:6:2] == vec[str](["1", "3", "5"])
assert v[5:1:-2] == vec[str](["5", "3"])
assert v[6:1:-2] == vec[str](["6", "4", "2"])
v = vec[str](["0", "1", "2", "3", "4"])
assert v[::-1] == vec[str](["4", "3", "2", "1", "0"])
with assertRaises(ValueError):
v[1:3:0]
def test_remove() -> None:
a = ["4", "7", "xyz"]
for i in a:
v = vec[str](a)
v = remove(v, i)
assert v == vec[str]([j for j in a if j != i])
v = vec[str](a)
v = remove(v, "4")
v = remove(v, "7")
v = remove(v, "xyz")
assert v == vec[str]()
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[str](["1", "1", "1"])
v = remove(v, "1")
assert v == vec[str](["1", "1"])
v = remove(v, "1")
assert v == vec[str](["1"])
v = remove(v, "1")
assert v == vec[str]()
f: Any = 1.1
with assertRaises(TypeError):
remove(v, f)
s: Any = None
with assertRaises(TypeError):
remove(v, s)
def test_pop_last() -> None:
v = vec[str](["4", "7", "xyz"])
v, n = pop(v)
assert n == "xyz"
assert v == vec[str](["4", "7"])
v, n = pop(v)
assert n == "7"
assert v == vec[str](["4"])
v, n = pop(v)
assert n == "4"
assert v == vec[str]()
with assertRaises(IndexError):
pop(v)
def test_pop_index() -> None:
v = vec[str](["4", "7", "9", "15", "22"])
v, n = pop(v, 0)
assert n == "4"
assert v == vec[str](["7", "9", "15", "22"])
v, n = pop(v, -1)
assert n == "22"
assert v == vec[str](["7", "9", "15"])
v, n = pop(v, 1)
assert n == "9"
assert v == vec[str](["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[str](["15"])
v, n = pop(v, 0)
assert n == "15"
assert v == vec[str]()
def test_pop_optional() -> None:
v = vec[Optional[str]](["x" + str(), None])
v, s = pop(v)
assert s is None
v, s = pop(v)
assert s == "x"
assert len(v) == 0
v = vec[Optional[str]](["x" + str(), None])
v, s = pop(v, 0)
assert s == "x"
v, s = pop(v, -1)
assert s is None
def f(x: vec[str]) -> None:
pass
def test_wrapper_arg_check() -> None:
f_any: Any = f
with assertRaises(TypeError):
f_any([])
v: Final = vec[str](["x", "y"])
def test_final() -> None:
assert v == vec[str](["x", "y"])
def fdefault(v: vec[str] = vec[str](["x"])) -> vec[str]:
return v
def test_default_arg() -> None:
assert fdefault() == vec[str](["x"])
assert fdefault(vec[str](["y"])) == vec[str](["y"])
f_any: Any = fdefault
assert f_any() == vec[str](["x"])
assert f_any(vec[str](["y"])) == vec[str](["y"])
def ftuple(b: bool) -> Tuple[vec[str], vec[str]]:
if b:
raise RuntimeError()
return vec[str](["x"]), vec[str]()
def test_tuple() -> None:
t = ftuple(False)
assert len(t) == 2
assert t[0] == vec[str](["x"])
assert t[1] == vec[str]()
a, b = t
assert a == t[0]
assert b == t[1]
with assertRaises(RuntimeError):
ftuple(True)
f_any: Any = ftuple
t2 = f_any(False)
assert t == t2
with assertRaises(RuntimeError):
f_any(True)
def test_optional_item_new_syntax() -> None:
v = vec[str | None]()
assert len(v) == 0
assert str(v) == "vec[str | None]([])"
v = append(v, 'x')
v = append(v, None)
assert str(v) == "vec[str | None](['x', None])"
class Foo:
def __init__(self, s: str) -> None:
self.s = s
def len_union(x: vec[str] | vec[Optional[Foo]]) -> int:
return len(x)
def test_union_of_vecs() -> None:
assert len_union(vec[str]()) == 0
assert len_union(vec[str](["x", "y"])) == 2
assert len_union(vec[Optional[Foo]]([Foo("x"), None, Foo("y")])) == 3
with assertRaises(TypeError):
a1: Any = vec[Optional[str]]()
len_union(a1)
with assertRaises(TypeError):
a2: Any = []
len_union(a2)
with assertRaises(TypeError):
a3: Any = vec[bytes]()
len_union(a3)
with assertRaises(TypeError):
a4: Any = vec[Foo]()
len_union(a4)