From 4b975ed6eb7bcc2b4011bbf7ad2741af801ee80c Mon Sep 17 00:00:00 2001 From: Tomas Davidovic Date: Tue, 22 Jul 2025 00:43:22 +0200 Subject: [PATCH] Added tests for double get of a ref in C++ object --- tests/test_intrusive.cpp | 32 ++++++++++++++++++++++++++++++++ tests/test_intrusive.py | 15 +++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/tests/test_intrusive.cpp b/tests/test_intrusive.cpp index 654b6550..386e83b1 100644 --- a/tests/test_intrusive.cpp +++ b/tests/test_intrusive.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -29,6 +30,27 @@ class PyTest : Test { } }; + +class Inner : public nb::intrusive_base { +public: + std::string get_name() const { return "Inner"; } +}; + +class Outter : public nb::intrusive_base { +public: + Outter() + { + m_inner = new Inner; + } + + Inner& get_inner() { return *m_inner; } + Inner* get_inner_ptr() { return m_inner.get(); } + nb::ref get_inner_ref() { return m_inner; } +private: + nb::ref m_inner; +}; + + NB_MODULE(test_intrusive_ext, m) { nb::intrusive_init( [](PyObject *o) noexcept { @@ -63,4 +85,14 @@ NB_MODULE(test_intrusive_ext, m) { m.def("get_value_1", [](Test *o) { nb::ref x(o); return x->value(1); }); m.def("get_value_2", [](nb::ref x) { return x->value(2); }); m.def("get_value_3", [](const nb::ref &x) { return x->value(3); }); + + + nb::class_(m, "Inner") + .def("get_name", &Inner::get_name); + + nb::class_(m, "Outter") + .def(nb::init<>()) + .def("get_inner", &Outter::get_inner) + .def("get_inner_ptr", &Outter::get_inner_ptr) + .def("get_inner_ref", &Outter::get_inner_ref); } diff --git a/tests/test_intrusive.py b/tests/test_intrusive.py index ef62e25d..263c5847 100644 --- a/tests/test_intrusive.py +++ b/tests/test_intrusive.py @@ -56,3 +56,18 @@ def value(self, value): del o collect() assert t.stats() == (1, 1) + +def test05_inner_BREAKS(clean): + o = t.Outter() + assert o.get_inner().get_name() == "Inner" + assert o.get_inner().get_name() == "Inner" + +def test06_inner_ref(clean): + o = t.Outter() + assert o.get_inner_ref().get_name() == "Inner" + assert o.get_inner_ref().get_name() == "Inner" + +def test07_inner_ptr_BREAKS(clean): + o = t.Outter() + assert o.get_inner_ref().get_name() == "Inner" + assert o.get_inner_ref().get_name() == "Inner"