diff --git a/tests/test_class_sh_basic.cpp b/tests/test_class_sh_basic.cpp index ef08f7e0e..c1cacccf9 100644 --- a/tests/test_class_sh_basic.cpp +++ b/tests/test_class_sh_basic.cpp @@ -40,14 +40,14 @@ std::unique_ptr rtrn_uqcp_atyp() { return std::unique_ptr obj) { return "pass_uqmp:" + obj->mtxt; } std::string pass_uqcp_atyp(std::unique_ptr obj) { return "pass_uqcp:" + obj->mtxt; } -struct uqmd : std::default_delete {}; -struct uqcd : std::default_delete {}; +struct sddm : std::default_delete {}; +struct sddc : std::default_delete {}; -std::unique_ptr rtrn_uqmp_del_atyp() { return std::unique_ptr(new atyp{"rtrn_uqmp_del"}); } -std::unique_ptr rtrn_uqcp_del_atyp() { return std::unique_ptr(new atyp{"rtrn_uqcp_del"}); } +std::unique_ptr rtrn_udmp_atyp() { return std::unique_ptr(new atyp{"rtrn_udmp"}); } +std::unique_ptr rtrn_udcp_atyp() { return std::unique_ptr(new atyp{"rtrn_udcp"}); } -std::string pass_uqmp_del_atyp(std::unique_ptr obj) { return "pass_uqmp_del:" + obj->mtxt; } -std::string pass_uqcp_del_atyp(std::unique_ptr obj) { return "pass_uqcp_del:" + obj->mtxt; } +std::string pass_udmp_atyp(std::unique_ptr obj) { return "pass_udmp:" + obj->mtxt; } +std::string pass_udcp_atyp(std::unique_ptr obj) { return "pass_udcp:" + obj->mtxt; } // clang-format on @@ -98,11 +98,11 @@ TEST_SUBMODULE(class_sh_basic, m) { m.def("pass_uqmp_atyp", pass_uqmp_atyp); m.def("pass_uqcp_atyp", pass_uqcp_atyp); - m.def("rtrn_uqmp_del_atyp", rtrn_uqmp_del_atyp); - m.def("rtrn_uqcp_del_atyp", rtrn_uqcp_del_atyp); + m.def("rtrn_udmp_atyp", rtrn_udmp_atyp); + m.def("rtrn_udcp_atyp", rtrn_udcp_atyp); - m.def("pass_uqmp_del_atyp", pass_uqmp_del_atyp); - m.def("pass_uqcp_del_atyp", pass_uqcp_del_atyp); + m.def("pass_udmp_atyp", pass_udmp_atyp); + m.def("pass_udcp_atyp", pass_udcp_atyp); // Helpers for testing. // These require selected functions above to work first, as indicated: diff --git a/tests/test_class_sh_basic.py b/tests/test_class_sh_basic.py index 6383a408c..1cc9264d6 100644 --- a/tests/test_class_sh_basic.py +++ b/tests/test_class_sh_basic.py @@ -52,24 +52,26 @@ def test_load_unique_ptr(): def test_cast_unique_ptr_with_deleter(): - assert m.get_mtxt(m.rtrn_uqmp_del_atyp()) == "rtrn_uqmp_del" - assert m.get_mtxt(m.rtrn_uqcp_del_atyp()) == "rtrn_uqcp_del" + assert m.get_mtxt(m.rtrn_udmp_atyp()) == "rtrn_udmp" + assert m.get_mtxt(m.rtrn_udcp_atyp()) == "rtrn_udcp" def test_load_unique_ptr_with_deleter(): - assert m.pass_uqmp_del_atyp(m.rtrn_uqmp_del_atyp()) == "pass_uqmp_del:rtrn_uqmp_del" - assert m.pass_uqcp_del_atyp(m.rtrn_uqcp_del_atyp()) == "pass_uqcp_del:rtrn_uqcp_del" + assert m.pass_udmp_atyp(m.rtrn_udmp_atyp()) == "pass_udmp:rtrn_udmp" + assert m.pass_udcp_atyp(m.rtrn_udcp_atyp()) == "pass_udcp:rtrn_udcp" @pytest.mark.parametrize( - "pass_atyp, argm, rtrn", + "rtrn_atyp, pass_atyp, rtrn", [ - (m.pass_uqmp_atyp, "Uqmp", "pass_uqmp:Uqmp"), - (m.pass_uqcp_atyp, "Uqcp", "pass_uqcp:Uqcp"), + (m.rtrn_uqmp_atyp, m.pass_uqmp_atyp, "pass_uqmp:rtrn_uqmp"), + (m.rtrn_uqcp_atyp, m.pass_uqcp_atyp, "pass_uqcp:rtrn_uqcp"), + (m.rtrn_udmp_atyp, m.pass_udmp_atyp, "pass_udmp:rtrn_udmp"), + (m.rtrn_udcp_atyp, m.pass_udcp_atyp, "pass_udcp:rtrn_udcp"), ], ) -def test_pass_unique_ptr_disowns(pass_atyp, argm, rtrn): - obj = m.atyp(argm) +def test_pass_unique_ptr_disowns(rtrn_atyp, pass_atyp, rtrn): + obj = rtrn_atyp() assert pass_atyp(obj) == rtrn with pytest.raises(RuntimeError) as exc_info: m.pass_uqmp_atyp(obj) diff --git a/tests/test_class_sh_factory_constructors.cpp b/tests/test_class_sh_factory_constructors.cpp new file mode 100644 index 000000000..a820b4268 --- /dev/null +++ b/tests/test_class_sh_factory_constructors.cpp @@ -0,0 +1,129 @@ +#include "pybind11_tests.h" + +#include + +#include +#include + +namespace pybind11_tests { +namespace test_class_sh_factory_constructors { + +template // Using int as a trick to easily generate a series of types. +struct atyp { // Short for "any type". + std::string mtxt; +}; + +template +std::string get_mtxt(const T &obj) { + return obj.mtxt; +} + +using atyp_valu = atyp<0x0>; +using atyp_rref = atyp<0x1>; +using atyp_cref = atyp<0x2>; +using atyp_mref = atyp<0x3>; +using atyp_cptr = atyp<0x4>; +using atyp_mptr = atyp<0x5>; +using atyp_shmp = atyp<0x6>; +using atyp_shcp = atyp<0x7>; +using atyp_uqmp = atyp<0x8>; +using atyp_uqcp = atyp<0x9>; +using atyp_udmp = atyp<0xA>; +using atyp_udcp = atyp<0xB>; + +// clang-format off + +atyp_valu rtrn_valu() { atyp_valu obj{"Valu"}; return obj; } +atyp_rref&& rtrn_rref() { static atyp_rref obj; obj.mtxt = "Rref"; return std::move(obj); } +atyp_cref const& rtrn_cref() { static atyp_cref obj; obj.mtxt = "Cref"; return obj; } +atyp_mref& rtrn_mref() { static atyp_mref obj; obj.mtxt = "Mref"; return obj; } +atyp_cptr const* rtrn_cptr() { return new atyp_cptr{"Cptr"}; } +atyp_mptr* rtrn_mptr() { return new atyp_mptr{"Mptr"}; } + +std::shared_ptr rtrn_shmp() { return std::shared_ptr(new atyp_shmp{"Shmp"}); } +std::shared_ptr rtrn_shcp() { return std::shared_ptr(new atyp_shcp{"Shcp"}); } + +std::unique_ptr rtrn_uqmp() { return std::unique_ptr(new atyp_uqmp{"Uqmp"}); } +std::unique_ptr rtrn_uqcp() { return std::unique_ptr(new atyp_uqcp{"Uqcp"}); } + +struct sddm : std::default_delete {}; +struct sddc : std::default_delete {}; + +std::unique_ptr rtrn_udmp() { return std::unique_ptr(new atyp_udmp{"Udmp"}); } +std::unique_ptr rtrn_udcp() { return std::unique_ptr(new atyp_udcp{"Udcp"}); } + +// clang-format on + +} // namespace test_class_sh_factory_constructors +} // namespace pybind11_tests + +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_valu) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_rref) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_cref) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_mref) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_cptr) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_mptr) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_shmp) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_shcp) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_uqmp) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_uqcp) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_udmp) +// PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_factory_constructors::atyp_udcp) + +TEST_SUBMODULE(class_sh_factory_constructors, m) { + using namespace pybind11_tests::test_class_sh_factory_constructors; + + py::class_(m, "atyp_valu") + .def(py::init(&rtrn_valu)) + .def("get_mtxt", get_mtxt); + + py::class_(m, "atyp_rref") + .def(py::init(&rtrn_rref)) + .def("get_mtxt", get_mtxt); + + py::class_(m, "atyp_cref") + // ... must return a compatible ... + // .def(py::init(&rtrn_cref)) + .def("get_mtxt", get_mtxt); + + py::class_(m, "atyp_mref") + // ... must return a compatible ... + // .def(py::init(&rtrn_mref)) + .def("get_mtxt", get_mtxt); + + py::class_(m, "atyp_cptr") + // ... must return a compatible ... + // .def(py::init(&rtrn_cptr)) + .def("get_mtxt", get_mtxt); + + py::class_(m, "atyp_mptr") + .def(py::init(&rtrn_mptr)) + .def("get_mtxt", get_mtxt); + + py::class_>(m, "atyp_shmp") + .def(py::init(&rtrn_shmp)) + .def("get_mtxt", get_mtxt); + + py::class_>(m, "atyp_shcp") + // ... must return a compatible ... + // .def(py::init(&rtrn_shcp)) + .def("get_mtxt", get_mtxt); + + py::class_(m, "atyp_uqmp") + .def(py::init(&rtrn_uqmp)) + .def("get_mtxt", get_mtxt); + + py::class_(m, "atyp_uqcp") + // ... cannot pass object of non-trivial type ... + // .def(py::init(&rtrn_uqcp)) + .def("get_mtxt", get_mtxt); + + py::class_>(m, "atyp_udmp") + .def(py::init(&rtrn_udmp)) + .def("get_mtxt", get_mtxt); + + py::class_>(m, "atyp_udcp") + // ... must return a compatible ... + // .def(py::init(&rtrn_udcp)) + .def("get_mtxt", get_mtxt); +} diff --git a/tests/test_class_sh_factory_constructors.py b/tests/test_class_sh_factory_constructors.py new file mode 100644 index 000000000..c28db561e --- /dev/null +++ b/tests/test_class_sh_factory_constructors.py @@ -0,0 +1,18 @@ +# -*- coding: utf-8 -*- + +from pybind11_tests import class_sh_factory_constructors as m + + +def test_atyp_factories(): + assert m.atyp_valu().get_mtxt() == "Valu" + assert m.atyp_rref().get_mtxt() == "Rref" + # sert m.atyp_cref().get_mtxt() == "Cref" + # sert m.atyp_mref().get_mtxt() == "Mref" + # sert m.atyp_cptr().get_mtxt() == "Cptr" + assert m.atyp_mptr().get_mtxt() == "Mptr" + assert m.atyp_shmp().get_mtxt() == "Shmp" + # sert m.atyp_shcp().get_mtxt() == "Shcp" + assert m.atyp_uqmp().get_mtxt() == "Uqmp" + # sert m.atyp_uqcp().get_mtxt() == "Uqcp" + assert m.atyp_udmp().get_mtxt() == "Udmp" + # sert m.atyp_udcp().get_mtxt() == "Udcp"