diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f88cc54ad..a6ac3a0d7 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -136,6 +136,7 @@ set(PYBIND11_TEST_FILES test_class_sh_unique_ptr_custom_deleter test_class_sh_unique_ptr_member test_class_sh_virtual_py_cpp_mix + test_classh_mock test_const_name test_constants_and_functions test_copy_move diff --git a/tests/test_classh_mock.cpp b/tests/test_classh_mock.cpp new file mode 100644 index 000000000..38e765fb0 --- /dev/null +++ b/tests/test_classh_mock.cpp @@ -0,0 +1,71 @@ +#include "pybind11_tests.h" + +// The main purpose of this test is to ensure the suggested BOILERPLATE code block below is +// correct. + +// Copy this block of code into your project. +// Replace FOOEXT with the name of your project. +// BOILERPLATE BEGIN +#ifdef FOOEXT_USING_PYBIND11_SMART_HOLDER +# include +#else +# include +PYBIND11_NAMESPACE_BEGIN(PYBIND11_NAMESPACE) +template +using classh = class_; +PYBIND11_NAMESPACE_END(PYBIND11_NAMESPACE) +# ifndef PYBIND11_SH_AVL +# define PYBIND11_SH_AVL(...) std::shared_ptr<__VA_ARGS__> // "Smart_Holder if AVaiLable" +# endif +# ifndef PYBIND11_SH_DEF +# define PYBIND11_SH_DEF(...) std::shared_ptr<__VA_ARGS__> // "Smart_Holder if DEFault" +# endif +# ifndef PYBIND11_SMART_HOLDER_TYPE_CASTERS +# define PYBIND11_SMART_HOLDER_TYPE_CASTERS(...) +# endif +# ifndef PYBIND11_TYPE_CASTER_BASE_HOLDER +# define PYBIND11_TYPE_CASTER_BASE_HOLDER(...) +# endif +#endif +// BOILERPLATE END + +namespace { +struct FooUc {}; +struct FooUp {}; +struct FooSa {}; +struct FooSc {}; +struct FooSp {}; +} // namespace + +PYBIND11_SMART_HOLDER_TYPE_CASTERS(FooUp) +PYBIND11_SMART_HOLDER_TYPE_CASTERS(FooSp) + +PYBIND11_TYPE_CASTER_BASE_HOLDER(FooSa, std::shared_ptr) + +TEST_SUBMODULE(classh_mock, m) { + // Please see README_smart_holder.rst, in particular section + // Classic / Conservative / Progressive cross-module compatibility + + // Uses std::unique_ptr as holder in Classic or Conservative mode, py::smart_holder in + // Progressive mode. + py::class_(m, "FooUc").def(py::init<>()); + + // Uses std::unique_ptr as holder in Classic mode, py::smart_holder in Conservative or + // Progressive mode. + py::classh(m, "FooUp").def(py::init<>()); + + // Always uses std::shared_ptr as holder. + py::class_>(m, "FooSa").def(py::init<>()); + + // Uses std::shared_ptr as holder in Classic or Conservative mode, py::smart_holder in + // Progressive mode. + py::class_(m, "FooSc").def(py::init<>()); + // -------------- std::shared_ptr -- same length by design, to not disturb the + // indentation of existing code. + + // Uses std::shared_ptr as holder in Classic mode, py::smart_holder in Conservative or + // Progressive mode. + py::class_(m, "FooSp").def(py::init<>()); + // -------------- std::shared_ptr -- same length by design, to not disturb the + // indentation of existing code. +} diff --git a/tests/test_classh_mock.py b/tests/test_classh_mock.py new file mode 100644 index 000000000..b05cd0c57 --- /dev/null +++ b/tests/test_classh_mock.py @@ -0,0 +1,13 @@ +from __future__ import annotations + +from pybind11_tests import classh_mock as m + + +def test_foobar(): + # Not really testing anything in particular. The main purpose of this test is to ensure the + # suggested BOILERPLATE code block in test_classh_mock.cpp is correct. + assert m.FooUc() + assert m.FooUp() + assert m.FooSa() + assert m.FooSc() + assert m.FooSp()