test_premature_delete.py 1 KB
Newer Older
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
# -*- coding: utf-8 -*-
import pytest

from pybind11_tests import premature_delete as m


def test_pointee_and_ptr_owner():
    m.to_cout("")
    obj = m.pointee()
    assert obj.get_int() == 213
    owner = m.ptr_owner(obj)
    with pytest.raises(RuntimeError) as exc_info:
        obj.get_int()
    assert str(exc_info.value) == "Invalid object instance"
    assert owner.is_owner()
    m.to_cout("before give up")
    if 1:  # Behavior is the same with 0 or 1 here.
        reclaimed = owner.give_up_ownership_via_unique_ptr()
    else:
        reclaimed = owner.give_up_ownership_via_shared_ptr()
    m.to_cout("after give up")
    assert not owner.is_owner()
    if 0:
        # This is desired.
        assert reclaimed.get_int() == 213
    else:
        # But obj is actually disowned.
        with pytest.raises(RuntimeError) as exc_info:
            obj.get_int()
        assert str(exc_info.value) == "Invalid object instance"
    m.to_cout("before del")
    del reclaimed
    m.to_cout("after del")
    m.to_cout("")