4m = pytest.importorskip(
"pybind11_tests.smart_ptr")
5from pybind11_tests
import ConstructorStats
10 for i, o
in enumerate(
11 [m.make_object_1(), m.make_object_2(), m.MyObject1(3)], start=1
13 assert o.getRefCount() == 1
19 assert capture ==
"MyObject1[{i}]\n".format(i=i) * 4
21 for i, o
in enumerate(
22 [m.make_myobject1_1(), m.make_myobject1_2(), m.MyObject1(6), 7], start=4
31 m.print_myobject1_1(o)
32 m.print_myobject1_2(o)
33 m.print_myobject1_3(o)
34 m.print_myobject1_4(o)
37 assert capture ==
"MyObject1[{i}]\n".format(i=i) * times
40 assert cstats.alive() == 0
41 expected_values = [
"MyObject1[{}]".format(i)
for i
in range(1, 7)] + [
44 assert cstats.values() == expected_values
45 assert cstats.default_constructions == 0
46 assert cstats.copy_constructions == 0
48 assert cstats.copy_assignments == 0
49 assert cstats.move_assignments == 0
53 [8, 6, 7], [m.MyObject2(8), m.make_myobject2_1(), m.make_myobject2_2()]
57 m.print_myobject2_1(o)
58 m.print_myobject2_2(o)
59 m.print_myobject2_3(o)
60 m.print_myobject2_4(o)
61 assert capture ==
"MyObject2[{i}]\n".format(i=i) * 4
64 assert cstats.alive() == 1
66 assert cstats.alive() == 0
67 assert cstats.values() == [
"MyObject2[8]",
"MyObject2[6]",
"MyObject2[7]"]
68 assert cstats.default_constructions == 0
69 assert cstats.copy_constructions == 0
71 assert cstats.copy_assignments == 0
72 assert cstats.move_assignments == 0
76 [9, 8, 9], [m.MyObject3(9), m.make_myobject3_1(), m.make_myobject3_2()]
80 m.print_myobject3_1(o)
81 m.print_myobject3_2(o)
82 m.print_myobject3_3(o)
83 m.print_myobject3_4(o)
84 assert capture ==
"MyObject3[{i}]\n".format(i=i) * 4
87 assert cstats.alive() == 1
89 assert cstats.alive() == 0
90 assert cstats.values() == [
"MyObject3[9]",
"MyObject3[8]",
"MyObject3[9]"]
91 assert cstats.default_constructions == 0
92 assert cstats.copy_constructions == 0
94 assert cstats.copy_assignments == 0
95 assert cstats.move_assignments == 0
99 assert cstats.alive() == 0
100 assert cstats.values() == []
101 assert cstats.default_constructions == 10
102 assert cstats.copy_constructions == 0
104 assert cstats.copy_assignments == 0
105 assert cstats.move_assignments == 0
108 cstats = m.cstats_ref()
109 assert cstats.alive() == 0
110 assert cstats.values() == [
"from pointer"] * 10
111 assert cstats.default_constructions == 30
112 assert cstats.copy_constructions == 12
114 assert cstats.copy_assignments == 30
115 assert cstats.move_assignments == 0
119 assert m.test_object1_refcounting()
126 assert cstats.alive() == 1
128 assert cstats.alive() == 1
129 m.MyObject4.cleanup_all_instances()
130 assert cstats.alive() == 0
137 assert cstats.alive() == 1
139 assert cstats.alive() == 1
140 m.MyObject4a.cleanup_all_instances()
141 assert cstats.alive() == 0
149 assert cstats4a.alive() == 2
151 assert cstats4b.alive() == 1
153 assert cstats4a.alive() == 1
154 assert cstats4b.alive() == 0
155 m.MyObject4a.cleanup_all_instances()
156 assert cstats4a.alive() == 0
157 assert cstats4b.alive() == 0
164 assert cstats.alive() == 1
166 assert cstats.alive() == 0
172 assert stats.alive() == 2
175 assert stats.alive() == 2
176 assert s.set_ref(ref)
177 with pytest.raises(RuntimeError)
as excinfo:
178 assert s.set_holder(ref)
179 assert "Unable to cast from non-held to held instance" in str(excinfo.value)
182 assert stats.alive() == 3
183 assert s.set_ref(copy)
184 assert s.set_holder(copy)
186 holder_ref = s.holder_ref
187 assert stats.alive() == 3
188 assert s.set_ref(holder_ref)
189 assert s.set_holder(holder_ref)
191 holder_copy = s.holder_copy
192 assert stats.alive() == 3
193 assert s.set_ref(holder_copy)
194 assert s.set_holder(holder_copy)
196 del ref, copy, holder_ref, holder_copy, s
197 assert stats.alive() == 0
201 s = m.SharedFromThisRef()
203 assert stats.alive() == 2
206 assert stats.alive() == 2
207 assert s.set_ref(ref)
213 assert stats.alive() == 2
214 assert s.set_ref(bad_wp)
215 with pytest.raises(RuntimeError)
as excinfo:
216 assert s.set_holder(bad_wp)
217 assert "Unable to cast from non-held to held instance" in str(excinfo.value)
220 assert stats.alive() == 3
221 assert s.set_ref(copy)
222 assert s.set_holder(copy)
227 assert stats.alive() == 3
228 assert s.set_ref(holder_ref)
229 assert s.set_holder(holder_ref)
234 assert stats.alive() == 3
235 assert s.set_ref(holder_copy)
236 assert s.set_holder(holder_copy)
238 del ref, bad_wp, copy, holder_ref, holder_copy, s
239 assert stats.alive() == 0
241 z = m.SharedFromThisVirt.get()
242 y = m.SharedFromThisVirt.get()
247 a = m.TypeWithMoveOnlyHolder.make()
248 b = m.TypeWithMoveOnlyHolder.make_as_object()
250 assert stats.alive() == 2
252 assert stats.alive() == 1
254 assert stats.alive() == 0
259 a = m.TypeForHolderWithAddressOf.make()
266 assert stats.alive() == 1
268 np = m.TypeForHolderWithAddressOf.make()
269 assert stats.alive() == 2
271 assert stats.alive() == 1
273 assert stats.alive() == 0
275 b = m.TypeForHolderWithAddressOf.make()
277 assert b.get()
is c.get()
278 assert stats.alive() == 1
281 assert stats.alive() == 1
284 assert stats.alive() == 0
288 a = m.TypeForMoveOnlyHolderWithAddressOf.make()
292 assert stats.alive() == 1
298 assert stats.alive() == 0
302 instance = m.HeldByDefaultHolder()
303 with pytest.raises(RuntimeError)
as excinfo:
304 m.HeldByDefaultHolder.load_shared_ptr(instance)
306 "Unable to load a custom holder type from a "
307 "default-holder instance" in str(excinfo.value)
312 """#187: issue involving std::shared_ptr<> return value policy & garbage collection"""
315 el.add(m.ElementA(i))
317 for i, v
in enumerate(el.get()):
318 assert i == v.value()
static ConstructorStats & get(std::type_index type)
bool isinstance(handle obj)
\rst Return true if obj is an instance of T.
def test_move_only_holder_with_addressof_operator()
def test_unique_nodelete()
def test_shared_ptr_from_this_and_references()
def test_smart_ptr_refcounting()
def test_move_only_holder()
def test_shared_ptr_and_references()
def test_holder_with_addressof_operator()
def test_unique_deleter()
def test_smart_ptr_from_default()
def test_unique_nodelete4a()