pybind11/tests/test_numpy_scalars.py

63 lines
1.4 KiB
Python
Raw Normal View History

2024-06-24 01:55:05 +00:00
from __future__ import annotations
2021-12-10 07:58:52 +00:00
import sys
import pytest
from pybind11_tests import numpy_scalars as m
np = pytest.importorskip("numpy")
2023-02-23 01:30:47 +00:00
SCALAR_TYPES = {
np.bool_: False,
2023-02-24 00:58:45 +00:00
np.int8: -7,
np.int16: -15,
np.int32: -31,
np.int64: -63,
np.uint8: 9,
np.uint16: 17,
np.uint32: 33,
np.uint64: 65,
np.single: 1.125,
np.double: 1.25,
np.complex64: 1 - 0.125j,
np.complex128: 1 - 0.25j,
2023-02-23 01:30:47 +00:00
}
2021-12-10 07:58:52 +00:00
ALL_TYPES = [int, bool, float, bytes, str] + list(SCALAR_TYPES)
def type_name(tp):
try:
return tp.__name__.rstrip("_")
2021-12-10 07:58:52 +00:00
except BaseException:
# no numpy
return str(tp)
@pytest.fixture(scope="module", params=list(SCALAR_TYPES), ids=type_name)
2021-12-10 07:58:52 +00:00
def scalar_type(request):
return request.param
def expected_signature(tp):
s = "str" if sys.version_info[0] >= 3 else "unicode"
2021-12-10 07:58:52 +00:00
t = type_name(tp)
2024-03-29 04:16:17 +00:00
return f"test_{t}(x: {t}) -> tuple[{s}, {t}]\n"
2021-12-10 07:58:52 +00:00
def test_numpy_scalars(scalar_type):
expected = SCALAR_TYPES[scalar_type]
name = type_name(scalar_type)
func = getattr(m, "test_" + name)
2021-12-10 07:58:52 +00:00
assert func.__doc__ == expected_signature(scalar_type)
for tp in ALL_TYPES:
value = tp(1)
if tp is scalar_type:
result = func(value)
assert result[0] == name
assert isinstance(result[1], tp)
assert result[1] == tp(expected)
else:
with pytest.raises(TypeError):
func(value)