blob: a8c8032121e7f92facb223b965425f2dabb960dc [file] [log] [blame] [edit]
[case testVecNestedBasicOps_librt_experimental]
from typing import Final, Any, Iterable, Optional, Tuple
import sys
from mypy_extensions import i64, i32
from librt.vecs import vec, append, remove, pop
from testutil import assertRaises
def test_construct_empty_nested() -> None:
v = vec[vec[str]]()
assert len(v) == 0
v2 = vec[vec[vec[vec[vec[str]]]]]()
assert len(v2) == 0
v3 = vec[vec[i64]]()
assert len(v3) == 0
def test_construct_empty_nested_optional() -> None:
v = vec[vec[Optional[str]]]()
assert len(v) == 0
def test_construct_from_initializer_nested() -> None:
v = vec[vec[str]]([vec[str](['xyz', 'a'])])
assert len(v) == 1
assert len(v[0]) == 2
assert v[0][0] == 'xyz'
assert v[0][1] == 'a'
def test_repr() -> None:
assert str(vec[vec[str]]()) == "vec[vec[str]]([])"
assert str(vec[vec[Optional[str]]]()) == "vec[vec[str | None]]([])"
if sys.version_info[1] >= 10:
assert str(vec[vec[str | None]]()) == "vec[vec[str | None]]([])"
def test_append_nested() -> None:
v = vec[vec[str]]()
vv = append(vec[str](), '1')
v = append(v, vv)
assert str(v) == "vec[vec[str]]([['1']])"
for n in range(2, 10):
vv = append(vec[str](), str(n))
v = append(v, vv)
assert str(v) == (
"vec[vec[str]]([['1'], ['2'], ['3'], ['4'], ['5'], ['6'], ['7'], ['8'], ['9']])"
)
def test_append_i64() -> None:
v = vec[vec[i64]]()
vv = append(vec[i64](), 1)
v = append(v, vv)
assert str(v) == "vec[vec[i64]]([[1]])"
for n in range(2, 10):
vv = append(vec[i64](), n)
v = append(v, vv)
assert str(v) == (
"vec[vec[i64]]([[1], [2], [3], [4], [5], [6], [7], [8], [9]])"
)
def test_append_nested_optional() -> None:
v = vec[vec[Optional[str]]]()
v = append(v, vec[Optional[str]]())
v[0] = append(v[0], None)
v[0] = append(v[0], 'x')
assert str(v) == "vec[vec[str | None]]([[None, 'x']])"
def test_get_item() -> None:
v = append(vec[vec[str]](), append(vec[str](), 'x'))
vv = v[0]
assert vv == vec[str](['x'])
v = append(v, append(vec[str](), 'y'))
assert repr(v[0]) == "vec[str](['x'])"
assert repr(v[1]) == "vec[str](['y'])"
def test_get_item_error() -> None:
v = append(vec[vec[str]](), vec[str](['1']))
v = append(v, vec[str](['3']))
with assertRaises(IndexError):
v[2]
with assertRaises(IndexError):
v[-3]
def test_len() -> None:
v = vec[vec[str]]()
assert len(v) == 0
v = append(v, vec[str](['1']))
assert len(v) == 1
v = append(v, vec[str]())
assert len(v) == 2
for i in range(100):
v = append(v, vec[str](['i']))
assert len(v) == i + 3
def test_set_item_error_nested() -> None:
v = append(vec[vec[str]](), vec[str]())
v = append(v, vec[str]())
v = append(v, vec[str]())
with assertRaises(IndexError):
v[3] = vec[str]()
with assertRaises(IndexError):
v[-4] = vec[str]()
assert repr(v[0]) == 'vec[str]([])'
def test_equality() -> None:
assert vec[vec[str]]() == vec[vec[str]]()
assert vec[vec[str]]([vec[str](['x'])]) == vec[vec[str]]([vec[str](['x'])])
assert vec[vec[str]]([vec[str](['x'])]) != vec[vec[str]]()
assert vec[vec[str]]([vec[str](['x'])]) != vec[vec[str]]([vec[str](['y'])])
def test_equality_different_types() -> None:
a = vec[vec[str]]()
b = vec[str]()
assert a == a
assert b == b
assert b != a
assert a != b
c = vec[vec[vec[str]]]()
assert c != a
assert a != c
assert c == c
d = vec[vec[Optional[str]]]()
assert d != a
assert a != d
assert d == d
assert vec[vec[str]]() != vec[vec[bytes]]()
assert vec[vec[str]]() != vec[vec[i64]]()
def test_slicing() -> None:
v = vec[vec[str]](vec[str]([str(i)]) for i in range(5))
assert v[1:4] == vec[vec[str]]([v[1], v[2], v[3]])
assert v[2:-1] == vec[vec[str]]([v[2], v[3]])
assert v[-2:-1] == vec[vec[str]]([v[3]])
assert v[1:] == vec[vec[str]]([v[1], v[2], v[3], v[4]])
assert v[:-1] == vec[vec[str]]([v[0], v[1], v[2], v[3]])
assert v[:] == v
assert v[:] is not v
assert v[0:5] ==v
assert v[0:5] is not v
assert v[2:100] == vec[vec[str]]([v[2], v[3], v[4]])
assert v[-100:2] == vec[vec[str]]([v[0], v[1]])
assert v[5:100] == vec[vec[str]]([])
assert v[50:100] == vec[vec[str]]([])
assert v[-100:-50] == vec[vec[str]]([])
def test_slicing_with_step() -> None:
v = vec[vec[str]](vec[str]([str(i)]) for i in range(10))
assert v[1:5:2] == vec[vec[str]]([v[1], v[3]])
assert v[1:6:2] == vec[vec[str]]([v[1], v[3], v[5]])
assert v[5:1:-2] == vec[vec[str]]([v[5], v[3]])
assert v[6:1:-2] == vec[vec[str]]([v[6], v[4], v[2]])
v = vec[vec[str]](vec[str]([str(i)]) for i in range(5))
assert v[::-1] == vec[vec[str]]([v[4], v[3], v[2], v[1], v[0]])
with assertRaises(ValueError):
v[1:3:0]
def test_slicing_with_different_item_types() -> None:
v = vec[vec[i64]]([vec[i64]([11]), vec[i64]([22])])
assert v[1:] == vec[vec[i64]]([vec[i64]([22])])
def test_remove() -> None:
a = ['4x', '7x', '9x']
vv = [vec[str]([s]) for s in a]
for i, s in enumerate(a):
v = vec[vec[str]](vv)
v = remove(v, vv[i])
assert v == vec[vec[str]]([j for j in vv if j != vv[i]])
v = vec[vec[str]](vv)
# Make sure we have a different object identity
v = remove(v, vec[str]([a[i]]))
assert v == vec[vec[str]]([j for j in vv if j != vv[i]])
v = vec[vec[str]](vv)
v = remove(v, vv[0])
v = remove(v, vv[1])
v = remove(v, vv[2])
assert v == vec[vec[str]]()
with assertRaises(ValueError):
remove(v, vec[str](['4']))
v = append(v, vec[str](['5']))
with assertRaises(ValueError):
remove(v, vec[str](['7']))
v = remove(v, vec[str](['5']))
assert len(v) == 0
v = v0 = vec[vec[str]]([vec[str](['x']) for _ in range(3)])
v = remove(v, vec[str](['x']))
assert v == v0[1:]
v = remove(v, vec[str](['x']))
assert v == v0[2:]
v = remove(v, vec[str](['x']))
assert v == vec[vec[str]]()
vb: Any = vec[bytes]([b'x'])
with assertRaises(TypeError):
remove(v, vb)
def test_pop_last() -> None:
v = vec[vec[str]]([vec[str](['4']), vec[str](['6']), vec[str](['9'])])
v, item = pop(v)
assert item == vec[str](['9'])
assert v == vec[vec[str]]([vec[str](['4']), vec[str](['6'])])
v, item = pop(v)
assert item == vec[str](['6'])
assert v == vec[vec[str]]([vec[str](['4'])])
v, item = pop(v)
assert item == vec[str](['4'])
assert v == vec[vec[str]]()
with assertRaises(IndexError):
pop(v)
def test_pop_index() -> None:
v = vec[vec[str]](vec[str]([s]) for s in ['4', '7', '9', '15', '22'])
v, item = pop(v, 0)
assert item == vec[str](['4'])
assert v == vec[vec[str]](vec[str]([s]) for s in ['7', '9', '15', '22'])
v, item = pop(v, -1)
assert item == vec[str](['22'])
assert v == vec[vec[str]](vec[str]([s]) for s in ['7', '9', '15'])
v, item = pop(v, 1)
assert item == vec[str](['9'])
assert v == vec[vec[str]](vec[str]([s]) for s in ['7', '15'])
with assertRaises(IndexError):
pop(v, 2)
with assertRaises(IndexError):
pop(v, -3)
v, item = pop(v, -2)
assert item == vec[str](['7'])
assert v == vec[vec[str]]([vec[str](['15'])])
v, item = pop(v, 0)
assert item == vec[str](['15'])
assert v == vec[vec[str]]()
def test_doubly_nested_operations() -> None:
a = vec[vec[str]]([vec[str](["x"])])
b = vec[vec[str]]([vec[str]()])
v = vec[vec[vec[str]]]()
# append
v = append(v, a)
assert repr(v) == "vec[vec[vec[str]]]([[['x']]])"
v = append(v, b)
assert len(v) == 2
# get item
assert v[0] == a
assert v[1] == b
# set item
v[0] = b
assert v[0] == b
v[0] = a
with assertRaises(IndexError):
v[2 + int()]
with assertRaises(IndexError):
v[2 + int()] = a
# slicing
vv = v[:1]
assert len(vv) == 1
assert vv[0] == a
vv = v[1:]
assert len(vv) == 1
assert vv[0] == b
# remove
v = remove(v, a)
assert len(v) == 1
assert v[0] == b
v = remove(v, b)
assert len(v) == 0
# pop last
v = append(v, a)
v = append(v, b)
v, x = pop(v)
assert len(v) == 1
assert v[0] == a
assert x == b
v, x = pop(v)
assert len(v) == 0
assert x == a
with assertRaises(IndexError):
pop(v)
# pop index
v = append(v, a)
v = append(v, b)
v, x = pop(v, 0)
assert len(v) == 1
assert v[0] == b
assert x == a
# TODO: box/unbox
def test_vec_i64_nested_operations() -> None:
a = vec[i64]([11])
b = vec[i64]()
v = vec[vec[i64]]()
# append
v = append(v, a)
assert repr(v) == "vec[vec[i64]]([[11]])"
v = append(v, b)
assert len(v) == 2
# get item
assert v[0] == a
assert v[1] == b
# set item
v[0] = b
assert v[0] == b
v[0] = a
with assertRaises(IndexError):
v[2 + int()]
with assertRaises(IndexError):
v[2 + int()] = a
# slicing
vv = v[:1]
assert len(vv) == 1
assert vv[0] == a
vv = v[1:]
assert len(vv) == 1
assert vv[0] == b
# remove
v = remove(v, a)
assert len(v) == 1
assert v[0] == b
v = remove(v, b)
assert len(v) == 0
# pop last
v = append(v, a)
v = append(v, b)
v, x = pop(v)
assert len(v) == 1
assert v[0] == a
assert x == b
v, x = pop(v)
assert len(v) == 0
assert x == a
with assertRaises(IndexError):
pop(v)
# pop index
v = append(v, a)
v = append(v, b)
v, x = pop(v, 0)
assert len(v) == 1
assert v[0] == b
assert x == a
# TODO: box/unbox
def test_doubly_nested_vec_i64_operations() -> None:
a = vec[vec[i64]]([vec[i64]([11])])
b = vec[vec[i64]]([vec[i64]()])
v = vec[vec[vec[i64]]]()
# append
v = append(v, a)
assert repr(v) == "vec[vec[vec[i64]]]([[[11]]])"
v = append(v, b)
assert len(v) == 2
# get item
assert v[0] == a
assert v[1] == b
# set item
v[0] = b
assert v[0] == b
v[0] = a
with assertRaises(IndexError):
v[2 + int()]
with assertRaises(IndexError):
v[2 + int()] = a
# slicing
vv = v[:1]
assert len(vv) == 1
assert vv[0] == a
vv = v[1:]
assert len(vv) == 1
assert vv[0] == b
# remove
v = remove(v, a)
assert len(v) == 1
assert v[0] == b
v = remove(v, b)
assert len(v) == 0
# pop last
v = append(v, a)
v = append(v, b)
v, x = pop(v)
assert len(v) == 1
assert v[0] == a
assert x == b
v, x = pop(v)
assert len(v) == 0
assert x == a
with assertRaises(IndexError):
pop(v)
# pop index
v = append(v, a)
v = append(v, b)
v, x = pop(v, 0)
assert len(v) == 1
assert v[0] == b
assert x == a
# TODO: box/unbox
def f(x: vec[vec[str]]) -> None:
pass
def test_wrapper_arg_check() -> None:
f_any: Any = f
with assertRaises(TypeError):
f_any(vec[str]())
with assertRaises(TypeError):
f_any(None)
with assertRaises(TypeError):
f_any([])
v: Final = vec[vec[str]]([vec[str](["x"])])
def test_final() -> None:
assert v == vec[vec[str]]([vec[str](["x"])])
def fdefault(v: vec[vec[str]] = vec[vec[str]]()) -> vec[vec[str]]:
return v
def test_default_arg() -> None:
assert fdefault() == vec[vec[str]]()
v = vec[vec[str]]([vec[str](["x"])])
assert fdefault(v) == v
f_any: Any = fdefault
assert f_any() == vec[vec[str]]()
assert f_any(v) == v
def ftuple(b: bool) -> Tuple[vec[vec[str]], vec[vec[str]]]:
if b:
raise RuntimeError()
return vec[vec[str]]([vec[str]()]), vec[vec[str]]()
def test_tuple() -> None:
t = ftuple(False)
assert len(t) == 2
assert t[0] == vec[vec[str]]([vec[str]()])
assert t[1] == vec[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 len_union(x: vec[vec[i64]] | vec[vec[Optional[str]]]) -> int:
return len(x)
def test_union_of_nested_vecs() -> None:
assert len_union(vec[vec[i64]]()) == 0
assert len_union(vec[vec[i64]]([vec[i64]([1, 2])])) == 1
assert len_union(vec[vec[Optional[str]]]([vec[Optional[str]](["x", None])])) == 1
# Wrong inner item type (i32 instead of i64)
with assertRaises(TypeError):
a1: Any = vec[vec[i32]]()
len_union(a1)
# Wrong inner item type (str instead of str | None)
with assertRaises(TypeError):
a2: Any = vec[vec[str]]()
len_union(a2)
# Not a nested vec
with assertRaises(TypeError):
a3: Any = vec[i64]()
len_union(a3)
# Plain list
with assertRaises(TypeError):
a4: Any = []
len_union(a4)
# Too deeply nested
with assertRaises(TypeError):
a5: Any = vec[vec[vec[i64]]]()
len_union(a5)