|
| 1 | +import typing as ty |
| 2 | + |
| 3 | +import numpy as np |
| 4 | +import pytest |
| 5 | + |
| 6 | +from nibabel import AnalyzeImage, Spm99AnalyzeImage, Spm2AnalyzeImage, Nifti1Image, Nifti2Image, MGHImage |
| 7 | +from nibabel.spatialimages import SpatialImage |
| 8 | + |
| 9 | +if ty.TYPE_CHECKING: |
| 10 | + from typing import reveal_type |
| 11 | +else: |
| 12 | + |
| 13 | + def reveal_type(x: ty.Any) -> None: |
| 14 | + pass |
| 15 | + |
| 16 | + |
| 17 | +@pytest.mark.mypy_testing |
| 18 | +def test_affine_tracking() -> None: |
| 19 | + img_with_affine = SpatialImage(np.empty((5, 5, 5)), np.eye(4)) |
| 20 | + img_without_affine = SpatialImage(np.empty((5, 5, 5)), None) |
| 21 | + |
| 22 | + reveal_type(img_with_affine) # R: nibabel.spatialimages.SpatialImage[numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]]] |
| 23 | + reveal_type(img_without_affine) # R: nibabel.spatialimages.SpatialImage[None] |
| 24 | + |
| 25 | + |
| 26 | +@pytest.mark.mypy_testing |
| 27 | +def test_SpatialImageAPI() -> None: |
| 28 | + img = SpatialImage(np.empty((5, 5, 5)), np.eye(4)) |
| 29 | + |
| 30 | + # Affine |
| 31 | + reveal_type(img.affine) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]] |
| 32 | + reveal_type(SpatialImage(np.empty((5, 5, 5)), None).affine) # R: None |
| 33 | + |
| 34 | + # Data |
| 35 | + reveal_type(img.dataobj) # R: nibabel.arrayproxy.ArrayLike |
| 36 | + reveal_type(img.get_fdata()) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]] |
| 37 | + reveal_type(img.get_fdata(dtype=np.float32)) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.floating[numpy._typing._nbit_base._32Bit]]] |
| 38 | + reveal_type(img.get_fdata(dtype=np.float64)) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]] |
| 39 | + reveal_type(img.get_fdata(dtype=np.dtype(np.float32))) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.floating[numpy._typing._nbit_base._32Bit]]] |
| 40 | + reveal_type(img.get_fdata(dtype=np.dtype(np.float64))) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]] |
| 41 | + reveal_type(img.get_fdata(dtype=np.dtype("f4"))) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.floating[numpy._typing._nbit_base._32Bit]]] |
| 42 | + reveal_type(img.get_fdata(dtype=np.dtype("f8"))) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]] |
| 43 | + reveal_type(img.get_fdata(dtype="f4")) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.floating[numpy._typing._nbit_base._32Bit]]] |
| 44 | + reveal_type(img.get_fdata(dtype="f8")) # R: numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]] |
| 45 | + |
| 46 | + # Indirect header |
| 47 | + reveal_type(img.shape) # R: builtins.tuple[builtins.int, ...] |
| 48 | + reveal_type(img.ndim) # R: builtins.int |
| 49 | + |
| 50 | + # SpatialHeader fields |
| 51 | + reveal_type(img.header.get_data_dtype()) # R: numpy.dtype[Any] |
| 52 | + reveal_type(img.header.get_data_shape()) # R: builtins.tuple[builtins.int, ...] |
| 53 | + reveal_type(img.header.get_zooms()) # R: builtins.tuple[builtins.float, ...] |
| 54 | + |
| 55 | + |
| 56 | +@pytest.mark.mypy_testing |
| 57 | +def test_image_and_header_types() -> None: |
| 58 | + analyze_img = AnalyzeImage(np.empty((5, 5, 5)), np.eye(4)) |
| 59 | + reveal_type(analyze_img) # R: nibabel.analyze.AnalyzeImage[numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]]] |
| 60 | + reveal_type(analyze_img.header) # R: nibabel.analyze.AnalyzeHeader |
| 61 | + |
| 62 | + spm99_img = Spm99AnalyzeImage(np.empty((5, 5, 5)), np.eye(4)) |
| 63 | + reveal_type(spm99_img) # R: nibabel.spm99analyze.Spm99AnalyzeImage[numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]]] |
| 64 | + reveal_type(spm99_img.header) # R: nibabel.spm99analyze.Spm99AnalyzeHeader |
| 65 | + |
| 66 | + spm2_img = Spm2AnalyzeImage(np.empty((5, 5, 5)), np.eye(4)) |
| 67 | + reveal_type(spm2_img) # R: nibabel.spm2analyze.Spm2AnalyzeImage[numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]]] |
| 68 | + reveal_type(spm2_img.header) # R: nibabel.spm2analyze.Spm2AnalyzeHeader |
| 69 | + |
| 70 | + ni1_img = Nifti1Image(np.empty((5, 5, 5)), np.eye(4)) |
| 71 | + reveal_type(ni1_img) # R: nibabel.nifti1.Nifti1Image[numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]]] |
| 72 | + reveal_type(ni1_img.header) # R: nibabel.nifti1.Nifti1Header |
| 73 | + |
| 74 | + ni2_img = Nifti2Image(np.empty((5, 5, 5)), np.eye(4)) |
| 75 | + reveal_type(ni2_img) # R: nibabel.nifti2.Nifti2Image[numpy.ndarray[builtins.tuple[builtins.int, ...], numpy.dtype[numpy.float64]]] |
| 76 | + reveal_type(ni2_img.header) # R: nibabel.nifti2.Nifti2Header |
| 77 | + |
| 78 | + mgh_img = MGHImage(np.empty((5, 5, 5), dtype=np.float32), np.eye(4)) |
| 79 | + reveal_type(mgh_img) # R: nibabel.freesurfer.mghformat.MGHImage |
| 80 | + reveal_type(mgh_img.header) # R: nibabel.freesurfer.mghformat.MGHHeader |
0 commit comments