aboutsummaryrefslogtreecommitdiff
path: root/libs/plugin_python/tests/python/test_shared_cpp_owner.py
diff options
context:
space:
mode:
Diffstat (limited to 'libs/plugin_python/tests/python/test_shared_cpp_owner.py')
-rw-r--r--libs/plugin_python/tests/python/test_shared_cpp_owner.py72
1 files changed, 72 insertions, 0 deletions
diff --git a/libs/plugin_python/tests/python/test_shared_cpp_owner.py b/libs/plugin_python/tests/python/test_shared_cpp_owner.py
new file mode 100644
index 0000000..0bcecf7
--- /dev/null
+++ b/libs/plugin_python/tests/python/test_shared_cpp_owner.py
@@ -0,0 +1,72 @@
+import mobase_tests.shared_cpp_owner as m
+
+
+class PyBase(m.Base):
+ def __init__(self, name: str, value: int):
+ super().__init__(name)
+ self.value = value
+
+ def fn(self):
+ return f"PyBase.fn({self.value})"
+
+
+def test_shared_cpp_owner_1():
+ # create from C++, owned by Python
+
+ # create from C++
+ p = m.create("tmp")
+ assert m.is_alive("tmp")
+
+ # should delete since it's not owner by C++
+ del p
+ assert not m.is_alive("tmp")
+
+
+def test_shared_cpp_owner_2():
+ # create from C++, owned by C++ (and Python)
+
+ # create from C++
+ p = m.create_and_store("tmp")
+ assert m.is_alive("tmp")
+
+ # should not delete since it's owned by both C++ and Python
+ del p
+ assert m.is_alive("tmp")
+
+ # clear from C++ should free it
+ m.clear()
+ assert not m.is_alive("tmp")
+
+
+def test_shared_cpp_owner_3():
+ # create from Python, owned by Python
+
+ p = PyBase("foo", 1)
+ assert m.is_alive("foo")
+ assert m.call_fn("foo") == "PyBase.fn(1)"
+
+ del p
+ assert not m.is_alive("foo")
+
+
+def test_shared_cpp_owner_4():
+ # create from Python, owned by C++
+
+ p = PyBase("foo", 2)
+ assert m.is_alive("foo")
+
+ # send to C++
+ m.store(p)
+ assert m.is_alive("foo")
+ assert m.call_fn("foo") == "PyBase.fn(2)"
+
+ # delete in Python, should still be alived
+ del p
+ assert m.is_alive("foo")
+
+ # should still be able to call fn()
+ assert m.call_fn("foo") == "PyBase.fn(2)"
+
+ # clear in C++, should kill Python
+ m.clear()
+ assert not m.is_alive("foo")