aboutsummaryrefslogtreecommitdiff
path: root/libs/plugin_python/tests/python/test_shared_cpp_owner.py
blob: 0bcecf75dd90d563a348370e34abae6c9067d543 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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")