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:
Ralf W. Grosse-Kunstleve 2020-11-17 12:19:19 -08:00
parent c78dfb69f2
commit 0a92391128
2 changed files with 71 additions and 0 deletions

View 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

View 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 ")