blob: e5158d4a1a31682687990cbc851ebcbb20d541e9 [file] [edit]
[case testLibrtVecsMiscInterpreted_librt]
# Test cases for vec[<value primitive type>]. using generic operations.
# This simulates use from interpreted code.
#
# All specialized vec types share most of the implementation, so we don't try to
# duplicate all tests in run-vecs-i64-interp.test, which acts also as a more detailed
# test suite for specialized vec types.
import sys
from typing import Any
import typing
import librt.vecs
import mypy_extensions
from testutil import assertRaises
# Access via Any references to force generic operations
vec: Any = librt.vecs.vec
append: Any = librt.vecs.append
remove: Any = librt.vecs.remove
pop: Any = librt.vecs.pop
extend: Any = librt.vecs.extend
u8: Any = mypy_extensions.u8
i16: Any = mypy_extensions.i16
i32: Any = mypy_extensions.i32
i64: Any = mypy_extensions.i64
# Work around test stub limitations
Optional: Any = getattr(getattr(sys, "modules")["typing"], "Optional")
# TODO: Add some nested vec tests
ITEM_TYPES = [i64, u8, i16, i32, float, bool]
# Common tests for all item types
def test_bare_vec_cannot_be_constructed() -> None:
with assertRaises(TypeError):
vec()
with assertRaises(TypeError):
vec([])
def test_vec_indexing() -> None:
for t in ITEM_TYPES:
assert type(vec[t]) is type
t1 = vec[t]
t2 = vec[t]
assert type(vec[t1]) is type(vec[t2])
_ = [t1, t2] # Ensure t1 and t2 are live here
assert vec[t] is not vec
if t is not i64:
assert vec[t] is not vec[i64]
else:
assert vec[t] is not vec[i32]
with assertRaises(TypeError):
vec[Optional[t]] # Not supported
def test_type_str() -> None:
for t in ITEM_TYPES:
name = t.__name__
assert str(vec[t]) == f"<class 'vec[{name}]'>"
assert repr(vec[t]) == f"<class 'vec[{name}]'>"
def test_construct_empty() -> None:
for t in ITEM_TYPES:
v = vec[t]()
assert type(v) is vec[t]
assert len(v) == 0
def test_isinstance() -> None:
for t in ITEM_TYPES:
v = vec[t]()
assert isinstance(v, vec)
assert not isinstance(vec[t], vec)
assert not isinstance("x", vec)
assert not isinstance(vec, vec)
def test_basic_int_operations() -> None:
# All of the non-bool item types support int values 0 to 255
for t in ITEM_TYPES:
if t is bool:
continue
v = vec[t]([0, 4, 255])
assert len(v) == 3
assert v[0] == 0
assert v[1] == 4
assert v[2] == 255
assert v[-1] == 255
assert v[-2] == 4
assert v[-3] == 0
for bad_index in 3, -4, 1 << 100, -1 << 100:
with assertRaises(IndexError):
v[bad_index]
with assertRaises(TypeError):
v["0"]
with assertRaises(TypeError):
append(v, "0")
def test_construct_bool_from_list() -> None:
v = vec[bool]([True, False, True])
assert len(v) == 3
assert v[0] is True
assert v[1] is False
assert v[2] is True
def test_equality() -> None:
for t1 in ITEM_TYPES:
for t2 in ITEM_TYPES:
assert vec[t1]() != []
if t1 is t2:
assert vec[t1]() == vec[t2]()
else:
assert vec[t1]() != vec[t2]()
def test_repr() -> None:
for t in ITEM_TYPES:
name = t.__name__
assert repr(vec[t]()) == f"vec[{name}]([])"
# vec[float] tests
def test_float_construct_from_initializer() -> None:
v = vec[float]([123.5])
assert len(v) == 1
assert v[0] == 123.5
v = vec[float](x + 1 for x in [5, 7.5, -8.5, 10])
assert len(v) == 4
assert v[0] == 6
assert v[1] == 8.5
assert v[2] == -7.5
assert v[3] == 11
with assertRaises(TypeError):
vec[float](1)
with assertRaises(TypeError):
vec[float](['1'])
with assertRaises(TypeError):
vec[float]([None])
def test_float_append() -> None:
v = vec[float]()
v = append(v, 1.5)
assert str(v) == "vec[float]([1.5])"
v = append(v, -2)
assert str(v) == "vec[float]([1.5, -2.0])"
def test_float_get_item() -> None:
v = append(vec[float](), 44.5)
assert v[0] == 44.5
v = append(v, -56.5)
assert v[0] == 44.5
assert v[1] == -56.5
def test_float_remove() -> None:
a = [4.5, 7, 9]
for x in a:
v = vec[float](a)
v = remove(v, x)
assert v == vec[float]([y for y in a if y != x])
def test_float_pop() -> None:
v = vec[float]([4.5, 7, 9.5])
v, n = pop(v)
assert n == 9.5
assert v == vec[float]([4.5, 7])
# vec[u8] tests
def test_u8_construct_from_initializer() -> None:
v = vec[u8]([123])
assert len(v) == 1
assert v[0] == 123
v = vec[u8](x for x in [0, 5, 255, 10])
assert len(v) == 4
assert v[0] == 0
assert v[1] == 5
assert v[2] == 255
assert v[3] == 10
with assertRaises(TypeError):
vec[u8](1)
with assertRaises(TypeError):
vec[u8](['1'])
with assertRaises(TypeError):
vec[u8]([None])
def test_u8_append() -> None:
v = vec[u8]()
v = append(v, 5)
assert str(v) == "vec[u8]([5])"
v = append(v, 255)
assert str(v) == "vec[u8]([5, 255])"
def test_u8_item_overflow() -> None:
with assertRaises(OverflowError):
vec[u8]([256])
with assertRaises(OverflowError):
vec[u8]([-1])
with assertRaises(OverflowError):
vec[u8]([2**100])
with assertRaises(OverflowError):
vec[u8]([-2**100])
def test_u8_get_item() -> None:
v = append(vec[u8](), 44)
assert v[0] == 44
v = append(v, 238)
assert v[0] == 44
assert v[1] == 238
def test_u8_remove() -> None:
a = [0, 7, 255]
for x in a:
v = vec[u8](a)
v = remove(v, x)
assert v == vec[u8]([y for y in a if y != x])
def test_u8_pop() -> None:
v = vec[u8]([0, 7, 255])
v, n = pop(v)
assert n == 255
assert v == vec[u8]([0, 7])
# vec[i16] tests
def test_i16_construct_from_initializer() -> None:
v = vec[i16]([123])
assert len(v) == 1
assert v[0] == 123
v = vec[i16](x for x in [0, 5, 32767, -32768])
assert len(v) == 4
assert v[0] == 0
assert v[1] == 5
assert v[2] == 32767
assert v[3] == -32768
with assertRaises(TypeError):
vec[i16](1)
with assertRaises(TypeError):
vec[i16](['1'])
with assertRaises(TypeError):
vec[i16]([None])
def test_i16_append() -> None:
v = vec[i16]()
v = append(v, 5)
assert str(v) == "vec[i16]([5])"
v = append(v, 32767)
assert str(v) == "vec[i16]([5, 32767])"
def test_i16_item_overflow() -> None:
with assertRaises(OverflowError):
vec[i16]([32768])
with assertRaises(OverflowError):
vec[i16]([-32769])
with assertRaises(OverflowError):
vec[i16]([2**100])
with assertRaises(OverflowError):
vec[i16]([-2**100])
def test_i16_get_item() -> None:
v = append(vec[i16](), 44)
assert v[0] == 44
v = append(v, -238)
assert v[0] == 44
assert v[1] == -238
def test_i16_remove() -> None:
a = [0, 7, -532, 32767]
for x in a:
v = vec[i16](a)
v = remove(v, x)
assert v == vec[i16]([y for y in a if y != x])
def test_i16_pop() -> None:
v = vec[i16]([0, -7, 32767])
v, n = pop(v)
assert n == 32767
assert v == vec[i16]([0, -7])
# vec[i32] tests
def test_i32_construct_from_initializer() -> None:
v = vec[i32]([123])
assert len(v) == 1
assert v[0] == 123
v = vec[i32](x for x in [0, 5, 2**31 - 1, -2**31])
assert len(v) == 4
assert v[0] == 0
assert v[1] == 5
assert v[2] == 2**31 - 1
assert v[3] == -2**31
with assertRaises(TypeError):
vec[i32](1)
with assertRaises(TypeError):
vec[i32](['1'])
with assertRaises(TypeError):
vec[i32]([None])
def test_i32_append() -> None:
v = vec[i32]()
v = append(v, 5)
assert str(v) == "vec[i32]([5])"
v = append(v, 2**31 - 1)
assert str(v) == "vec[i32]([5, 2147483647])"
def test_i32_item_overflow() -> None:
with assertRaises(OverflowError):
vec[i32]([2**31])
with assertRaises(OverflowError):
vec[i32]([-2**31 - 1])
with assertRaises(OverflowError):
vec[i32]([2**100])
with assertRaises(OverflowError):
vec[i32]([-2**100])
def test_i32_get_item() -> None:
v = append(vec[i32](), 44)
assert v[0] == 44
v = append(v, -238)
assert v[0] == 44
assert v[1] == -238
def test_i32_remove() -> None:
a = [0, 7, -532, 2**31 - 1]
for x in a:
v = vec[i32](a)
v = remove(v, x)
assert v == vec[i32]([y for y in a if y != x])
def test_i32_pop() -> None:
v = vec[i32]([0, -7, 2**31 - 1])
v, n = pop(v)
assert n == 2**31 - 1
assert v == vec[i32]([0, -7])
# vec[bool] tests
def test_bool_construct_from_initializer() -> None:
v = vec[bool]([True])
assert len(v) == 1
assert v[0] == True
v = vec[bool](x for x in [True, False, True])
assert len(v) == 3
assert v[0] is True
assert v[1] is False
assert v[2] is True
with assertRaises(TypeError):
vec[bool](1)
with assertRaises(TypeError):
vec[bool](['1'])
with assertRaises(TypeError):
vec[bool]([1])
with assertRaises(TypeError):
vec[bool]([None])
def test_bool_append() -> None:
v = vec[bool]()
v = append(v, False)
assert str(v) == "vec[bool]([False])"
v = append(v, True)
assert str(v) == "vec[bool]([False, True])"
def test_bool_get_item() -> None:
v = append(vec[bool](), True)
assert v[0] is True
v = append(v, False)
assert v[0] is True
assert v[1] is False
def test_bool_remove() -> None:
a = [True, False]
for x in a:
v = vec[bool](a)
v = remove(v, x)
assert v == vec[bool]([y for y in a if y != x])
def test_bool_pop() -> None:
v = vec[bool]([True, False, True])
v, n = pop(v)
assert n is True
assert v == vec[bool]([True, False])
# Iteration tests for all item types
def test_iteration() -> None:
# Test iteration for each primitive type
for x in vec[float]():
assert False
a = []
for x in vec[float]([1.5, 2.5, 3.5]):
a.append(x)
assert a == [1.5, 2.5, 3.5]
for x in vec[u8]():
assert False
a = []
for x in vec[u8]([1, 2, 255]):
a.append(x)
assert a == [1, 2, 255]
for x in vec[i16]():
assert False
a = []
for x in vec[i16]([-1000, 0, 1000]):
a.append(x)
assert a == [-1000, 0, 1000]
for x in vec[i32]():
assert False
a = []
for x in vec[i32]([-100000, 0, 100000]):
a.append(x)
assert a == [-100000, 0, 100000]
for x in vec[bool]():
assert False
a = []
for x in vec[bool]([True, False, True]):
a.append(x)
assert a == [True, False, True]
def test_iterator_protocol() -> None:
# Test iter() and next() for float
v_float = vec[float]([1.5, 2.5])
it = iter(v_float)
assert next(it) == 1.5
assert next(it) == 2.5
with assertRaises(StopIteration):
next(it)
# Test iter() and next() for u8
v_u8 = vec[u8]([10, 20])
it = iter(v_u8)
assert next(it) == 10
assert next(it) == 20
with assertRaises(StopIteration):
next(it)
# Test iter() and next() for i16
v_i16 = vec[i16]([-100, 100])
it = iter(v_i16)
assert next(it) == -100
assert next(it) == 100
with assertRaises(StopIteration):
next(it)
# Test iter() and next() for i32
v_i32 = vec[i32]([-1000, 1000])
it = iter(v_i32)
assert next(it) == -1000
assert next(it) == 1000
with assertRaises(StopIteration):
next(it)
# Test bool specifically since values are True/False singletons
v_bool = vec[bool]([True, False])
it = iter(v_bool)
assert next(it) is True
assert next(it) is False
with assertRaises(StopIteration):
next(it)
def test_cap_empty() -> None:
for t in ITEM_TYPES:
v = vec[t](capacity=3)
assert len(v) == 0
assert v == vec[t]()
def test_cap_with_initializer() -> None:
v = vec[float]([1.5, 2.5], capacity=3)
assert len(v) == 2
assert v[0] == 1.5
assert v[1] == 2.5
v = vec[u8]([10, 20], capacity=3)
assert len(v) == 2
assert v[0] == 10
v = vec[i16]([-100, 100], capacity=3)
assert len(v) == 2
v = vec[i32]([1000, 2000], capacity=3)
assert len(v) == 2
v = vec[bool]([True, False], capacity=3)
assert len(v) == 2
assert v[0] is True
assert v[1] is False
def test_cap_negative() -> None:
for t in ITEM_TYPES:
with assertRaises(ValueError):
vec[t](capacity=-1)
def test_cap_buffer_reuse() -> None:
# Verify buffer reuse within cap for each type
v = vec[float]([1.5], capacity=3)
old = v
v = append(v, 2.5)
v[0] = 9.5
assert old[0] == 9.5 # shared buffer
v = vec[u8]([10], capacity=3)
old = v
v = append(v, 20)
v[0] = 99
assert old[0] == 99
v = vec[bool]([True], capacity=3)
old = v
v = append(v, False)
v[0] = False
assert old[0] is False
def test_extend_float() -> None:
v = vec[float]([1.0])
v = extend(v, [2.5, 3.5])
assert v == vec[float]([1.0, 2.5, 3.5])
def test_extend_i32() -> None:
v = vec[i32]([1])
v = extend(v, [2, 3])
assert v == vec[i32]([1, 2, 3])
def test_extend_i16() -> None:
v = vec[i16]([1])
v = extend(v, [2, 3])
assert v == vec[i16]([1, 2, 3])
def test_extend_u8() -> None:
v = vec[u8]([1])
v = extend(v, [2, 3])
assert v == vec[u8]([1, 2, 3])
def test_extend_bool() -> None:
v = vec[bool]([True])
v = extend(v, [False, True])
assert v == vec[bool]([True, False, True])
[case testLibrtVecsBufferProtocol_librt]
import struct
from typing import Any
import librt.vecs
import mypy_extensions
from testutil import assertRaises
vec: Any = librt.vecs.vec
append: Any = librt.vecs.append
extend: Any = librt.vecs.extend
i64: Any = mypy_extensions.i64
i32: Any = mypy_extensions.i32
i16: Any = mypy_extensions.i16
u8: Any = mypy_extensions.u8
memoryview_: Any = eval('memoryview')
def test_buffer_u8() -> None:
v = vec[u8]([1, 2, 3])
mv = memoryview_(v)
assert mv.format == "B"
assert mv.itemsize == 1
assert mv.readonly
assert mv.ndim == 1
assert mv.shape == (3,)
assert list(mv) == [1, 2, 3]
def test_buffer_i64() -> None:
v = vec[i64]([10, 20, -30])
mv = memoryview_(v)
assert mv.format == "q"
assert mv.itemsize == 8
assert mv.readonly
assert mv.ndim == 1
assert mv.shape == (3,)
assert list(mv) == [10, 20, -30]
def test_buffer_i32() -> None:
v = vec[i32]([5, -12])
mv = memoryview_(v)
assert mv.format == "i"
assert mv.itemsize == 4
assert mv.readonly
assert list(mv) == [5, -12]
def test_buffer_i16() -> None:
v = vec[i16]([100, -200])
mv = memoryview_(v)
assert mv.format == "h"
assert mv.itemsize == 2
assert mv.readonly
assert list(mv) == [100, -200]
def test_buffer_float() -> None:
v = vec[float]([1.5, -2.5])
mv = memoryview_(v)
assert mv.format == "d"
assert mv.itemsize == 8
assert mv.readonly
assert list(mv) == [1.5, -2.5]
def test_buffer_bool() -> None:
v = vec[bool]([True, False, True])
mv = memoryview_(v)
assert mv.format == "b"
assert mv.itemsize == 1
assert mv.readonly
assert list(mv) == [1, 0, 1]
def test_buffer_empty() -> None:
v = vec[i64]([])
mv = memoryview_(v)
assert mv.format == "q"
assert len(mv) == 0
assert mv.shape == (0,)
assert list(mv) == []
def test_buffer_readonly() -> None:
v = vec[u8]([1, 2, 3])
mv = memoryview_(v)
with assertRaises(TypeError):
mv[0] = 99
def test_buffer_bytes_conversion() -> None:
v = vec[u8]([72, 101, 108, 108, 111])
assert bytes(v) == b"Hello"
def test_buffer_tobytes() -> None:
v = vec[i32]([1, 2])
mv = memoryview_(v)
b = mv.tobytes()
values = struct.unpack("ii", b)
assert values == (1, 2)
def test_buffer_extend_from_shared_buffer() -> None:
old = vec[u8]([1, 2], capacity=5)
new = append(old, 3)
v = extend(old, memoryview_(new))
assert v == vec[u8]([1, 2, 1, 2, 3])
assert new == vec[u8]([1, 2, 3])