Skip to content

Commit

Permalink
Adding test_unique_ptr_member (for desired PyCLIF behavior).
Browse files Browse the repository at this point in the history
See also:

* pybind#2046
* pybind#2583

test_unique_ptr_member builds and runs successfully.
Several other unit tests fail.
  • Loading branch information
Ralf W. Grosse-Kunstleve committed Nov 18, 2020
1 parent 9f04c67 commit 6432bc5
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 0 deletions.
51 changes: 51 additions & 0 deletions tests/test_unique_ptr_member.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
#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")
.def(py::init<std::unique_ptr<pointee>>(), py::arg("ptr"))
;
}

} // namespace unique_ptr_member
} // namespace pybind11_tests
18 changes: 18 additions & 0 deletions tests/test_unique_ptr_member.py
Original file line number Diff line number Diff line change
@@ -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(TypeError) as exc_info:
obj.get_int()
assert str(exc_info.value) == "Invalid object instance"

0 comments on commit 6432bc5

Please sign in to comment.