6 from pybind11_tests
import methods_and_attributes
as m
7 from pybind11_tests
import ConstructorStats
11 instance1 = m.ExampleMandA()
12 instance2 = m.ExampleMandA(32)
14 instance1.add1(instance2)
15 instance1.add2(instance2)
16 instance1.add3(instance2)
17 instance1.add4(instance2)
18 instance1.add5(instance2)
25 assert str(instance1) ==
"ExampleMandA[value=320]"
26 assert str(instance2) ==
"ExampleMandA[value=32]"
27 assert str(instance1.self1()) ==
"ExampleMandA[value=320]"
28 assert str(instance1.self2()) ==
"ExampleMandA[value=320]"
29 assert str(instance1.self3()) ==
"ExampleMandA[value=320]"
30 assert str(instance1.self4()) ==
"ExampleMandA[value=320]"
31 assert str(instance1.self5()) ==
"ExampleMandA[value=320]"
33 assert instance1.internal1() == 320
34 assert instance1.internal2() == 320
35 assert instance1.internal3() == 320
36 assert instance1.internal4() == 320
37 assert instance1.internal5() == 320
39 assert instance1.overloaded() ==
"()"
40 assert instance1.overloaded(0) ==
"(int)"
41 assert instance1.overloaded(1, 1.0) ==
"(int, float)"
42 assert instance1.overloaded(2.0, 2) ==
"(float, int)"
43 assert instance1.overloaded(3, 3) ==
"(int, int)"
44 assert instance1.overloaded(4.0, 4.0) ==
"(float, float)"
45 assert instance1.overloaded_const(-3) ==
"(int) const"
46 assert instance1.overloaded_const(5, 5.0) ==
"(int, float) const"
47 assert instance1.overloaded_const(6.0, 6) ==
"(float, int) const"
48 assert instance1.overloaded_const(7, 7) ==
"(int, int) const"
49 assert instance1.overloaded_const(8.0, 8.0) ==
"(float, float) const"
50 assert instance1.overloaded_float(1, 1) ==
"(float, float)"
51 assert instance1.overloaded_float(1, 1.0) ==
"(float, float)"
52 assert instance1.overloaded_float(1.0, 1) ==
"(float, float)"
53 assert instance1.overloaded_float(1.0, 1.0) ==
"(float, float)"
55 assert instance1.value == 320
57 assert str(instance1) ==
"ExampleMandA[value=100]"
60 assert cstats.alive() == 2
61 del instance1, instance2
62 assert cstats.alive() == 0
63 assert cstats.values() == [
"32"]
64 assert cstats.default_constructions == 1
65 assert cstats.copy_constructions == 2
66 assert cstats.move_constructions >= 2
67 assert cstats.copy_assignments == 0
68 assert cstats.move_assignments == 0
72 """Issue #443: calling copied methods fails in Python 3"""
74 m.ExampleMandA.add2c = m.ExampleMandA.add2
75 m.ExampleMandA.add2d = m.ExampleMandA.add2b
76 a = m.ExampleMandA(123)
78 a.add2(m.ExampleMandA(-100))
80 a.add2b(m.ExampleMandA(20))
82 a.add2c(m.ExampleMandA(6))
84 a.add2d(m.ExampleMandA(-7))
89 instance = m.TestProperties()
91 assert instance.def_readonly == 1
92 with pytest.raises(AttributeError):
93 instance.def_readonly = 2
95 instance.def_readwrite = 2
96 assert instance.def_readwrite == 2
98 assert instance.def_property_readonly == 2
99 with pytest.raises(AttributeError):
100 instance.def_property_readonly = 3
102 instance.def_property = 3
103 assert instance.def_property == 3
105 with pytest.raises(AttributeError)
as excinfo:
106 dummy = instance.def_property_writeonly
107 assert "unreadable attribute" in str(excinfo.value)
109 instance.def_property_writeonly = 4
110 assert instance.def_property_readonly == 4
112 with pytest.raises(AttributeError)
as excinfo:
113 dummy = instance.def_property_impossible
114 assert "unreadable attribute" in str(excinfo.value)
116 with pytest.raises(AttributeError)
as excinfo:
117 instance.def_property_impossible = 5
118 assert "can't set attribute" in str(excinfo.value)
122 assert m.TestProperties.def_readonly_static == 1
123 with pytest.raises(AttributeError)
as excinfo:
124 m.TestProperties.def_readonly_static = 2
125 assert "can't set attribute" in str(excinfo.value)
127 m.TestProperties.def_readwrite_static = 2
128 assert m.TestProperties.def_readwrite_static == 2
130 with pytest.raises(AttributeError)
as excinfo:
131 dummy = m.TestProperties.def_writeonly_static
132 assert "unreadable attribute" in str(excinfo.value)
134 m.TestProperties.def_writeonly_static = 3
135 assert m.TestProperties.def_readonly_static == 3
137 assert m.TestProperties.def_property_readonly_static == 3
138 with pytest.raises(AttributeError)
as excinfo:
139 m.TestProperties.def_property_readonly_static = 99
140 assert "can't set attribute" in str(excinfo.value)
142 m.TestProperties.def_property_static = 4
143 assert m.TestProperties.def_property_static == 4
145 with pytest.raises(AttributeError)
as excinfo:
146 dummy = m.TestProperties.def_property_writeonly_static
147 assert "unreadable attribute" in str(excinfo.value)
149 m.TestProperties.def_property_writeonly_static = 5
150 assert m.TestProperties.def_property_static == 5
153 instance = m.TestProperties()
155 m.TestProperties.def_readwrite_static = 0
156 assert m.TestProperties.def_readwrite_static == 0
157 assert instance.def_readwrite_static == 0
159 instance.def_readwrite_static = 2
160 assert m.TestProperties.def_readwrite_static == 2
161 assert instance.def_readwrite_static == 2
163 with pytest.raises(AttributeError)
as excinfo:
164 dummy = instance.def_property_writeonly_static
165 assert "unreadable attribute" in str(excinfo.value)
167 instance.def_property_writeonly_static = 4
168 assert instance.def_property_static == 4
171 assert m.TestPropertiesOverride().def_readonly == 99
172 assert m.TestPropertiesOverride.def_readonly_static == 99
175 del m.TestPropertiesOverride.def_readonly_static
177 hasattr(m.TestPropertiesOverride,
"def_readonly_static")
178 and m.TestPropertiesOverride.def_readonly_static
179 is m.TestProperties.def_readonly_static
181 assert "def_readonly_static" not in m.TestPropertiesOverride.__dict__
182 properties_override = m.TestPropertiesOverride()
183 with pytest.raises(AttributeError)
as excinfo:
184 del properties_override.def_readonly
185 assert "can't delete attribute" in str(excinfo.value)
189 """Static property getter and setters expect the type object as the their only argument"""
191 instance = m.TestProperties()
192 assert m.TestProperties.static_cls
is m.TestProperties
193 assert instance.static_cls
is m.TestProperties
195 def check_self(self):
196 assert self
is m.TestProperties
198 m.TestProperties.static_cls = check_self
199 instance.static_cls = check_self
203 """Overriding pybind11's default metaclass changes the behavior of `static_property`"""
205 assert type(m.ExampleMandA).__name__ ==
"pybind11_type"
206 assert type(m.MetaclassOverride).__name__ ==
"type"
208 assert m.MetaclassOverride.readonly == 1
210 type(m.MetaclassOverride.__dict__[
"readonly"]).__name__
211 ==
"pybind11_static_property"
215 m.MetaclassOverride.readonly = 2
216 assert m.MetaclassOverride.readonly == 2
217 assert isinstance(m.MetaclassOverride.__dict__[
"readonly"], int)
221 from pybind11_tests
import debug_enabled
223 with pytest.raises(RuntimeError)
as excinfo:
224 m.ExampleMandA.add_mixed_overloads1()
227 ) ==
"overloading a method with both static and instance methods is not supported; " + (
228 "compile in debug mode for more details"
230 else "error while attempting to bind static method ExampleMandA.overload_mixed1"
231 "(arg0: float) -> str"
234 with pytest.raises(RuntimeError)
as excinfo:
235 m.ExampleMandA.add_mixed_overloads2()
238 ) ==
"overloading a method with both static and instance methods is not supported; " + (
239 "compile in debug mode for more details"
241 else "error while attempting to bind instance method ExampleMandA.overload_mixed2"
242 "(self: pybind11_tests.methods_and_attributes.ExampleMandA, arg0: int, arg1: int)"
247 @pytest.mark.parametrize(
"access", [
"ro",
"rw",
"static_ro",
"static_rw"])
249 if not access.startswith(
"static"):
250 obj = m.TestPropRVP()
254 ref =
getattr(obj, access +
"_ref")
255 assert ref.value == 1
257 assert getattr(obj, access +
"_ref").value == 2
260 copy =
getattr(obj, access +
"_copy")
261 assert copy.value == 1
263 assert getattr(obj, access +
"_copy").value == 1
265 copy =
getattr(obj, access +
"_func")
266 assert copy.value == 1
268 assert getattr(obj, access +
"_func").value == 1
272 """When returning an rvalue, the return value policy is automatically changed from
273 `reference(_internal)` to `move`. The following would not work otherwise."""
275 instance = m.TestPropRVP()
279 os = m.TestPropRVP.static_rvalue
284 @pytest.mark.xfail(
"env.PYPY")
286 instance = m.DynamicClass()
287 assert not hasattr(instance,
"foo")
288 assert "foo" not in dir(instance)
292 assert hasattr(instance,
"foo")
293 assert instance.foo == 42
294 assert "foo" in dir(instance)
297 assert "foo" in instance.__dict__
298 instance.__dict__ = {
"bar":
True}
299 assert not hasattr(instance,
"foo")
300 assert hasattr(instance,
"bar")
302 with pytest.raises(TypeError)
as excinfo:
303 instance.__dict__ = []
304 assert str(excinfo.value) ==
"__dict__ must be set to a dictionary, not a 'list'"
307 assert cstats.alive() == 1
309 assert cstats.alive() == 0
312 class PythonDerivedDynamicClass(m.DynamicClass):
315 for cls
in m.CppDerivedDynamicClass, PythonDerivedDynamicClass:
318 assert derived.foobar == 100
320 assert cstats.alive() == 1
322 assert cstats.alive() == 0
326 @pytest.mark.xfail(
"env.PYPY")
329 instance = m.DynamicClass()
330 instance.circular_reference = instance
333 assert cstats.alive() == 1
335 assert cstats.alive() == 0
338 i1 = m.DynamicClass()
339 i2 = m.DynamicClass()
343 assert cstats.alive() == 2
345 assert cstats.alive() == 0
349 from pybind11_tests
import debug_enabled
351 with pytest.raises(RuntimeError)
as excinfo:
352 m.bad_arg_def_named()
353 assert msg(excinfo.value) == (
354 "arg(): could not convert default argument 'a: UnregisteredType' in function "
355 "'should_fail' into a Python object (type not registered yet?)"
357 else "arg(): could not convert default argument into a Python object (type not registered "
358 "yet?). Compile in debug mode for more information."
361 with pytest.raises(RuntimeError)
as excinfo:
362 m.bad_arg_def_unnamed()
363 assert msg(excinfo.value) == (
364 "arg(): could not convert default argument 'UnregisteredType' in function "
365 "'should_fail' into a Python object (type not registered yet?)"
367 else "arg(): could not convert default argument into a Python object (type not registered "
368 "yet?). Compile in debug mode for more information."
374 assert m.no_none1(a) == 42
375 assert m.no_none2(a) == 42
376 assert m.no_none3(a) == 42
377 assert m.no_none4(a) == 42
378 assert m.no_none5(a) == 42
379 assert m.ok_none1(a) == 42
380 assert m.ok_none2(a) == 42
381 assert m.ok_none3(a) == 42
382 assert m.ok_none4(a) == 42
383 assert m.ok_none5(a) == 42
385 with pytest.raises(TypeError)
as excinfo:
387 assert "incompatible function arguments" in str(excinfo.value)
388 with pytest.raises(TypeError)
as excinfo:
390 assert "incompatible function arguments" in str(excinfo.value)
391 with pytest.raises(TypeError)
as excinfo:
393 assert "incompatible function arguments" in str(excinfo.value)
394 with pytest.raises(TypeError)
as excinfo:
396 assert "incompatible function arguments" in str(excinfo.value)
397 with pytest.raises(TypeError)
as excinfo:
399 assert "incompatible function arguments" in str(excinfo.value)
402 with pytest.raises(TypeError)
as excinfo:
403 assert m.ok_none1(
None) == -1
407 ok_none1(): incompatible function arguments. The following argument types are supported:
408 1. (arg0: m.methods_and_attributes.NoneTester) -> int
415 assert m.ok_none2(
None) == -1
416 assert m.ok_none3(
None) == -1
417 assert m.ok_none4(
None) == -1
418 assert m.ok_none5(
None) == -1
420 with pytest.raises(TypeError)
as excinfo:
421 m.no_none_kwarg(
None)
422 assert "incompatible function arguments" in str(excinfo.value)
423 with pytest.raises(TypeError)
as excinfo:
424 m.no_none_kwarg(a=
None)
425 assert "incompatible function arguments" in str(excinfo.value)
426 with pytest.raises(TypeError)
as excinfo:
427 m.no_none_kwarg_kw_only(
None)
428 assert "incompatible function arguments" in str(excinfo.value)
429 with pytest.raises(TypeError)
as excinfo:
430 m.no_none_kwarg_kw_only(a=
None)
431 assert "incompatible function arguments" in str(excinfo.value)
435 """#283: __str__ called on uninitialized instance when constructor arguments invalid"""
437 assert str(m.StrIssue(3)) ==
"StrIssue[3]"
439 with pytest.raises(TypeError)
as excinfo:
440 str(m.StrIssue(
"no",
"such",
"constructor"))
444 __init__(): incompatible constructor arguments. The following argument types are supported:
445 1. m.methods_and_attributes.StrIssue(arg0: int)
446 2. m.methods_and_attributes.StrIssue()
448 Invoked with: 'no', 'such', 'constructor'
454 a = m.RegisteredDerived()
456 assert a.rw_value == 42
457 assert a.ro_value == 1.25
459 assert a.sum() == 48.25
461 assert a.rw_value == 48
462 assert a.ro_value == 1.5
463 assert a.sum() == 49.5
464 assert a.rw_value_prop == 48
466 assert a.rw_value_prop == 49
468 assert a.ro_value_prop == 1.75
472 """Tests that explicit lvalue ref-qualified methods can be called just like their
473 non ref-qualified counterparts."""
479 assert r.constRefQualified(23) == 40
483 "Check to see if the normal overload order (first defined) and prepend overload order works"
484 assert m.overload_order(
"string") == 1
485 assert m.overload_order(0) == 4
488 uni_name =
type(
u"").__name__
490 assert "1. overload_order(arg0: int) -> int" in m.overload_order.__doc__
492 "2. overload_order(arg0: {}) -> int".format(uni_name)
493 in m.overload_order.__doc__
496 "3. overload_order(arg0: {}) -> int".format(uni_name)
497 in m.overload_order.__doc__
499 assert "4. overload_order(arg0: int) -> int" in m.overload_order.__doc__
501 with pytest.raises(TypeError)
as err:
502 m.overload_order(1.1)
504 assert "1. (arg0: int) -> int" in str(err.value)
505 assert "2. (arg0: {}) -> int".format(uni_name)
in str(err.value)
506 assert "3. (arg0: {}) -> int".format(uni_name)
in str(err.value)
507 assert "4. (arg0: int) -> int" in str(err.value)