diff --git a/tests/test_class_sh_with_alias.cpp b/tests/test_class_sh_with_alias.cpp new file mode 100644 index 000000000..e62f8e763 --- /dev/null +++ b/tests/test_class_sh_with_alias.cpp @@ -0,0 +1,61 @@ +#include "pybind11_tests.h" + +#include + +#include + +namespace pybind11_tests { +namespace test_class_sh_with_alias { + +struct Abase { + int val = 0; + virtual ~Abase() = default; + Abase(int val_) : val{val_} {} + int Get() const { return val * 10 + 3; } + virtual int Add(int other_val) const = 0; + + // Some compilers complain about implicitly defined versions of some of the following: + Abase(const Abase &) = default; + Abase(Abase &&) = default; + Abase &operator=(const Abase &) = default; + Abase &operator=(Abase &&) = default; +}; + +struct AbaseAlias : Abase { + using Abase::Abase; + + int Add(int other_val) const override { + PYBIND11_OVERRIDE_PURE(int, /* Return type */ + Abase, /* Parent class */ + Add, /* Name of function in C++ (must match Python name) */ + other_val); + } +}; + +int AddInCppRawPtr(const Abase *obj, int other_val) { return obj->Add(other_val) * 10 + 7; } + +int AddInCppSharedPtr(std::shared_ptr obj, int other_val) { + return obj->Add(other_val) * 100 + 11; +} + +int AddInCppUniquePtr(std::unique_ptr obj, int other_val) { + return obj->Add(other_val) * 100 + 13; +} + +} // namespace test_class_sh_with_alias +} // namespace pybind11_tests + +PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_with_alias::Abase) + +TEST_SUBMODULE(class_sh_with_alias, m) { + using namespace pybind11_tests::test_class_sh_with_alias; + + py::classh(m, "Abase") + .def(py::init(), py::arg("val")) + .def("Get", &Abase::Get) + .def("Add", &Abase::Add, py::arg("other_val")); + + m.def("AddInCppRawPtr", AddInCppRawPtr, py::arg("obj"), py::arg("other_val")); + m.def("AddInCppSharedPtr", AddInCppSharedPtr, py::arg("obj"), py::arg("other_val")); + m.def("AddInCppUniquePtr", AddInCppUniquePtr, py::arg("obj"), py::arg("other_val")); +} diff --git a/tests/test_class_sh_with_alias.py b/tests/test_class_sh_with_alias.py new file mode 100644 index 000000000..a8b10b849 --- /dev/null +++ b/tests/test_class_sh_with_alias.py @@ -0,0 +1,31 @@ +# -*- coding: utf-8 -*- + +from pybind11_tests import class_sh_with_alias as m + + +class PyDrvd(m.Abase): + def __init__(self, val): + super(PyDrvd, self).__init__(val) + + def Add(self, other_val): + return self.Get() * 100 + other_val + + +def test_drvd_add(): + drvd = PyDrvd(74) + assert drvd.Add(38) == (74 * 10 + 3) * 100 + 38 + + +def test_add_in_cpp_raw_ptr(): + drvd = PyDrvd(52) + assert m.AddInCppRawPtr(drvd, 27) == ((52 * 10 + 3) * 100 + 27) * 10 + 7 + + +def test_add_in_cpp_shared_ptr(): + drvd = PyDrvd(36) + assert m.AddInCppSharedPtr(drvd, 56) == ((36 * 10 + 3) * 100 + 56) * 100 + 11 + + +def test_add_in_cpp_unique_ptr(): + drvd = PyDrvd(38) + assert m.AddInCppUniquePtr(drvd, 29) == ((38 * 10 + 3) * 100 + 29) * 100 + 13