Fix numpy tests for big endian architectures
Fixes some numpy tests failures on ppc64 in big-endian mode due to
little-endian assumptions.
Fixes #694.
diff --git a/tests/test_numpy_array.py b/tests/test_numpy_array.py
index 2ff2fc3..365f4e3 100644
--- a/tests/test_numpy_array.py
+++ b/tests/test_numpy_array.py
@@ -8,7 +8,7 @@
@pytest.fixture(scope='function')
def arr():
- return np.array([[1, 2, 3], [4, 5, 6]], '<u2')
+ return np.array([[1, 2, 3], [4, 5, 6]], '=u2')
def test_array_attributes():
@@ -80,9 +80,10 @@
([1, 2], [6])])
def test_data(arr, args, ret):
from pybind11_tests.array import data, data_t
+ from sys import byteorder
assert all(data_t(arr, *args) == ret)
- assert all(data(arr, *args)[::2] == ret)
- assert all(data(arr, *args)[1::2] == 0)
+ assert all(data(arr, *args)[(0 if byteorder == 'little' else 1)::2] == ret)
+ assert all(data(arr, *args)[(1 if byteorder == 'little' else 0)::2] == 0)
def test_mutate_readonly(arr):
diff --git a/tests/test_numpy_dtypes.py b/tests/test_numpy_dtypes.py
index 82b272e..0ef4e93 100644
--- a/tests/test_numpy_dtypes.py
+++ b/tests/test_numpy_dtypes.py
@@ -21,7 +21,10 @@
def dt_fmt():
- return ("{{'names':['bool_','uint_','float_','ldbl_'], 'formats':['?','<u4','<f4','<f{}'],"
+ from sys import byteorder
+ e = '<' if byteorder == 'little' else '>'
+ return ("{{'names':['bool_','uint_','float_','ldbl_'],"
+ " 'formats':['?','" + e + "u4','" + e + "f4','" + e + "f{}'],"
" 'offsets':[0,4,8,{}], 'itemsize':{}}}")
@@ -32,8 +35,9 @@
def packed_dtype_fmt():
- return "[('bool_', '?'), ('uint_', '<u4'), ('float_', '<f4'), ('ldbl_', '<f{}')]".format(
- np.dtype('longdouble').itemsize)
+ from sys import byteorder
+ return "[('bool_', '?'), ('uint_', '{e}u4'), ('float_', '{e}f4'), ('ldbl_', '{e}f{}')]".format(
+ np.dtype('longdouble').itemsize, e='<' if byteorder == 'little' else '>')
def partial_ld_offset():
@@ -89,6 +93,8 @@
def test_dtype(simple_dtype):
from pybind11_tests import (print_dtypes, test_dtype_ctors, test_dtype_methods,
trailing_padding_dtype, buffer_to_dtype)
+ from sys import byteorder
+ e = '<' if byteorder == 'little' else '>'
assert print_dtypes() == [
simple_dtype_fmt(),
@@ -97,8 +103,8 @@
partial_dtype_fmt(),
partial_nested_fmt(),
"[('a', 'S3'), ('b', 'S3')]",
- "[('e1', '<i8'), ('e2', 'u1')]",
- "[('x', 'i1'), ('y', '<u8')]"
+ "[('e1', '" + e + "i8'), ('e2', 'u1')]",
+ "[('x', 'i1'), ('y', '" + e + "u8')]"
]
d1 = np.dtype({'names': ['a', 'b'], 'formats': ['int32', 'float64'],
@@ -209,10 +215,12 @@
def test_enum_array():
from pybind11_tests import create_enum_array, print_enum_array
+ from sys import byteorder
+ e = '<' if byteorder == 'little' else '>'
arr = create_enum_array(3)
dtype = arr.dtype
- assert dtype == np.dtype([('e1', '<i8'), ('e2', 'u1')])
+ assert dtype == np.dtype([('e1', e + 'i8'), ('e2', 'u1')])
assert print_enum_array(arr) == [
"e1=A,e2=X",
"e1=B,e2=Y",