github.com/kaydxh/golang@v0.0.131/pkg/gocv/cgo/third_path/pybind11/tests/test_call_policies.py (about) 1 import pytest 2 3 import env # noqa: F401 4 from pybind11_tests import ConstructorStats 5 from pybind11_tests import call_policies as m 6 7 8 @pytest.mark.xfail("env.PYPY", reason="sometimes comes out 1 off on PyPy", strict=False) 9 def test_keep_alive_argument(capture): 10 n_inst = ConstructorStats.detail_reg_inst() 11 with capture: 12 p = m.Parent() 13 assert capture == "Allocating parent." 14 with capture: 15 p.addChild(m.Child()) 16 assert ConstructorStats.detail_reg_inst() == n_inst + 1 17 assert ( 18 capture 19 == """ 20 Allocating child. 21 Releasing child. 22 """ 23 ) 24 with capture: 25 del p 26 assert ConstructorStats.detail_reg_inst() == n_inst 27 assert capture == "Releasing parent." 28 29 with capture: 30 p = m.Parent() 31 assert capture == "Allocating parent." 32 with capture: 33 p.addChildKeepAlive(m.Child()) 34 assert ConstructorStats.detail_reg_inst() == n_inst + 2 35 assert capture == "Allocating child." 36 with capture: 37 del p 38 assert ConstructorStats.detail_reg_inst() == n_inst 39 assert ( 40 capture 41 == """ 42 Releasing parent. 43 Releasing child. 44 """ 45 ) 46 47 p = m.Parent() 48 c = m.Child() 49 assert ConstructorStats.detail_reg_inst() == n_inst + 2 50 m.free_function(p, c) 51 del c 52 assert ConstructorStats.detail_reg_inst() == n_inst + 2 53 del p 54 assert ConstructorStats.detail_reg_inst() == n_inst 55 56 with pytest.raises(RuntimeError) as excinfo: 57 m.invalid_arg_index() 58 assert str(excinfo.value) == "Could not activate keep_alive!" 59 60 61 def test_keep_alive_return_value(capture): 62 n_inst = ConstructorStats.detail_reg_inst() 63 with capture: 64 p = m.Parent() 65 assert capture == "Allocating parent." 66 with capture: 67 p.returnChild() 68 assert ConstructorStats.detail_reg_inst() == n_inst + 1 69 assert ( 70 capture 71 == """ 72 Allocating child. 73 Releasing child. 74 """ 75 ) 76 with capture: 77 del p 78 assert ConstructorStats.detail_reg_inst() == n_inst 79 assert capture == "Releasing parent." 80 81 with capture: 82 p = m.Parent() 83 assert capture == "Allocating parent." 84 with capture: 85 p.returnChildKeepAlive() 86 assert ConstructorStats.detail_reg_inst() == n_inst + 2 87 assert capture == "Allocating child." 88 with capture: 89 del p 90 assert ConstructorStats.detail_reg_inst() == n_inst 91 assert ( 92 capture 93 == """ 94 Releasing parent. 95 Releasing child. 96 """ 97 ) 98 99 p = m.Parent() 100 assert ConstructorStats.detail_reg_inst() == n_inst + 1 101 with capture: 102 m.Parent.staticFunction(p) 103 assert ConstructorStats.detail_reg_inst() == n_inst + 2 104 assert capture == "Allocating child." 105 with capture: 106 del p 107 assert ConstructorStats.detail_reg_inst() == n_inst 108 assert ( 109 capture 110 == """ 111 Releasing parent. 112 Releasing child. 113 """ 114 ) 115 116 117 # https://foss.heptapod.net/pypy/pypy/-/issues/2447 118 @pytest.mark.xfail("env.PYPY", reason="_PyObject_GetDictPtr is unimplemented") 119 def test_alive_gc(capture): 120 n_inst = ConstructorStats.detail_reg_inst() 121 p = m.ParentGC() 122 p.addChildKeepAlive(m.Child()) 123 assert ConstructorStats.detail_reg_inst() == n_inst + 2 124 lst = [p] 125 lst.append(lst) # creates a circular reference 126 with capture: 127 del p, lst 128 assert ConstructorStats.detail_reg_inst() == n_inst 129 assert ( 130 capture 131 == """ 132 Releasing parent. 133 Releasing child. 134 """ 135 ) 136 137 138 def test_alive_gc_derived(capture): 139 class Derived(m.Parent): 140 pass 141 142 n_inst = ConstructorStats.detail_reg_inst() 143 p = Derived() 144 p.addChildKeepAlive(m.Child()) 145 assert ConstructorStats.detail_reg_inst() == n_inst + 2 146 lst = [p] 147 lst.append(lst) # creates a circular reference 148 with capture: 149 del p, lst 150 assert ConstructorStats.detail_reg_inst() == n_inst 151 assert ( 152 capture 153 == """ 154 Releasing parent. 155 Releasing child. 156 """ 157 ) 158 159 160 def test_alive_gc_multi_derived(capture): 161 class Derived(m.Parent, m.Child): 162 def __init__(self): 163 m.Parent.__init__(self) 164 m.Child.__init__(self) 165 166 n_inst = ConstructorStats.detail_reg_inst() 167 p = Derived() 168 p.addChildKeepAlive(m.Child()) 169 # +3 rather than +2 because Derived corresponds to two registered instances 170 assert ConstructorStats.detail_reg_inst() == n_inst + 3 171 lst = [p] 172 lst.append(lst) # creates a circular reference 173 with capture: 174 del p, lst 175 assert ConstructorStats.detail_reg_inst() == n_inst 176 assert ( 177 capture 178 == """ 179 Releasing parent. 180 Releasing child. 181 Releasing child. 182 """ 183 ) 184 185 186 def test_return_none(capture): 187 n_inst = ConstructorStats.detail_reg_inst() 188 with capture: 189 p = m.Parent() 190 assert capture == "Allocating parent." 191 with capture: 192 p.returnNullChildKeepAliveChild() 193 assert ConstructorStats.detail_reg_inst() == n_inst + 1 194 assert capture == "" 195 with capture: 196 del p 197 assert ConstructorStats.detail_reg_inst() == n_inst 198 assert capture == "Releasing parent." 199 200 with capture: 201 p = m.Parent() 202 assert capture == "Allocating parent." 203 with capture: 204 p.returnNullChildKeepAliveParent() 205 assert ConstructorStats.detail_reg_inst() == n_inst + 1 206 assert capture == "" 207 with capture: 208 del p 209 assert ConstructorStats.detail_reg_inst() == n_inst 210 assert capture == "Releasing parent." 211 212 213 def test_keep_alive_constructor(capture): 214 n_inst = ConstructorStats.detail_reg_inst() 215 216 with capture: 217 p = m.Parent(m.Child()) 218 assert ConstructorStats.detail_reg_inst() == n_inst + 2 219 assert ( 220 capture 221 == """ 222 Allocating child. 223 Allocating parent. 224 """ 225 ) 226 with capture: 227 del p 228 assert ConstructorStats.detail_reg_inst() == n_inst 229 assert ( 230 capture 231 == """ 232 Releasing parent. 233 Releasing child. 234 """ 235 ) 236 237 238 def test_call_guard(): 239 assert m.unguarded_call() == "unguarded" 240 assert m.guarded_call() == "guarded" 241 242 assert m.multiple_guards_correct_order() == "guarded & guarded" 243 assert m.multiple_guards_wrong_order() == "unguarded & guarded" 244 245 if hasattr(m, "with_gil"): 246 assert m.with_gil() == "GIL held" 247 assert m.without_gil() == "GIL released"