| 298 | // ("unresolved external symbol arrow_ARRAY_API referenced"). |
| 299 | #ifndef _WIN32 |
| 300 | Status TestPyBufferNumpyArray() { |
| 301 | npy_intp dims[1] = {10}; |
| 302 | |
| 303 | OwnedRef arr_ref(PyArray_SimpleNew(1, dims, NPY_FLOAT)); |
| 304 | PyObject* arr = arr_ref.obj(); |
| 305 | ASSERT_NE(arr, nullptr); |
| 306 | auto old_refcnt = Py_REFCNT(arr); |
| 307 | auto buf = std::move(PyBuffer::FromPyObject(arr)).ValueOrDie(); |
| 308 | |
| 309 | ASSERT_TRUE(buf->is_cpu()); |
| 310 | ASSERT_EQ(buf->data(), PyArray_DATA(reinterpret_cast<PyArrayObject*>(arr))); |
| 311 | ASSERT_TRUE(buf->is_mutable()); |
| 312 | ASSERT_EQ(buf->mutable_data(), buf->data()); |
| 313 | ASSERT_EQ(old_refcnt + 1, Py_REFCNT(arr)); |
| 314 | buf.reset(); |
| 315 | ASSERT_EQ(old_refcnt, Py_REFCNT(arr)); |
| 316 | |
| 317 | // Read-only |
| 318 | PyArray_CLEARFLAGS(reinterpret_cast<PyArrayObject*>(arr), NPY_ARRAY_WRITEABLE); |
| 319 | buf = std::move(PyBuffer::FromPyObject(arr)).ValueOrDie(); |
| 320 | ASSERT_TRUE(buf->is_cpu()); |
| 321 | ASSERT_EQ(buf->data(), PyArray_DATA(reinterpret_cast<PyArrayObject*>(arr))); |
| 322 | ASSERT_FALSE(buf->is_mutable()); |
| 323 | ASSERT_EQ(old_refcnt + 1, Py_REFCNT(arr)); |
| 324 | buf.reset(); |
| 325 | ASSERT_EQ(old_refcnt, Py_REFCNT(arr)); |
| 326 | |
| 327 | return Status::OK(); |
| 328 | } |
| 329 | |
| 330 | Status TestNumPyBufferNumpyArray() { |
| 331 | npy_intp dims[1] = {10}; |
nothing calls this directly
no test coverage detected