forked from pybind/pybind11
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Adding test_unique_ptr_member (for desired PyCLIF behavior).
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
Showing
2 changed files
with
69 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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" |