From 1ec8f6d93ea150d79cfea6515ffe02f6d78753b2 Mon Sep 17 00:00:00 2001 From: tynn Date: Sat, 1 Jul 2017 20:33:45 +0200 Subject: TST: Add tests for numpy.ctypeslib.as_array --- numpy/tests/test_ctypeslib.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'numpy/tests') diff --git a/numpy/tests/test_ctypeslib.py b/numpy/tests/test_ctypeslib.py index 0f0d6dbc4..508a348c1 100644 --- a/numpy/tests/test_ctypeslib.py +++ b/numpy/tests/test_ctypeslib.py @@ -4,9 +4,9 @@ import sys import pytest import numpy as np -from numpy.ctypeslib import ndpointer, load_library +from numpy.ctypeslib import ndpointer, load_library, as_array from numpy.distutils.misc_util import get_shared_lib_extension -from numpy.testing import assert_, assert_raises +from numpy.testing import assert_, assert_array_equal, assert_raises try: cdll = None @@ -113,3 +113,25 @@ class TestNdpointer(object): a1 = ndpointer(dtype=np.float64) a2 = ndpointer(dtype=np.float64) assert_(a1 == a2) + +class TestAsArray(object): + @pytest.mark.skipif(not _HAS_CTYPE, + reason="ctypes not available on this python installation") + def test_array(self): + from ctypes import c_int + at = c_int * 2 + a = as_array(at(1, 2)) + assert_(a.shape == (2,)) + assert_array_equal(a, np.array([1, 2])) + a = as_array((at * 3)(at(1, 2), at(3, 4), at(5, 6))) + assert_(a.shape == (3, 2)) + assert_array_equal(a, np.array([[1, 2], [3, 4], [5, 6]])) + + @pytest.mark.skipif(not _HAS_CTYPE, + reason="ctypes not available on this python installation") + def test_pointer(self): + from ctypes import c_int, cast, POINTER + p = cast((c_int * 10)(*range(10)), POINTER(c_int)) + a = as_array(p, (10,)) + assert_(a.shape == (10,)) + assert_array_equal(a, np.array(range(10))) -- cgit v1.2.1 From 58e40ce3f270a84faa45ff29bcbce5dfea2a0e74 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Tue, 24 Apr 2018 21:48:53 -0700 Subject: MAINT: Use assert_equal --- numpy/tests/test_ctypeslib.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'numpy/tests') diff --git a/numpy/tests/test_ctypeslib.py b/numpy/tests/test_ctypeslib.py index 508a348c1..725d868d7 100644 --- a/numpy/tests/test_ctypeslib.py +++ b/numpy/tests/test_ctypeslib.py @@ -6,7 +6,7 @@ import pytest import numpy as np from numpy.ctypeslib import ndpointer, load_library, as_array from numpy.distutils.misc_util import get_shared_lib_extension -from numpy.testing import assert_, assert_array_equal, assert_raises +from numpy.testing import assert_, assert_array_equal, assert_raises, assert_equal try: cdll = None @@ -121,10 +121,10 @@ class TestAsArray(object): from ctypes import c_int at = c_int * 2 a = as_array(at(1, 2)) - assert_(a.shape == (2,)) + assert_equal(a.shape, (2,)) assert_array_equal(a, np.array([1, 2])) a = as_array((at * 3)(at(1, 2), at(3, 4), at(5, 6))) - assert_(a.shape == (3, 2)) + assert_equal(a.shape, (3, 2)) assert_array_equal(a, np.array([[1, 2], [3, 4], [5, 6]])) @pytest.mark.skipif(not _HAS_CTYPE, @@ -133,5 +133,5 @@ class TestAsArray(object): from ctypes import c_int, cast, POINTER p = cast((c_int * 10)(*range(10)), POINTER(c_int)) a = as_array(p, (10,)) - assert_(a.shape == (10,)) + assert_equal(a.shape, (10,)) assert_array_equal(a, np.array(range(10))) -- cgit v1.2.1 From 4ec8930f0b60d7fff059d0f005ed2a0efbf41fb7 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Tue, 24 Apr 2018 21:51:23 -0700 Subject: MAINT: Pull repeated decorators up to their containing class --- numpy/tests/test_ctypeslib.py | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) (limited to 'numpy/tests') diff --git a/numpy/tests/test_ctypeslib.py b/numpy/tests/test_ctypeslib.py index 725d868d7..fd4336fad 100644 --- a/numpy/tests/test_ctypeslib.py +++ b/numpy/tests/test_ctypeslib.py @@ -21,11 +21,12 @@ try: except ImportError: _HAS_CTYPE = False + +@pytest.mark.skipif(not _HAS_CTYPE, + reason="ctypes not available in this python") +@pytest.mark.skipif(sys.platform == 'cygwin', + reason="Known to fail on cygwin") class TestLoadLibrary(object): - @pytest.mark.skipif(not _HAS_CTYPE, - reason="ctypes not available in this python") - @pytest.mark.skipif(sys.platform == 'cygwin', - reason="Known to fail on cygwin") def test_basic(self): try: # Should succeed @@ -35,10 +36,6 @@ class TestLoadLibrary(object): " (import error was: %s)" % str(e)) print(msg) - @pytest.mark.skipif(not _HAS_CTYPE, - reason="ctypes not available in this python") - @pytest.mark.skipif(sys.platform == 'cygwin', - reason="Known to fail on cygwin") def test_basic2(self): # Regression for #801: load_library with a full library name # (including extension) does not work. @@ -54,6 +51,7 @@ class TestLoadLibrary(object): " (import error was: %s)" % str(e)) print(msg) + class TestNdpointer(object): def test_dtype(self): dt = np.intc @@ -114,9 +112,10 @@ class TestNdpointer(object): a2 = ndpointer(dtype=np.float64) assert_(a1 == a2) + +@pytest.mark.skipif(not _HAS_CTYPE, + reason="ctypes not available on this python installation") class TestAsArray(object): - @pytest.mark.skipif(not _HAS_CTYPE, - reason="ctypes not available on this python installation") def test_array(self): from ctypes import c_int at = c_int * 2 @@ -127,8 +126,6 @@ class TestAsArray(object): assert_equal(a.shape, (3, 2)) assert_array_equal(a, np.array([[1, 2], [3, 4], [5, 6]])) - @pytest.mark.skipif(not _HAS_CTYPE, - reason="ctypes not available on this python installation") def test_pointer(self): from ctypes import c_int, cast, POINTER p = cast((c_int * 10)(*range(10)), POINTER(c_int)) -- cgit v1.2.1 From 8a8be508d2b2ce719de94209286293973c278b46 Mon Sep 17 00:00:00 2001 From: Eric Wieser Date: Tue, 24 Apr 2018 21:34:40 -0700 Subject: BUG: Remove fragile use of __array_interface__ in ctypeslib.as_array Everything behaves a lot better if we let the array constructor handle it, which will use the ctypes PEP3118 support. Bugs this fixes: * Stale state being attached to pointer objects (fixes gh-2671, closes gh-6214) * Weird failure modes on structured arrays (fixes-10978) * A regression in gh-10882 (fixes gh-10968) --- numpy/tests/test_ctypeslib.py | 48 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 43 insertions(+), 5 deletions(-) (limited to 'numpy/tests') diff --git a/numpy/tests/test_ctypeslib.py b/numpy/tests/test_ctypeslib.py index fd4336fad..75ce9c8ca 100644 --- a/numpy/tests/test_ctypeslib.py +++ b/numpy/tests/test_ctypeslib.py @@ -118,17 +118,55 @@ class TestNdpointer(object): class TestAsArray(object): def test_array(self): from ctypes import c_int - at = c_int * 2 - a = as_array(at(1, 2)) + + pair_t = c_int * 2 + a = as_array(pair_t(1, 2)) assert_equal(a.shape, (2,)) assert_array_equal(a, np.array([1, 2])) - a = as_array((at * 3)(at(1, 2), at(3, 4), at(5, 6))) + a = as_array((pair_t * 3)(pair_t(1, 2), pair_t(3, 4), pair_t(5, 6))) assert_equal(a.shape, (3, 2)) assert_array_equal(a, np.array([[1, 2], [3, 4], [5, 6]])) def test_pointer(self): from ctypes import c_int, cast, POINTER + p = cast((c_int * 10)(*range(10)), POINTER(c_int)) - a = as_array(p, (10,)) + + a = as_array(p, shape=(10,)) assert_equal(a.shape, (10,)) - assert_array_equal(a, np.array(range(10))) + assert_array_equal(a, np.arange(10)) + + a = as_array(p, shape=(2, 5)) + assert_equal(a.shape, (2, 5)) + assert_array_equal(a, np.arange(10).reshape((2, 5))) + + # shape argument is required + assert_raises(TypeError, as_array, p) + + def test_struct_array_pointer(self): + from ctypes import c_int16, Structure, pointer + + class Struct(Structure): + _fields_ = [('a', c_int16)] + + Struct3 = 3 * Struct + + c_array = (2 * Struct3)( + Struct3(Struct(a=1), Struct(a=2), Struct(a=3)), + Struct3(Struct(a=4), Struct(a=5), Struct(a=6)) + ) + + expected = np.array([ + [(1,), (2,), (3,)], + [(4,), (5,), (6,)], + ], dtype=[('a', np.int16)]) + + def check(x): + assert_equal(x.dtype, expected.dtype) + assert_equal(x, expected) + + # all of these should be equivalent + check(as_array(c_array)) + check(as_array(pointer(c_array), shape=())) + check(as_array(pointer(c_array[0]), shape=(2,))) + check(as_array(pointer(c_array[0][0]), shape=(2, 3))) -- cgit v1.2.1