Skip to content
Open
39 changes: 25 additions & 14 deletions src/numpy-stubs/@test/runtime/test_ctype_assumptions.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
# ruff: noqa: S101, PLR2004

import ctypes as ct
import platform
import sys

import pytest

import numpy as np

WIN32 = sys.platform == "win32"
IS_WIN = sys.platform == "win32"
IS_X86 = platform.machine().lower() in {"x86_64", "amd64", "i386", "i686"}
SIZE_P = ct.sizeof(ct.c_ssize_t) * 8


Expand All @@ -19,8 +21,9 @@ def test_maxsize_32_or_64() -> None:

@pytest.mark.parametrize("char", ["q", "Q"])
def test_longlong_64(char: str) -> None:
assert np.dtype(char).itemsize == 8
assert np.dtype(char).alignment == 8
dt = np.dtype(char)
assert dt.itemsize == 8
assert dt.alignment == 8


@pytest.mark.parametrize(
Expand All @@ -29,30 +32,38 @@ def test_longlong_64(char: str) -> None:
("byte", "int8"),
("short", "int16"),
("intc", "int32"),
("long", "int32" if WIN32 else f"int{SIZE_P}"),
("intp", f"int{SIZE_P}"),
("long", "int32" if IS_WIN else f"int{SIZE_P}"),
],
)
def test_alias_integer(name_c: str, name_expect: str) -> None:
signed_c: type[np.signedinteger] = getattr(np, name_c)
signed_expect: type[np.signedinteger] = getattr(np, name_expect)
assert signed_c is signed_expect
assert np.dtype(signed_c) == np.dtype(signed_expect)

unsigned_c: type[np.unsignedinteger] = getattr(np, f"u{name_c}")
unsigned_expect: type[np.unsignedinteger] = getattr(np, f"u{name_expect}")
assert unsigned_c is unsigned_expect
assert np.dtype(unsigned_c) == np.dtype(unsigned_expect)


@pytest.mark.parametrize(
("name_c", "name_expect"),
[
("half", "float16"),
("single", "float32"),
("double", "float64"),
("longdouble", "float96" if WIN32 else f"float{SIZE_P + 64}"),
],
[("half", "float16"), ("single", "float32"), ("double", "float64")],
)
def test_alias_floating(name_c: str, name_expect: str) -> None:
def test_alias_floating_standard(name_c: str, name_expect: str) -> None:
floating_c: type[np.floating] = getattr(np, name_c)
floating_expect: type[np.floating] = getattr(np, name_expect)
assert floating_c is floating_expect
assert np.dtype(floating_c) == np.dtype(floating_expect)


def test_alias_longdouble() -> None:
ld_name = np.dtype(np.longdouble).name

if IS_WIN:
assert ld_name in {"float64", "float96"}
elif IS_X86:
assert ld_name == f"float{SIZE_P + 64}"
else:
assert ld_name in {"float64", "float128"}

assert np.dtype(np.longdouble) == np.dtype(getattr(np, ld_name))