2 from __future__
import division
8 from pybind11_tests
import pytypes
as m
9 from pybind11_tests
import debug_enabled
13 assert doc(m.get_int) ==
"get_int() -> int"
17 assert doc(m.get_iterator) ==
"get_iterator() -> Iterator"
21 assert doc(m.get_iterable) ==
"get_iterable() -> Iterable"
27 assert lst == [
"inserted-0",
"overwritten",
"inserted-2"]
34 Entry at position 0: value
35 list item 0: inserted-0
36 list item 1: overwritten
37 list item 2: inserted-2
42 assert doc(m.get_list) ==
"get_list() -> list"
43 assert doc(m.print_list) ==
"print_list(arg0: list) -> None"
47 assert doc(m.get_none) ==
"get_none() -> None"
48 assert doc(m.print_none) ==
"print_none(arg0: None) -> None"
53 assert s == {
"key1",
"key2",
"key3"}
68 assert not m.set_contains(
set([]), 42)
69 assert m.set_contains({42}, 42)
70 assert m.set_contains({
"foo"},
"foo")
72 assert doc(m.get_list) ==
"get_list() -> list"
73 assert doc(m.print_list) ==
"print_list(arg0: list) -> None"
78 assert d == {
"key":
"value"}
87 key: key2, value=value2
91 assert not m.dict_contains({}, 42)
92 assert m.dict_contains({42:
None}, 42)
93 assert m.dict_contains({
"foo":
None},
"foo")
95 assert doc(m.get_dict) ==
"get_dict() -> dict"
96 assert doc(m.print_dict) ==
"print_dict(arg0: dict) -> None"
98 assert m.dict_keyword_constructor() == {
"x": 1,
"y": 2,
"z": 3}
102 assert m.str_from_string().encode().decode() ==
"baz"
103 assert m.str_from_bytes().encode().decode() ==
"boo"
105 assert doc(m.str_from_bytes) ==
"str_from_bytes() -> str"
109 return "this is a str"
112 return "this is a repr"
114 assert m.str_from_object(
A()) ==
"this is a str"
115 assert m.repr_from_object(
A()) ==
"this is a repr"
116 assert m.str_from_handle(
A()) ==
"this is a str"
118 s1, s2 = m.str_format()
119 assert s1 ==
"1 + 2 = 3"
122 malformed_utf8 = b
"\x80"
123 if hasattr(m,
"PYBIND11_STR_LEGACY_PERMISSIVE"):
124 assert m.str_from_object(malformed_utf8)
is malformed_utf8
126 with pytest.raises(UnicodeDecodeError):
127 m.str_from_object(malformed_utf8)
129 assert m.str_from_object(malformed_utf8) ==
"b'\\x80'"
131 with pytest.raises(UnicodeDecodeError):
132 m.str_from_handle(malformed_utf8)
134 assert m.str_from_handle(malformed_utf8) ==
"b'\\x80'"
138 assert m.bytes_from_string().decode() ==
"foo"
139 assert m.bytes_from_str().decode() ==
"bar"
141 assert doc(m.bytes_from_str) ==
"bytes_from_str() -> {}".format(
142 "str" if env.PY2
else "bytes"
149 a = m.return_capsule_with_destructor()
161 a = m.return_capsule_with_destructor_2()
168 destructing capsule: 1234
173 a = m.return_capsule_with_name_and_destructor()
179 created capsule (1234, 'pointer type description')
180 destructing capsule (1234, 'pointer type description')
192 begin_end = [1, 2, 3]
193 d = {
"operator[object]": 1,
"operator[char *]": 2}
194 sub = SubTestObject()
196 def func(self, x, *args):
197 return self.basic_attr + x + sum(args)
199 d = m.accessor_api(TestObject())
200 assert d[
"basic_attr"] == 1
201 assert d[
"begin_end"] == [1, 2, 3]
202 assert d[
"operator[object]"] == 1
203 assert d[
"operator[char *]"] == 2
204 assert d[
"attr(object)"] == 1
205 assert d[
"attr(char *)"] == 2
206 assert d[
"missing_attr_ptr"] ==
"raised"
207 assert d[
"missing_attr_chain"] ==
"raised"
208 assert d[
"is_none"]
is False
209 assert d[
"operator()"] == 2
210 assert d[
"operator*"] == 7
211 assert d[
"implicit_list"] == [1, 2, 3]
212 assert all(x
in TestObject.__dict__
for x
in d[
"implicit_dict"])
214 assert m.tuple_accessor(
tuple()) == (0, 1, 2)
216 d = m.accessor_assignment()
218 assert d[
"deferred_get"] == 0
220 assert d[
"deferred_set"] == 1
221 assert d[
"var"] == 99
225 """C++ default and converting constructors are equivalent to type calls in Python"""
226 types = [bytes, str, bool, int, float, tuple, list, dict, set]
227 expected = {t.__name__: t()
for t
in types}
231 expected[
"bytes"] =
bytes()
232 expected[
"str"] = unicode()
233 assert m.default_constructors() == expected
243 dict: [(
"two", 2), (
"one", 1), (
"three", 3)],
244 set: [4, 4, 5, 6, 6, 6],
247 inputs = {k.__name__: v
for k, v
in data.items()}
248 expected = {k.__name__: k(v)
for k, v
in data.items()}
250 inputs[
"bytes"] = b
"41"
252 expected[
"bytes"] = b
"41"
253 expected[
"str"] =
u"42"
255 assert m.converting_constructors(inputs) == expected
256 assert m.cast_functions(inputs) == expected
260 noconv1 = m.converting_constructors(expected)
262 assert noconv1[k]
is expected[k]
264 noconv2 = m.cast_functions(expected)
266 assert noconv2[k]
is expected[k]
270 non_converting_test_cases = [
271 (
"bytes", range(10)),
276 for t, v
in non_converting_test_cases:
277 for move
in [
True,
False]:
278 with pytest.raises(TypeError)
as excinfo:
279 m.nonconverting_constructor(t, v, move)
280 expected_error =
"Object of type '{}' is not an instance of '{}'".format(
283 assert str(excinfo.value) == expected_error
288 cvt = m.convert_to_pybind11_str
289 assert cvt(
u"Str") ==
u"Str"
290 assert cvt(b
"Bytes") ==
u"Bytes" if env.PY2
else "b'Bytes'"
291 assert cvt(
None) ==
u"None"
292 assert cvt(
False) ==
u"False"
293 assert cvt(
True) ==
u"True"
294 assert cvt(42) ==
u"42"
295 assert cvt(2 ** 65) ==
u"36893488147419103232"
296 assert cvt(-1.50) ==
u"-1.5"
297 assert cvt(()) ==
u"()"
298 assert cvt((18,)) ==
u"(18,)"
299 assert cvt([]) ==
u"[]"
300 assert cvt([28]) ==
u"[28]"
301 assert cvt({}) ==
u"{}"
302 assert cvt({3: 4}) ==
u"{3: 4}"
303 assert cvt(
set()) ==
u"set([])" if env.PY2
else "set()"
304 assert cvt({3, 3}) ==
u"set([3])" if env.PY2
else "{3}"
307 valid_utf8 = valid_orig.encode(
"utf-8")
308 valid_cvt = cvt(valid_utf8)
309 if hasattr(m,
"PYBIND11_STR_LEGACY_PERMISSIVE"):
310 assert valid_cvt
is valid_utf8
312 assert type(valid_cvt)
is unicode
if env.PY2
else str
314 assert valid_cvt == valid_orig
316 assert valid_cvt ==
"b'\\xc7\\xb1'"
318 malformed_utf8 = b
"\x80"
319 if hasattr(m,
"PYBIND11_STR_LEGACY_PERMISSIVE"):
320 assert cvt(malformed_utf8)
is malformed_utf8
323 with pytest.raises(UnicodeDecodeError):
326 malformed_cvt = cvt(malformed_utf8)
327 assert type(malformed_cvt)
is str
328 assert malformed_cvt ==
"b'\\x80'"
332 """Tests implicit casting when assigning or appending to dicts and lists."""
333 z = m.get_implicit_casting()
348 assert z[
"l"] == [3, 6, 9, 12, 15]
358 1 2.0 three True -- multiple args
359 *args-and-a-custom-separator
360 no new line here -- next print
362 py::print + str.format = this
365 assert capture.stderr ==
"this goes to stderr"
367 with pytest.raises(RuntimeError)
as excinfo:
369 assert str(excinfo.value) ==
"make_tuple(): unable to convert " + (
370 "argument of type 'UnregisteredType' to Python object"
372 else "arguments to Python object (compile in debug mode for details)"
378 def __init__(self, value):
387 assert m.hash_function(Hashable(42)) == 42
388 with pytest.raises(TypeError):
389 m.hash_function(Unhashable())
393 for a, b
in [(1, 1), (3, 5)]:
411 assert m.test_number_protocol(a, b) == li
415 li =
list(range(100))
416 assert li[::2] == m.test_list_slicing(li)
421 assert m.issue2361_str_implicit_copy_none() ==
"None"
422 with pytest.raises(TypeError)
as excinfo:
423 assert m.issue2361_dict_implicit_copy_none()
424 assert "'NoneType' object is not iterable" in str(excinfo.value)
427 @pytest.mark.parametrize(
428 "method, args, fmt, expected_view",
430 (m.test_memoryview_object, (b
"red",),
"B", b
"red"),
431 (m.test_memoryview_buffer_info, (b
"green",),
"B", b
"green"),
432 (m.test_memoryview_from_buffer, (
False,),
"h", [3, 1, 4, 1, 5]),
433 (m.test_memoryview_from_buffer, (
True,),
"H", [2, 7, 1, 8]),
434 (m.test_memoryview_from_buffer_nativeformat, (),
"@i", [4, 7, 5]),
440 assert view.format == fmt
441 if isinstance(expected_view, bytes)
or not env.PY2:
442 view_as_list =
list(view)
445 view_as_list = [max([ord(c)
for c
in s])
for s
in view]
446 assert view_as_list ==
list(expected_view)
449 @pytest.mark.xfail(
"env.PYPY", reason=
"getrefcount is not available")
450 @pytest.mark.parametrize(
453 m.test_memoryview_object,
454 m.test_memoryview_buffer_info,
458 buf = b
"\x0a\x0b\x0c\x0d"
459 ref_before = sys.getrefcount(buf)
461 ref_after = sys.getrefcount(buf)
462 assert ref_before < ref_after
467 view = m.test_memoryview_from_buffer_empty_shape()
469 assert view.format ==
"B"
473 assert bytes(view).startswith(b
"<memory")
475 assert bytes(view) == b
""
479 with pytest.raises(RuntimeError):
480 m.test_memoryview_from_buffer_invalid_strides()
485 m.test_memoryview_from_buffer_nullptr()
487 with pytest.raises(ValueError):
488 m.test_memoryview_from_buffer_nullptr()
491 @pytest.mark.skipif(
"env.PY2")
493 view = m.test_memoryview_from_memory()
495 assert view.format ==
"B"
496 assert bytes(view) == b
"\xff\xe1\xab\x37"
500 assert m.get_len([i
for i
in range(42)]) == 42
501 with pytest.raises(TypeError)
as exc_info:
502 m.get_len(i
for i
in range(42))
503 assert str(exc_info.value)
in [
504 "object of type 'generator' has no len()",
505 "'generator' has no length",
510 assert m.isinstance_pybind11_bytes(b
"")
511 assert not m.isinstance_pybind11_bytes(
u"")
513 assert m.isinstance_pybind11_str(
u"")
514 if hasattr(m,
"PYBIND11_STR_LEGACY_PERMISSIVE"):
515 assert m.isinstance_pybind11_str(b
"")
517 assert not m.isinstance_pybind11_str(b
"")
521 assert m.pass_to_pybind11_bytes(b
"Bytes") == 5
522 with pytest.raises(TypeError):
523 m.pass_to_pybind11_bytes(
u"Str")
525 if hasattr(m,
"PYBIND11_STR_LEGACY_PERMISSIVE")
or env.PY2:
526 assert m.pass_to_pybind11_str(b
"Bytes") == 5
528 with pytest.raises(TypeError):
529 m.pass_to_pybind11_str(b
"Bytes")
530 assert m.pass_to_pybind11_str(
u"Str") == 3
532 assert m.pass_to_std_string(b
"Bytes") == 5
533 assert m.pass_to_std_string(
u"Str") == 3
535 malformed_utf8 = b
"\x80"
536 if hasattr(m,
"PYBIND11_STR_LEGACY_PERMISSIVE"):
537 assert m.pass_to_pybind11_str(malformed_utf8) == 1
539 with pytest.raises(UnicodeDecodeError):
540 m.pass_to_pybind11_str(malformed_utf8)
542 with pytest.raises(TypeError):
543 m.pass_to_pybind11_str(malformed_utf8)
546 @pytest.mark.parametrize(
547 "create_weakref, create_weakref_with_callback",
549 (m.weakref_from_handle, m.weakref_from_handle_and_function),
550 (m.weakref_from_object, m.weakref_from_object_and_function),
554 from weakref
import getweakrefcount
557 class WeaklyReferenced(
object):
562 callback.called =
True
564 obj = WeaklyReferenced()
565 assert getweakrefcount(obj) == 0
566 wr = create_weakref(obj)
567 assert getweakrefcount(obj) == 1
569 obj = WeaklyReferenced()
570 assert getweakrefcount(obj) == 0
571 callback.called =
False
572 wr = create_weakref_with_callback(obj, callback)
573 assert getweakrefcount(obj) == 1
574 assert not callback.called
577 assert callback.called