mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-29 16:37:13 +00:00
Adding test_unique_ptr_member (for desired PyCLIF behavior).
See also: https://github.com/pybind/pybind11/issues/2583 Does not build with upstream master or https://github.com/pybind/pybind11/pull/2047, but builds with https://github.com/RobotLocomotion/pybind11 and almost runs: ``` Running tests in directory "/usr/local/google/home/rwgk/forked/EricCousineau-TRI/pybind11/tests": ================================================================================= test session starts ================================================================================= platform linux -- Python 3.8.5, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 rootdir: /usr/local/google/home/rwgk/forked/EricCousineau-TRI/pybind11/tests, inifile: pytest.ini collected 2 items test_unique_ptr_member.py .F [100%] ====================================================================================== FAILURES ======================================================================================= _____________________________________________________________________________ test_pointee_and_ptr_owner ______________________________________________________________________________ def test_pointee_and_ptr_owner(): obj = m.pointee() assert obj.get_int() == 213 m.ptr_owner(obj) with pytest.raises(ValueError) as exc_info: > obj.get_int() E Failed: DID NOT RAISE <class 'ValueError'> test_unique_ptr_member.py:17: Failed ============================================================================= 1 failed, 1 passed in 0.06s ============================================================================= ```
This commit is contained in:
parent
c78dfb69f2
commit
0a92391128
53
tests/test_unique_ptr_member.cpp
Normal file
53
tests/test_unique_ptr_member.cpp
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#include "pybind11_tests.h"
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
namespace pybind11_tests {
|
||||||
|
namespace unique_ptr_member {
|
||||||
|
|
||||||
|
class pointee { // NOT copyable.
|
||||||
|
public:
|
||||||
|
pointee() = default;
|
||||||
|
|
||||||
|
int get_int() const { return 213; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
pointee(const pointee &) = delete;
|
||||||
|
pointee(pointee &&) = delete;
|
||||||
|
pointee &operator=(const pointee &) = delete;
|
||||||
|
pointee &operator=(pointee &&) = delete;
|
||||||
|
};
|
||||||
|
|
||||||
|
class ptr_owner {
|
||||||
|
public:
|
||||||
|
explicit ptr_owner(std::unique_ptr<pointee> ptr) : ptr_(std::move(ptr)) {}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<pointee> ptr_;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Just to have a minimal example of a typical C++ pattern.
|
||||||
|
inline int cpp_pattern() {
|
||||||
|
auto obj = std::unique_ptr<pointee>(new pointee);
|
||||||
|
int result = (obj ? 10 : 0);
|
||||||
|
ptr_owner owner(std::move(obj));
|
||||||
|
result += (obj ? 1 : 0);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_SUBMODULE(unique_ptr_member, m) {
|
||||||
|
m.def("cpp_pattern", cpp_pattern);
|
||||||
|
|
||||||
|
py::class_<pointee>(m, "pointee")
|
||||||
|
.def(py::init<>())
|
||||||
|
.def("get_int", &pointee::get_int);
|
||||||
|
|
||||||
|
py::class_<ptr_owner>(m, "ptr_owner")
|
||||||
|
#ifdef FEAT_UNIQUE_PTR_ARG
|
||||||
|
.def(py::init<std::unique_ptr<pointee>>(), py::arg("ptr"))
|
||||||
|
#endif
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace unique_ptr_member
|
||||||
|
} // namespace pybind11_tests
|
18
tests/test_unique_ptr_member.py
Normal file
18
tests/test_unique_ptr_member.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from pybind11_tests import unique_ptr_member as m
|
||||||
|
|
||||||
|
|
||||||
|
def test_cpp_pattern():
|
||||||
|
res = m.cpp_pattern()
|
||||||
|
assert res == 10
|
||||||
|
|
||||||
|
|
||||||
|
def test_pointee_and_ptr_owner():
|
||||||
|
obj = m.pointee()
|
||||||
|
assert obj.get_int() == 213
|
||||||
|
m.ptr_owner(obj)
|
||||||
|
with pytest.raises(ValueError) as exc_info:
|
||||||
|
obj.get_int()
|
||||||
|
assert str(exc_info.value).startswith("Missing value for wrapped C++ type ")
|
Loading…
Reference in New Issue
Block a user