2024-06-22 04:55:00 +00:00
|
|
|
from __future__ import annotations
|
|
|
|
|
2021-08-13 16:37:05 +00:00
|
|
|
import ctypes
|
2019-11-24 07:33:05 +00:00
|
|
|
import io
|
2017-05-17 08:52:33 +00:00
|
|
|
import struct
|
2019-11-24 07:33:05 +00:00
|
|
|
|
2016-08-12 11:50:00 +00:00
|
|
|
import pytest
|
2019-11-24 07:33:05 +00:00
|
|
|
|
2021-10-08 12:38:04 +00:00
|
|
|
import env
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
from pybind11_tests import ConstructorStats
|
2021-08-13 16:37:05 +00:00
|
|
|
from pybind11_tests import buffers as m
|
2016-08-12 11:50:00 +00:00
|
|
|
|
2020-08-16 20:02:12 +00:00
|
|
|
np = pytest.importorskip("numpy")
|
2016-08-12 11:50:00 +00:00
|
|
|
|
Add `format_descriptor<>` & `npy_format_descriptor<>` `PyObject *` specializations. (#4674)
* Add `npy_format_descriptor<PyObject *>` to enable `py::array_t<PyObject *>` to/from-python conversions.
* resolve clang-tidy warning
* Use existing constructor instead of adding a static method. Thanks @Skylion007 for pointing out.
* Add `format_descriptor<PyObject *>`
Trivial addition, but still in search for a meaningful test.
* Add test_format_descriptor_format
* Ensure the Eigen `type_caster`s do not segfault when loading arrays with dtype=object
* Use `static_assert()` `!std::is_pointer<>` to replace runtime guards.
* Add comments to explain how to check for ref-count bugs. (NO code changes.)
* Make the "Pointer types ... are not supported" message Eigen-specific, as suggested by @Lalaland. Move to new pybind11/eigen/common.h header.
* Change "format_descriptor_format" implementation as suggested by @Lalaland. Additional tests meant to ensure consistency between py::format_descriptor<>, np.array, np.format_parser turn out to be useful only to highlight long-standing inconsistencies.
* resolve clang-tidy warning
* Account for np.float128, np.complex256 not being available on Windows, in a future-proof way.
* Fully address i|q|l ambiguity (hopefully).
* Remove the new `np.format_parser()`-based test, it's much more distracting than useful.
* Use bi.itemsize to disambiguate "l" or "L"
* Use `py::detail::compare_buffer_info<T>::compare()` to validate the `format_descriptor<T>::format()` strings.
* Add `buffer_info::compare<T>` to make `detail::compare_buffer_info<T>::compare` more visible & accessible.
* silence clang-tidy warning
* pytest-compatible access to np.float128, np.complex256
* Revert "pytest-compatible access to np.float128, np.complex256"
This reverts commit e9a289c50fc07199806d14ded644215ab6f03afa.
* Use `sizeof(long double) == sizeof(double)` instead of `std::is_same<>`
* Report skipped `long double` tests.
* Change the name of the new `buffer_info` member function to `item_type_is_equivalent_to`. Add comment defining "equivalent" by example.
* Change `item_type_is_equivalent_to<>()` from `static` function to member function, as suggested by @Lalaland
2023-05-23 17:49:32 +00:00
|
|
|
if m.long_double_and_double_have_same_size:
|
|
|
|
# Determined by the compiler used to build the pybind11 tests
|
|
|
|
# (e.g. MSVC gets here, but MinGW might not).
|
|
|
|
np_float128 = None
|
|
|
|
np_complex256 = None
|
|
|
|
else:
|
|
|
|
# Determined by the compiler used to build numpy (e.g. MinGW).
|
|
|
|
np_float128 = getattr(np, *["float128"] * 2)
|
|
|
|
np_complex256 = getattr(np, *["complex256"] * 2)
|
|
|
|
|
|
|
|
CPP_NAME_FORMAT_NP_DTYPE_TABLE = [
|
|
|
|
("PyObject *", "O", object),
|
|
|
|
("bool", "?", np.bool_),
|
|
|
|
("std::int8_t", "b", np.int8),
|
|
|
|
("std::uint8_t", "B", np.uint8),
|
|
|
|
("std::int16_t", "h", np.int16),
|
|
|
|
("std::uint16_t", "H", np.uint16),
|
|
|
|
("std::int32_t", "i", np.int32),
|
|
|
|
("std::uint32_t", "I", np.uint32),
|
|
|
|
("std::int64_t", "q", np.int64),
|
|
|
|
("std::uint64_t", "Q", np.uint64),
|
|
|
|
("float", "f", np.float32),
|
|
|
|
("double", "d", np.float64),
|
|
|
|
("long double", "g", np_float128),
|
|
|
|
("std::complex<float>", "Zf", np.complex64),
|
|
|
|
("std::complex<double>", "Zd", np.complex128),
|
|
|
|
("std::complex<long double>", "Zg", np_complex256),
|
|
|
|
]
|
|
|
|
CPP_NAME_FORMAT_TABLE = [
|
|
|
|
(cpp_name, format)
|
|
|
|
for cpp_name, format, np_dtype in CPP_NAME_FORMAT_NP_DTYPE_TABLE
|
|
|
|
if np_dtype is not None
|
|
|
|
]
|
|
|
|
CPP_NAME_NP_DTYPE_TABLE = [
|
|
|
|
(cpp_name, np_dtype) for cpp_name, _, np_dtype in CPP_NAME_FORMAT_NP_DTYPE_TABLE
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize(("cpp_name", "np_dtype"), CPP_NAME_NP_DTYPE_TABLE)
|
|
|
|
def test_format_descriptor_format_buffer_info_equiv(cpp_name, np_dtype):
|
|
|
|
if np_dtype is None:
|
|
|
|
pytest.skip(
|
|
|
|
f"cpp_name=`{cpp_name}`: `long double` and `double` have same size."
|
|
|
|
)
|
|
|
|
if isinstance(np_dtype, str):
|
|
|
|
pytest.skip(f"np.{np_dtype} does not exist.")
|
|
|
|
np_array = np.array([], dtype=np_dtype)
|
|
|
|
for other_cpp_name, expected_format in CPP_NAME_FORMAT_TABLE:
|
|
|
|
format, np_array_is_matching = m.format_descriptor_format_buffer_info_equiv(
|
|
|
|
other_cpp_name, np_array
|
|
|
|
)
|
|
|
|
assert format == expected_format
|
|
|
|
if other_cpp_name == cpp_name:
|
|
|
|
assert np_array_is_matching
|
|
|
|
else:
|
|
|
|
assert not np_array_is_matching
|
|
|
|
|
2016-08-12 11:50:00 +00:00
|
|
|
|
2016-12-16 14:00:46 +00:00
|
|
|
def test_from_python():
|
|
|
|
with pytest.raises(RuntimeError) as excinfo:
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
m.Matrix(np.array([1, 2, 3])) # trying to assign a 1D array
|
2016-12-16 14:00:46 +00:00
|
|
|
assert str(excinfo.value) == "Incompatible buffer format!"
|
|
|
|
|
|
|
|
m3 = np.array([[1, 2, 3], [4, 5, 6]]).astype(np.float32)
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
m4 = m.Matrix(m3)
|
2016-12-16 14:00:46 +00:00
|
|
|
|
|
|
|
for i in range(m4.rows()):
|
|
|
|
for j in range(m4.cols()):
|
|
|
|
assert m3[i, j] == m4[i, j]
|
|
|
|
|
2024-10-07 21:12:04 +00:00
|
|
|
if env.GRAALPY:
|
|
|
|
pytest.skip("ConstructorStats is incompatible with GraalPy.")
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
cstats = ConstructorStats.get(m.Matrix)
|
2016-12-16 14:00:46 +00:00
|
|
|
assert cstats.alive() == 1
|
|
|
|
del m3, m4
|
|
|
|
assert cstats.alive() == 0
|
|
|
|
assert cstats.values() == ["2x3 matrix"]
|
|
|
|
assert cstats.copy_constructions == 0
|
|
|
|
# assert cstats.move_constructions >= 0 # Don't invoke any
|
|
|
|
assert cstats.copy_assignments == 0
|
|
|
|
assert cstats.move_assignments == 0
|
|
|
|
|
|
|
|
|
2020-08-16 20:02:12 +00:00
|
|
|
# https://foss.heptapod.net/pypy/pypy/-/issues/2444
|
2021-11-17 14:44:19 +00:00
|
|
|
# TODO: fix on recent PyPy
|
|
|
|
@pytest.mark.xfail(
|
2021-11-22 09:33:03 +00:00
|
|
|
env.PYPY, reason="PyPy 7.3.7 doesn't clear this anymore", strict=False
|
2021-11-17 14:44:19 +00:00
|
|
|
)
|
2016-08-12 11:50:00 +00:00
|
|
|
def test_to_python():
|
2017-09-21 21:07:48 +00:00
|
|
|
mat = m.Matrix(5, 4)
|
|
|
|
assert memoryview(mat).shape == (5, 4)
|
2016-08-12 11:50:00 +00:00
|
|
|
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
assert mat[2, 3] == 0
|
2017-09-21 21:07:48 +00:00
|
|
|
mat[2, 3] = 4.0
|
|
|
|
mat[3, 2] = 7.0
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
assert mat[2, 3] == 4
|
2017-09-21 21:07:48 +00:00
|
|
|
assert mat[3, 2] == 7
|
2020-10-16 20:38:13 +00:00
|
|
|
assert struct.unpack_from("f", mat, (3 * 4 + 2) * 4) == (7,)
|
|
|
|
assert struct.unpack_from("f", mat, (2 * 4 + 3) * 4) == (4,)
|
2016-08-12 11:50:00 +00:00
|
|
|
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
mat2 = np.array(mat, copy=False)
|
2017-09-21 21:07:48 +00:00
|
|
|
assert mat2.shape == (5, 4)
|
|
|
|
assert abs(mat2).sum() == 11
|
2023-02-22 14:18:55 +00:00
|
|
|
assert mat2[2, 3] == 4
|
|
|
|
assert mat2[3, 2] == 7
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
mat2[2, 3] = 5
|
|
|
|
assert mat2[2, 3] == 5
|
2016-08-12 11:50:00 +00:00
|
|
|
|
2024-10-07 21:12:04 +00:00
|
|
|
if env.GRAALPY:
|
|
|
|
pytest.skip("ConstructorStats is incompatible with GraalPy.")
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
cstats = ConstructorStats.get(m.Matrix)
|
2016-08-12 11:50:00 +00:00
|
|
|
assert cstats.alive() == 1
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
del mat
|
2016-12-16 14:00:46 +00:00
|
|
|
pytest.gc_collect()
|
2016-08-12 11:50:00 +00:00
|
|
|
assert cstats.alive() == 1
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
del mat2 # holds a mat reference
|
2016-12-16 14:00:46 +00:00
|
|
|
pytest.gc_collect()
|
2016-08-12 11:50:00 +00:00
|
|
|
assert cstats.alive() == 0
|
2017-09-21 21:07:48 +00:00
|
|
|
assert cstats.values() == ["5x4 matrix"]
|
2016-08-12 11:50:00 +00:00
|
|
|
assert cstats.copy_constructions == 0
|
|
|
|
# assert cstats.move_constructions >= 0 # Don't invoke any
|
|
|
|
assert cstats.copy_assignments == 0
|
|
|
|
assert cstats.move_assignments == 0
|
2017-05-17 08:52:33 +00:00
|
|
|
|
|
|
|
|
2017-05-28 14:35:02 +00:00
|
|
|
def test_inherited_protocol():
|
|
|
|
"""SquareMatrix is derived from Matrix and inherits the buffer protocol"""
|
|
|
|
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
matrix = m.SquareMatrix(5)
|
2017-05-28 14:35:02 +00:00
|
|
|
assert memoryview(matrix).shape == (5, 5)
|
|
|
|
assert np.asarray(matrix).shape == (5, 5)
|
|
|
|
|
|
|
|
|
Update all remaining tests to new test styles
This udpates all the remaining tests to the new test suite code and
comment styles started in #898. For the most part, the test coverage
here is unchanged, with a few minor exceptions as noted below.
- test_constants_and_functions: this adds more overload tests with
overloads with different number of arguments for more comprehensive
overload_cast testing. The test style conversion broke the overload
tests under MSVC 2015, prompting the additional tests while looking
for a workaround.
- test_eigen: this dropped the unused functions `get_cm_corners` and
`get_cm_corners_const`--these same tests were duplicates of the same
things provided (and used) via ReturnTester methods.
- test_opaque_types: this test had a hidden dependence on ExampleMandA
which is now fixed by using the global UserType which suffices for the
relevant test.
- test_methods_and_attributes: this required some additions to UserType
to make it usable as a replacement for the test's previous SimpleType:
UserType gained a value mutator, and the `value` property is not
mutable (it was previously readonly). Some overload tests were also
added to better test overload_cast (as described above).
- test_numpy_array: removed the untemplated mutate_data/mutate_data_t:
the templated versions with an empty parameter pack expand to the same
thing.
- test_stl: this was already mostly in the new style; this just tweaks
things a bit, localizing a class, and adding some missing
`// test_whatever` comments.
- test_virtual_functions: like `test_stl`, this was mostly in the new
test style already, but needed some `// test_whatever` comments.
This commit also moves the inherited virtual example code to the end
of the file, after the main set of tests (since it is less important
than the other tests, and rather length); it also got renamed to
`test_inherited_virtuals` (from `test_inheriting_repeat`) because it
tests both inherited virtual approaches, not just the repeat approach.
2017-07-25 20:47:36 +00:00
|
|
|
def test_pointer_to_member_fn():
|
|
|
|
for cls in [m.Buffer, m.ConstBuffer, m.DerivedBuffer]:
|
2017-05-17 08:52:33 +00:00
|
|
|
buf = cls()
|
|
|
|
buf.value = 0x12345678
|
2020-10-16 20:38:13 +00:00
|
|
|
value = struct.unpack("i", bytearray(buf))[0]
|
2017-05-17 08:52:33 +00:00
|
|
|
assert value == 0x12345678
|
2019-11-24 07:33:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_readonly_buffer():
|
|
|
|
buf = m.BufferReadOnly(0x64)
|
|
|
|
view = memoryview(buf)
|
2022-02-11 02:28:08 +00:00
|
|
|
assert view[0] == 0x64
|
2019-11-24 07:33:05 +00:00
|
|
|
assert view.readonly
|
2021-01-01 16:05:22 +00:00
|
|
|
with pytest.raises(TypeError):
|
2022-02-11 02:28:08 +00:00
|
|
|
view[0] = 0
|
2019-11-24 07:33:05 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_selective_readonly_buffer():
|
|
|
|
buf = m.BufferReadOnlySelect()
|
|
|
|
|
2022-02-11 02:28:08 +00:00
|
|
|
memoryview(buf)[0] = 0x64
|
2019-11-24 07:33:05 +00:00
|
|
|
assert buf.value == 0x64
|
|
|
|
|
2020-10-16 20:38:13 +00:00
|
|
|
io.BytesIO(b"A").readinto(buf)
|
|
|
|
assert buf.value == ord(b"A")
|
2019-11-24 07:33:05 +00:00
|
|
|
|
|
|
|
buf.readonly = True
|
|
|
|
with pytest.raises(TypeError):
|
2022-02-11 02:28:08 +00:00
|
|
|
memoryview(buf)[0] = 0
|
2019-11-24 07:33:05 +00:00
|
|
|
with pytest.raises(TypeError):
|
2020-10-16 20:38:13 +00:00
|
|
|
io.BytesIO(b"1").readinto(buf)
|
2020-10-03 21:09:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_ctypes_array_1d():
|
|
|
|
char1d = (ctypes.c_char * 10)()
|
|
|
|
int1d = (ctypes.c_int * 15)()
|
|
|
|
long1d = (ctypes.c_long * 7)()
|
|
|
|
|
|
|
|
for carray in (char1d, int1d, long1d):
|
|
|
|
info = m.get_buffer_info(carray)
|
|
|
|
assert info.itemsize == ctypes.sizeof(carray._type_)
|
|
|
|
assert info.size == len(carray)
|
|
|
|
assert info.ndim == 1
|
|
|
|
assert info.shape == [info.size]
|
|
|
|
assert info.strides == [info.itemsize]
|
|
|
|
assert not info.readonly
|
|
|
|
|
|
|
|
|
|
|
|
def test_ctypes_array_2d():
|
|
|
|
char2d = ((ctypes.c_char * 10) * 4)()
|
|
|
|
int2d = ((ctypes.c_int * 15) * 3)()
|
|
|
|
long2d = ((ctypes.c_long * 7) * 2)()
|
|
|
|
|
|
|
|
for carray in (char2d, int2d, long2d):
|
|
|
|
info = m.get_buffer_info(carray)
|
|
|
|
assert info.itemsize == ctypes.sizeof(carray[0]._type_)
|
|
|
|
assert info.size == len(carray) * len(carray[0])
|
|
|
|
assert info.ndim == 2
|
|
|
|
assert info.shape == [len(carray), len(carray[0])]
|
|
|
|
assert info.strides == [info.itemsize * len(carray[0]), info.itemsize]
|
|
|
|
assert not info.readonly
|
|
|
|
|
|
|
|
|
|
|
|
def test_ctypes_from_buffer():
|
|
|
|
test_pystr = b"0123456789"
|
|
|
|
for pyarray in (test_pystr, bytearray(test_pystr)):
|
|
|
|
pyinfo = m.get_buffer_info(pyarray)
|
|
|
|
|
|
|
|
if pyinfo.readonly:
|
|
|
|
cbytes = (ctypes.c_char * len(pyarray)).from_buffer_copy(pyarray)
|
|
|
|
cinfo = m.get_buffer_info(cbytes)
|
|
|
|
else:
|
|
|
|
cbytes = (ctypes.c_char * len(pyarray)).from_buffer(pyarray)
|
|
|
|
cinfo = m.get_buffer_info(cbytes)
|
|
|
|
|
|
|
|
assert cinfo.size == pyinfo.size
|
|
|
|
assert cinfo.ndim == pyinfo.ndim
|
|
|
|
assert cinfo.shape == pyinfo.shape
|
|
|
|
assert cinfo.strides == pyinfo.strides
|
|
|
|
assert not cinfo.readonly
|
2023-09-12 19:47:39 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_buffer_docstring():
|
|
|
|
assert (
|
|
|
|
m.get_buffer_info.__doc__.strip()
|
|
|
|
== "get_buffer_info(arg0: Buffer) -> pybind11_tests.buffers.buffer_info"
|
|
|
|
)
|
2024-09-02 16:01:59 +00:00
|
|
|
|
|
|
|
|
|
|
|
def test_buffer_exception():
|
|
|
|
with pytest.raises(BufferError, match="Error getting buffer") as excinfo:
|
|
|
|
memoryview(m.BrokenMatrix(1, 1))
|
|
|
|
assert isinstance(excinfo.value.__cause__, RuntimeError)
|
|
|
|
assert "for context" in str(excinfo.value.__cause__)
|
Fix buffer protocol implementation (#5407)
* Fix buffer protocol implementation
According to the buffer protocol, `ndim` is a _required_ field [1], and
should always be set correctly. Additionally, `shape` should be set if
flags includes `PyBUF_ND` or higher [2]. The current implementation only
set those fields if flags was `PyBUF_STRIDES`.
[1] https://docs.python.org/3/c-api/buffer.html#request-independent-fields
[2] https://docs.python.org/3/c-api/buffer.html#shape-strides-suboffsets
* Apply suggestions from review
* Obey contiguity requests for buffer protocol
If a contiguous buffer is requested, and the underlying buffer isn't,
then that should raise. This matches NumPy behaviour if you do something
like:
```
struct.unpack_from('5d', np.arange(20.0)[::4]) # Raises for contiguity
```
Also, if a buffer is contiguous, then it can masquerade as a
less-complex buffer, either by dropping strides, or even pretending to
be 1D. This matches NumPy behaviour if you do something like:
```
a = np.full((3, 5), 30.0)
struct.unpack_from('15d', a) # --> Produces 1D tuple from 2D buffer.
```
* Handle review comments
* Test buffer protocol against NumPy
* Also check PyBUF_FORMAT results
2024-11-05 18:14:24 +00:00
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("type", ["pybind11", "numpy"])
|
|
|
|
def test_c_contiguous_to_pybuffer(type):
|
|
|
|
if type == "pybind11":
|
|
|
|
mat = m.Matrix(5, 4)
|
|
|
|
elif type == "numpy":
|
|
|
|
mat = np.empty((5, 4), dtype=np.float32)
|
|
|
|
else:
|
|
|
|
raise ValueError(f"Unknown parametrization {type}")
|
|
|
|
|
|
|
|
info = m.get_py_buffer(mat, m.PyBUF_SIMPLE)
|
|
|
|
assert info.format is None
|
|
|
|
assert info.itemsize == ctypes.sizeof(ctypes.c_float)
|
|
|
|
assert info.len == 5 * 4 * info.itemsize
|
|
|
|
assert info.ndim == 0 # See discussion on PR #5407.
|
|
|
|
assert info.shape is None
|
|
|
|
assert info.strides is None
|
|
|
|
assert info.suboffsets is None
|
|
|
|
assert not info.readonly
|
|
|
|
info = m.get_py_buffer(mat, m.PyBUF_SIMPLE | m.PyBUF_FORMAT)
|
|
|
|
assert info.format == "f"
|
|
|
|
assert info.itemsize == ctypes.sizeof(ctypes.c_float)
|
|
|
|
assert info.len == 5 * 4 * info.itemsize
|
|
|
|
assert info.ndim == 0 # See discussion on PR #5407.
|
|
|
|
assert info.shape is None
|
|
|
|
assert info.strides is None
|
|
|
|
assert info.suboffsets is None
|
|
|
|
assert not info.readonly
|
|
|
|
info = m.get_py_buffer(mat, m.PyBUF_ND)
|
|
|
|
assert info.itemsize == ctypes.sizeof(ctypes.c_float)
|
|
|
|
assert info.len == 5 * 4 * info.itemsize
|
|
|
|
assert info.ndim == 2
|
|
|
|
assert info.shape == [5, 4]
|
|
|
|
assert info.strides is None
|
|
|
|
assert info.suboffsets is None
|
|
|
|
assert not info.readonly
|
|
|
|
info = m.get_py_buffer(mat, m.PyBUF_STRIDES)
|
|
|
|
assert info.itemsize == ctypes.sizeof(ctypes.c_float)
|
|
|
|
assert info.len == 5 * 4 * info.itemsize
|
|
|
|
assert info.ndim == 2
|
|
|
|
assert info.shape == [5, 4]
|
|
|
|
assert info.strides == [4 * info.itemsize, info.itemsize]
|
|
|
|
assert info.suboffsets is None
|
|
|
|
assert not info.readonly
|
|
|
|
info = m.get_py_buffer(mat, m.PyBUF_INDIRECT)
|
|
|
|
assert info.itemsize == ctypes.sizeof(ctypes.c_float)
|
|
|
|
assert info.len == 5 * 4 * info.itemsize
|
|
|
|
assert info.ndim == 2
|
|
|
|
assert info.shape == [5, 4]
|
|
|
|
assert info.strides == [4 * info.itemsize, info.itemsize]
|
|
|
|
assert info.suboffsets is None # Should be filled in here, but we don't use it.
|
|
|
|
assert not info.readonly
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("type", ["pybind11", "numpy"])
|
|
|
|
def test_fortran_contiguous_to_pybuffer(type):
|
|
|
|
if type == "pybind11":
|
|
|
|
mat = m.FortranMatrix(5, 4)
|
|
|
|
elif type == "numpy":
|
|
|
|
mat = np.empty((5, 4), dtype=np.float32, order="F")
|
|
|
|
else:
|
|
|
|
raise ValueError(f"Unknown parametrization {type}")
|
|
|
|
|
|
|
|
# A Fortran-shaped buffer can only be accessed at PyBUF_STRIDES level or higher.
|
|
|
|
info = m.get_py_buffer(mat, m.PyBUF_STRIDES)
|
|
|
|
assert info.itemsize == ctypes.sizeof(ctypes.c_float)
|
|
|
|
assert info.len == 5 * 4 * info.itemsize
|
|
|
|
assert info.ndim == 2
|
|
|
|
assert info.shape == [5, 4]
|
|
|
|
assert info.strides == [info.itemsize, 5 * info.itemsize]
|
|
|
|
assert info.suboffsets is None
|
|
|
|
assert not info.readonly
|
|
|
|
info = m.get_py_buffer(mat, m.PyBUF_INDIRECT)
|
|
|
|
assert info.itemsize == ctypes.sizeof(ctypes.c_float)
|
|
|
|
assert info.len == 5 * 4 * info.itemsize
|
|
|
|
assert info.ndim == 2
|
|
|
|
assert info.shape == [5, 4]
|
|
|
|
assert info.strides == [info.itemsize, 5 * info.itemsize]
|
|
|
|
assert info.suboffsets is None # Should be filled in here, but we don't use it.
|
|
|
|
assert not info.readonly
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("type", ["pybind11", "numpy"])
|
|
|
|
def test_discontiguous_to_pybuffer(type):
|
|
|
|
if type == "pybind11":
|
|
|
|
mat = m.DiscontiguousMatrix(5, 4, 2, 3)
|
|
|
|
elif type == "numpy":
|
|
|
|
mat = np.empty((5 * 2, 4 * 3), dtype=np.float32)[::2, ::3]
|
|
|
|
else:
|
|
|
|
raise ValueError(f"Unknown parametrization {type}")
|
|
|
|
|
|
|
|
info = m.get_py_buffer(mat, m.PyBUF_STRIDES)
|
|
|
|
assert info.itemsize == ctypes.sizeof(ctypes.c_float)
|
|
|
|
assert info.len == 5 * 4 * info.itemsize
|
|
|
|
assert info.ndim == 2
|
|
|
|
assert info.shape == [5, 4]
|
|
|
|
assert info.strides == [2 * 4 * 3 * info.itemsize, 3 * info.itemsize]
|
|
|
|
assert info.suboffsets is None
|
|
|
|
assert not info.readonly
|
|
|
|
|
|
|
|
|
|
|
|
@pytest.mark.parametrize("type", ["pybind11", "numpy"])
|
|
|
|
def test_to_pybuffer_contiguity(type):
|
|
|
|
def check_strides(mat):
|
|
|
|
# The full block is memset to 0, so fill it with non-zero in real spots.
|
|
|
|
expected = np.arange(1, 5 * 4 + 1).reshape((5, 4))
|
|
|
|
for i in range(5):
|
|
|
|
for j in range(4):
|
|
|
|
mat[i, j] = expected[i, j]
|
|
|
|
# If all strides are correct, the exposed buffer should match the input.
|
|
|
|
np.testing.assert_array_equal(np.array(mat), expected)
|
|
|
|
|
|
|
|
if type == "pybind11":
|
|
|
|
cmat = m.Matrix(5, 4) # C contiguous.
|
|
|
|
fmat = m.FortranMatrix(5, 4) # Fortran contiguous.
|
|
|
|
dmat = m.DiscontiguousMatrix(5, 4, 2, 3) # Not contiguous.
|
|
|
|
expected_exception = BufferError
|
|
|
|
elif type == "numpy":
|
|
|
|
cmat = np.empty((5, 4), dtype=np.float32) # C contiguous.
|
|
|
|
fmat = np.empty((5, 4), dtype=np.float32, order="F") # Fortran contiguous.
|
|
|
|
dmat = np.empty((5 * 2, 4 * 3), dtype=np.float32)[::2, ::3] # Not contiguous.
|
|
|
|
# NumPy incorrectly raises ValueError; when the minimum NumPy requirement is
|
|
|
|
# above the version that fixes https://github.com/numpy/numpy/issues/3634 then
|
|
|
|
# BufferError can be used everywhere.
|
|
|
|
expected_exception = (BufferError, ValueError)
|
|
|
|
else:
|
|
|
|
raise ValueError(f"Unknown parametrization {type}")
|
|
|
|
|
|
|
|
check_strides(cmat)
|
|
|
|
# Should work in C-contiguous mode, but not Fortran order.
|
|
|
|
m.get_py_buffer(cmat, m.PyBUF_C_CONTIGUOUS)
|
|
|
|
m.get_py_buffer(cmat, m.PyBUF_ANY_CONTIGUOUS)
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(cmat, m.PyBUF_F_CONTIGUOUS)
|
|
|
|
|
|
|
|
check_strides(fmat)
|
|
|
|
# These flags imply C-contiguity, so won't work.
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(fmat, m.PyBUF_SIMPLE)
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(fmat, m.PyBUF_ND)
|
|
|
|
# Should work in Fortran-contiguous mode, but not C order.
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(fmat, m.PyBUF_C_CONTIGUOUS)
|
|
|
|
m.get_py_buffer(fmat, m.PyBUF_ANY_CONTIGUOUS)
|
|
|
|
m.get_py_buffer(fmat, m.PyBUF_F_CONTIGUOUS)
|
|
|
|
|
|
|
|
check_strides(dmat)
|
|
|
|
# Should never work.
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(dmat, m.PyBUF_SIMPLE)
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(dmat, m.PyBUF_ND)
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(dmat, m.PyBUF_C_CONTIGUOUS)
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(dmat, m.PyBUF_ANY_CONTIGUOUS)
|
|
|
|
with pytest.raises(expected_exception):
|
|
|
|
m.get_py_buffer(dmat, m.PyBUF_F_CONTIGUOUS)
|