blob: a8ed7b87c426c0b077356ee1ee8c4313e5445a82 [file] [log] [blame] [edit]
[case testLibrtVecsNestedInterpreted_librt_experimental]
# Test cases for nested vecs, using generic operations (simulates use from interpreted code).
import sys
from typing import Any
import typing
import librt.vecs
import mypy_extensions
from testutil import assertRaises, is_gil_disabled, is_64_bit_platform
vec: Any = librt.vecs.vec
append: Any = librt.vecs.append
remove: Any = librt.vecs.remove
pop: Any = librt.vecs.pop
getsizeof: Any = getattr(sys, "getsizeof")
i64: Any = mypy_extensions.i64
# Work around test stub limitations
Optional: Any = getattr(getattr(sys, "modules")["typing"], "Optional")
def test_vec_indexing() -> None:
assert type(vec[vec[str]]) is type(vec[str])
assert type(vec[vec[Optional[str]]]) is type(vec[str])
assert type(vec[vec[i64]]) is type(vec[str])
assert type(vec[vec[vec[vec[vec[vec[str]]]]]]) is type(vec[str])
with assertRaises(TypeError):
vec[Optional[vec[str]]]
with assertRaises(TypeError):
vec[Optional[vec[Optional[str]]]]
def test_type_str() -> None:
assert str(vec[Optional[str]]) == "<class_proxy 'vec[str | None]'>"
assert str(vec[vec[str]]) == "<class_proxy 'vec[vec[str]]'>"
assert str(vec[vec[i64]]) == "<class_proxy 'vec[vec[i64]]'>"
assert str(vec[vec[vec[vec[vec[str]]]]]) == "<class_proxy 'vec[vec[vec[vec[vec[str]]]]]'>"
assert str(
vec[vec[vec[Optional[str]]]]) == "<class_proxy 'vec[vec[vec[str | None]]]'>"
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'])])
assert len(v) == 1
assert v[0][0] == 'xyz'
with assertRaises(TypeError):
vec[str](1)
with assertRaises(TypeError):
vec[str]([1])
with assertRaises(TypeError):
vec[str]([vec[bytes]()])
def test_isinstance() -> None:
assert isinstance(vec[vec[str]](), vec)
assert isinstance(vec[vec[Optional[str]]](), vec)
def test_repr() -> None:
assert str(vec[vec[str]]()) == "vec[vec[str]]([])"
assert str(vec[vec[Optional[str]]]()) == "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 = append(v, vec[Optional[str]](['x', None]))
assert str(v) == "vec[vec[str | None]]([[], ['x', None]])"
def test_size() -> None:
# Only test on 64-bit, non-free-threading builds
if not is_gil_disabled() and is_64_bit_platform():
v = vec[vec[str]]()
assert getsizeof(v) == 48
v = append(v, vec[str]())
assert getsizeof(v) == 48
def test_get_item() -> None:
v = append(vec[vec[str]](), append(vec[str](), 'x'))
assert repr(v[0]) == "vec[str](['x'])"
v = append(v, append(vec[str](), 'y'))
assert repr(v[0]) == "vec[str](['x'])"
assert repr(v[1]) == "vec[str](['y'])"
vv = append(vec[vec[Optional[str]]](), vec[Optional[str]]())
assert vv[0] == vec[Optional[str]]()
def test_get_item_error() -> None:
v = append(vec[vec[str]](), vec[str](['1']))
v = append(v, vec[str](['2']))
v = append(v, vec[str](['3']))
with assertRaises(IndexError):
v[3]
with assertRaises(IndexError):
v[4]
n = 2 ** 100
with assertRaises(IndexError):
v[n]
def test_get_item_negative() -> None:
v = vec[vec[str]]([vec[str](['2']), vec[str](['5']), vec[str](['7'])])
assert v[-1] == vec[str](['7'])
assert v[-2] == vec[str](['5'])
assert v[-3] == vec[str](['2'])
with assertRaises(IndexError):
v[-4]
with assertRaises(IndexError):
v[-2**62]
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() -> None:
v = vec[vec[str]]()
v = append(v, vec[str](['1']))
v = append(v, vec[str](['2']))
v[0] = vec[str](['3'])
assert v[0] == vec[str](['3'])
assert v[1] == vec[str](['2'])
v[1] = vec[str](['5'])
assert v[0] == vec[str](['3'])
assert v[1] == vec[str](['5'])
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(TypeError):
v[0] = 'x'
with assertRaises(TypeError):
v[0] = vec[vec[str]]()
with assertRaises(TypeError):
v[0] = vec[Optional[str]]()
assert repr(v[0]) == 'vec[str]([])'
def test_set_item_negative() -> None:
v = vec[vec[str]]()
v = append(v, vec[str](['1']))
v = append(v, vec[str](['2']))
v[-2] = vec[str](['3'])
assert v[0] == vec[str](['3'])
assert v[1] == vec[str](['2'])
v[-1] = vec[str](['5'])
assert v[0] == vec[str](['3'])
assert v[1] == vec[str](['5'])
with assertRaises(IndexError):
v[-3] = vec[str](['5'])
def test_equality() -> None:
assert_eq(vec[vec[str]](), vec[vec[str]]())
assert_eq(vec[vec[str]]([vec[str](['x'])]), vec[vec[str]]([vec[str](['x'])]))
assert_neq(vec[vec[str]]([vec[str](['x'])]), vec[vec[str]]())
assert_neq(vec[vec[str]]([vec[str](['x'])]), vec[vec[str]]([vec[str](['y'])]))
def test_equality_different_types() -> None:
assert_neq(vec[vec[str]](), vec[str]())
assert_neq(vec[vec[str]](), vec[vec[vec[str]]]())
assert_neq(vec[vec[Optional[str]]](), vec[vec[str]]())
def assert_eq(x: object, y: object) -> None:
assert x == y
assert y == x
b = x != y
assert not b
b = y != x
assert not b
def assert_neq(x: object, y: object) -> None:
assert x != y
assert y != x
b = x == y
assert not b
b = y == x
assert not b
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[Optional[str]](['x', None, 'y'])
assert v[1:] == vec[Optional[str]]([None, 'y'])
vv = vec[vec[str]]([vec[str](['x']), vec[str](['y'])])
assert vv[1:] == vec[vec[str]]([vec[str](['y'])])
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](['5']), vec[str](['9'])])
v, item = pop(v)
assert item == vec[str](['9'])
assert v == vec[vec[str]]([vec[str](['4']), vec[str](['5'])])
v, item = pop(v)
assert item == vec[str](['5'])
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]]()