2 from pybind11_tests
import callbacks
as m
3 from threading
import Thread
7 from functools
import partial
12 def func2(a, b, c, d):
13 return "func2", a, b, c, d
16 return "func3({})".
format(a)
18 assert m.test_callback1(func1) ==
"func1" 19 assert m.test_callback2(func2) == (
"func2",
"Hello",
"x",
True, 5)
20 assert m.test_callback1(partial(func2, 1, 2, 3, 4)) == (
"func2", 1, 2, 3, 4)
21 assert m.test_callback1(partial(func3,
"partial")) ==
"func3(partial)" 22 assert m.test_callback3(
lambda i: i + 1) ==
"func(43) = 44" 24 f = m.test_callback4()
26 f = m.test_callback5()
27 assert f(number=43) == 44
33 def double(self, val):
37 assert m.test_callback3(z.double) ==
"func(43) = 86" 39 z = m.CppBoundMethodTest()
40 assert m.test_callback3(z.triple) ==
"func(43) = 129" 45 def f(*args, **kwargs):
48 assert m.test_tuple_unpacking(f) == ((
"positional", 1, 2, 3, 4, 5, 6), {})
49 assert m.test_dict_unpacking(f) == ((
"positional", 1), {
"key":
"value",
"a": 1,
"b": 2})
50 assert m.test_keyword_args(f) == ((), {
"x": 10,
"y": 20})
51 assert m.test_unpacking_and_keywords1(f) == ((1, 2), {
"c": 3,
"d": 4})
52 assert m.test_unpacking_and_keywords2(f) == (
53 (
"positional", 1, 2, 3, 4, 5),
54 {
"key":
"value",
"a": 1,
"b": 2,
"c": 3,
"d": 4,
"e": 5}
57 with pytest.raises(TypeError)
as excinfo:
58 m.test_unpacking_error1(f)
59 assert "Got multiple values for keyword argument" in str(excinfo.value)
61 with pytest.raises(TypeError)
as excinfo:
62 m.test_unpacking_error2(f)
63 assert "Got multiple values for keyword argument" in str(excinfo.value)
65 with pytest.raises(RuntimeError)
as excinfo:
66 m.test_arg_conversion_error1(f)
67 assert "Unable to convert call argument" in str(excinfo.value)
69 with pytest.raises(RuntimeError)
as excinfo:
70 m.test_arg_conversion_error2(f)
71 assert "Unable to convert call argument" in str(excinfo.value)
76 cstats = m.payload_cstats()
77 assert cstats.alive() == 0
78 assert cstats.copy_constructions == 1
79 assert cstats.move_constructions >= 1
83 """Test if passing a function pointer from C++ -> Python -> C++ yields the original pointer""" 85 assert m.test_dummy_function(m.dummy_function) ==
"matches dummy_function: eval(1) = 2" 86 assert (m.test_dummy_function(m.roundtrip(m.dummy_function)) ==
87 "matches dummy_function: eval(1) = 2")
88 assert m.roundtrip(
None, expect_none=
True)
is None 89 assert (m.test_dummy_function(
lambda x: x + 2) ==
90 "can't convert to function pointer: eval(1) = 3")
92 with pytest.raises(TypeError)
as excinfo:
93 m.test_dummy_function(m.dummy_function2)
94 assert "incompatible function arguments" in str(excinfo.value)
96 with pytest.raises(TypeError)
as excinfo:
97 m.test_dummy_function(
lambda x, y: x + y)
98 assert any(s
in str(excinfo.value)
for s
in (
"missing 1 required positional argument",
99 "takes exactly 2 arguments"))
103 assert doc(m.test_callback3) ==
"test_callback3(arg0: Callable[[int], int]) -> str" 104 assert doc(m.test_callback4) ==
"test_callback4() -> Callable[[int], int]" 108 assert m.callback_with_movable(
lambda _:
None)
is True 114 def __init__(self, value):
122 return lambda j: res.append(s.value + j)
126 m.test_async_callback(gen_f(), work)
128 from time
import sleep
130 assert sum(res) == sum([x + 3
for x
in work])
134 t = Thread(target=test_async_callbacks)
def test_bound_method_callback()
def test_async_async_callbacks()
def test_lambda_closure_cleanup()
auto format(const std::locale &loc, const CharT *fmt, const Streamable &tp) -> decltype(to_stream(std::declval< std::basic_ostream< CharT > &>(), fmt, tp), std::basic_string< CharT >
def test_keyword_args_and_generalized_unpacking()
def test_function_signatures(doc)
def test_movable_object()
def test_cpp_function_roundtrip()
def test_async_callbacks()