diff --git a/src/sqomega/_low_level_io.py b/src/sqomega/_low_level_io.py index 609a734..1e2e8dd 100644 --- a/src/sqomega/_low_level_io.py +++ b/src/sqomega/_low_level_io.py @@ -139,8 +139,8 @@ def read_n_chars(self, n: int) -> str: def read_array( self, shape: tuple[int, ...], dtype: np.dtype[_E] ) -> npt.NDArray[_E]: - # TODO byteorder count = int(np.prod(shape)) + dtype = dtype.newbyteorder(self.byteorder.value) if isinstance(self._file, BytesIO): flat = np.frombuffer( self._file.getbuffer(), offset=self.position, dtype=dtype, count=count @@ -189,9 +189,12 @@ def write_chars(self, value: str) -> None: @_annotate_write_exception("array") def write_array(self, array: npt.NDArray[np.float64]) -> None: - # TODO byteorder # TODO element order - array.tofile(self._file) + ( + array.astype( + array.dtype.newbyteorder(self.byteorder.value), copy=False + ).tofile(self._file) + ) @_annotate_write_exception("bytes") def write_raw(self, value: bytes | memoryview) -> None: diff --git a/tests/write_test.py b/tests/write_test.py index 491e540..275abcf 100644 --- a/tests/write_test.py +++ b/tests/write_test.py @@ -4,6 +4,9 @@ import sys from datetime import datetime, timedelta, timezone from io import BytesIO +from typing import Literal + +import pytest from sqomega import Byteorder, Sqw @@ -75,9 +78,12 @@ def test_create_writes_file_header_big_endian() -> None: assert buffer.read(len(expected)) == expected -def test_create_writes_main_header() -> None: +@pytest.mark.parametrize('byteorder', ['native', 'little', 'big']) +def test_create_writes_main_header( + byteorder: Literal['native', 'little', 'big'], +) -> None: buffer = BytesIO() - builder = Sqw.build(buffer, title='my title', byteorder="little") + builder = Sqw.build(buffer, title='my title', byteorder=byteorder) with builder.create(): pass buffer.seek(0) @@ -90,6 +96,3 @@ def test_create_writes_main_header() -> None: assert (main_header.creation_date - datetime.now(tz=timezone.utc)) < timedelta( seconds=1 ) - - -# TODO test byteorder of arrays (e.g., in detpar)