[smart_holder] Unique ptr deleter roundtrip tests and fix (#4921)

* Roundtrip through unique pointer with custom deleter.

Currently failing.

* Ensure the custom deleter is copied back to the unique pointer.

Feels like there's still a gap around the raw pointer flavour, but this at least
makes the unit test of the previous commit succeed.

* Add deleter roundtrip for const atyp.

Currently failing, custom deleter is lost.

* Fix storing deleter for const unique ptr.

Unit test from the previous commit passes.

* Remove SFINEA deleter assignment.

At the construction of the smart holder, it is either a del_fun, or a default constructed deleter, so this complexity is unnecessary.

* Clang format.

* Fixes for ci.

Clang 3.6 requires the extra constructors in the custom_deleter.

* fix(smart_holder): Loosen requirement on deleter to be default constructible.

And some other PR feedback.

* fix(smart_holder): Custom deleter in unit tests traces constructions.

* fix(smart_holder): Use pybind11_fail instead of assert.

* fix(smart_holder): Add unit tests for the default constructible deleter.

* fix(smart_holder): Use regex matching for deleter constructors in unit tests.
This commit is contained in:
Ivor Wanders
2023-11-08 01:58:24 -05:00
committed by GitHub
parent e02fe001cd
commit e5ce9631b1
3 changed files with 132 additions and 3 deletions

View File

@@ -65,6 +65,35 @@ def test_load_with_rtrn_f(pass_f, rtrn_f, expected):
assert pass_f(rtrn_f()) == expected
@pytest.mark.parametrize(
("pass_f", "rtrn_f", "regex_expected"),
[
(
m.pass_udmp_del,
m.rtrn_udmp_del,
"pass_udmp_del:rtrn_udmp_del,udmp_deleter(_MvCtorTo)*_MvCtorTo",
),
(
m.pass_udcp_del,
m.rtrn_udcp_del,
"pass_udcp_del:rtrn_udcp_del,udcp_deleter(_MvCtorTo)*_MvCtorTo",
),
(
m.pass_udmp_del_nd,
m.rtrn_udmp_del_nd,
"pass_udmp_del_nd:rtrn_udmp_del_nd,udmp_deleter_nd(_MvCtorTo)*_MvCtorTo",
),
(
m.pass_udcp_del_nd,
m.rtrn_udcp_del_nd,
"pass_udcp_del_nd:rtrn_udcp_del_nd,udcp_deleter_nd(_MvCtorTo)*_MvCtorTo",
),
],
)
def test_deleter_roundtrip(pass_f, rtrn_f, regex_expected):
assert re.match(regex_expected, pass_f(rtrn_f()))
@pytest.mark.parametrize(
("pass_f", "rtrn_f", "expected"),
[