summaryrefslogtreecommitdiff
path: root/ext/pybind11/tests/test_callbacks.py
diff options
context:
space:
mode:
authorAndreas Sandberg <andreas.sandberg@arm.com>2017-02-27 13:17:51 +0000
committerAndreas Sandberg <andreas.sandberg@arm.com>2017-05-02 12:37:32 +0000
commitc79706ff4ce591df2151db5504d3c224f3c9965f (patch)
treeb56cd2bfe704a40575a71075e78194a4c516c98d /ext/pybind11/tests/test_callbacks.py
parent359cb08623324b62d7c34973ae54d5bc7f23f9fd (diff)
downloadgem5-c79706ff4ce591df2151db5504d3c224f3c9965f.tar.xz
ext: Add pybind rev f4b81b3
Change-Id: I52e4fc9ebf2f59da57d8cf8f3e37cc79598c2f5f Signed-off-by: Andreas Sandberg <andreas.sandberg@arm.com> Reviewed-by: Andreas Hansson <andreas.hansson@arm.com> Reviewed-by: Curtis Dunham <curtis.dunham@arm.com> Reviewed-on: https://gem5-review.googlesource.com/2229 Reviewed-by: Tony Gutierrez <anthony.gutierrez@amd.com> Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Pierre-Yves PĂ©neau <pierre-yves.peneau@lirmm.fr>
Diffstat (limited to 'ext/pybind11/tests/test_callbacks.py')
-rw-r--r--ext/pybind11/tests/test_callbacks.py98
1 files changed, 98 insertions, 0 deletions
diff --git a/ext/pybind11/tests/test_callbacks.py b/ext/pybind11/tests/test_callbacks.py
new file mode 100644
index 000000000..c2668aa95
--- /dev/null
+++ b/ext/pybind11/tests/test_callbacks.py
@@ -0,0 +1,98 @@
+import pytest
+
+
+def test_callbacks():
+ from functools import partial
+ from pybind11_tests import (test_callback1, test_callback2, test_callback3,
+ test_callback4, test_callback5)
+
+ def func1():
+ return "func1"
+
+ def func2(a, b, c, d):
+ return "func2", a, b, c, d
+
+ def func3(a):
+ return "func3({})".format(a)
+
+ assert test_callback1(func1) == "func1"
+ assert test_callback2(func2) == ("func2", "Hello", "x", True, 5)
+ assert test_callback1(partial(func2, 1, 2, 3, 4)) == ("func2", 1, 2, 3, 4)
+ assert test_callback1(partial(func3, "partial")) == "func3(partial)"
+ assert test_callback3(lambda i: i + 1) == "func(43) = 44"
+
+ f = test_callback4()
+ assert f(43) == 44
+ f = test_callback5()
+ assert f(number=43) == 44
+
+
+def test_keyword_args_and_generalized_unpacking():
+ from pybind11_tests import (test_tuple_unpacking, test_dict_unpacking, test_keyword_args,
+ test_unpacking_and_keywords1, test_unpacking_and_keywords2,
+ test_unpacking_error1, test_unpacking_error2,
+ test_arg_conversion_error1, test_arg_conversion_error2)
+
+ def f(*args, **kwargs):
+ return args, kwargs
+
+ assert test_tuple_unpacking(f) == (("positional", 1, 2, 3, 4, 5, 6), {})
+ assert test_dict_unpacking(f) == (("positional", 1), {"key": "value", "a": 1, "b": 2})
+ assert test_keyword_args(f) == ((), {"x": 10, "y": 20})
+ assert test_unpacking_and_keywords1(f) == ((1, 2), {"c": 3, "d": 4})
+ assert test_unpacking_and_keywords2(f) == (
+ ("positional", 1, 2, 3, 4, 5),
+ {"key": "value", "a": 1, "b": 2, "c": 3, "d": 4, "e": 5}
+ )
+
+ with pytest.raises(TypeError) as excinfo:
+ test_unpacking_error1(f)
+ assert "Got multiple values for keyword argument" in str(excinfo.value)
+
+ with pytest.raises(TypeError) as excinfo:
+ test_unpacking_error2(f)
+ assert "Got multiple values for keyword argument" in str(excinfo.value)
+
+ with pytest.raises(RuntimeError) as excinfo:
+ test_arg_conversion_error1(f)
+ assert "Unable to convert call argument" in str(excinfo.value)
+
+ with pytest.raises(RuntimeError) as excinfo:
+ test_arg_conversion_error2(f)
+ assert "Unable to convert call argument" in str(excinfo.value)
+
+
+def test_lambda_closure_cleanup():
+ from pybind11_tests import test_cleanup, payload_cstats
+
+ test_cleanup()
+ cstats = payload_cstats()
+ assert cstats.alive() == 0
+ assert cstats.copy_constructions == 1
+ assert cstats.move_constructions >= 1
+
+
+def test_cpp_function_roundtrip():
+ """Test if passing a function pointer from C++ -> Python -> C++ yields the original pointer"""
+ from pybind11_tests import dummy_function, dummy_function2, test_dummy_function, roundtrip
+
+ assert test_dummy_function(dummy_function) == "matches dummy_function: eval(1) = 2"
+ assert test_dummy_function(roundtrip(dummy_function)) == "matches dummy_function: eval(1) = 2"
+ assert roundtrip(None, expect_none=True) is None
+ assert test_dummy_function(lambda x: x + 2) == "can't convert to function pointer: eval(1) = 3"
+
+ with pytest.raises(TypeError) as excinfo:
+ test_dummy_function(dummy_function2)
+ assert "incompatible function arguments" in str(excinfo.value)
+
+ with pytest.raises(TypeError) as excinfo:
+ test_dummy_function(lambda x, y: x + y)
+ assert any(s in str(excinfo.value) for s in ("missing 1 required positional argument",
+ "takes exactly 2 arguments"))
+
+
+def test_function_signatures(doc):
+ from pybind11_tests import test_callback3, test_callback4
+
+ assert doc(test_callback3) == "test_callback3(arg0: Callable[[int], int]) -> str"
+ assert doc(test_callback4) == "test_callback4() -> Callable[[int], int]"