mirror of
https://github.com/ModOrganizer2/modorganizer-plugin_python.git
synced 2026-07-27 14:03:33 -07:00
Add custom std::function<> caster.
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
#include "pybind11_utils/functional.h"
|
||||
|
||||
#include <pybind11/pybind11.h>
|
||||
|
||||
PYBIND11_MODULE(functional, m)
|
||||
{
|
||||
m.def("fn_0_arg", [](std::function<int()> const& fn) {
|
||||
return fn();
|
||||
});
|
||||
|
||||
m.def("fn_1_arg", [](std::function<int(int)> const& fn, int a) {
|
||||
return fn(a);
|
||||
});
|
||||
|
||||
m.def("fn_2_arg", [](std::function<int(int, int)> const& fn, int a, int b) {
|
||||
return fn(a, b);
|
||||
});
|
||||
|
||||
m.def("fn_0_or_1_arg", [](std::function<int()> const& fn) {
|
||||
return fn();
|
||||
});
|
||||
|
||||
m.def("fn_0_or_1_arg", [](std::function<int(int)> const& fn) {
|
||||
return fn(1);
|
||||
});
|
||||
|
||||
m.def("fn_1_or_2_or_3_arg", [](std::function<int(int)> const& fn) {
|
||||
return fn(1);
|
||||
});
|
||||
|
||||
m.def("fn_1_or_2_or_3_arg", [](std::function<int(int, int)> const& fn) {
|
||||
return fn(1, 2);
|
||||
});
|
||||
|
||||
m.def("fn_1_or_2_or_3_arg", [](std::function<int(int, int, int)> const& fn) {
|
||||
return fn(1, 2, 3);
|
||||
});
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
import mobase
|
||||
import pytest
|
||||
|
||||
m = pytest.importorskip("mobase_tests.functional")
|
||||
|
||||
|
||||
def test_guessed_string():
|
||||
|
||||
# available functions:
|
||||
# - fn_0_arg, fn_1_arg, fn_2_arg
|
||||
# - fn_0_or_1_arg, fn_1_or_2_or_3_arg
|
||||
|
||||
assert m.fn_0_arg(lambda: 0) == 0
|
||||
assert m.fn_0_arg(lambda: 5) == 5
|
||||
assert m.fn_0_arg(lambda x=2: x) == 2
|
||||
assert m.fn_0_arg(lambda *args: len(args)) == 0
|
||||
|
||||
assert m.fn_1_arg(lambda x: x, 4) == 4
|
||||
assert m.fn_1_arg(lambda *args: sum(args), 8) == 8
|
||||
assert m.fn_1_arg(lambda x=2, y=4: x + y, 3) == 7
|
||||
assert m.fn_1_arg(lambda x, *args, **kwargs: x + len(args), 5) == 5
|
||||
|
||||
assert m.fn_2_arg(lambda x, y: x * y, 4, 5) == 20
|
||||
assert m.fn_2_arg(lambda x, y=3: x * y, 4, 2) == 8
|
||||
assert m.fn_2_arg(lambda *args: sum(args), 8, 9) == 17
|
||||
assert m.fn_2_arg(lambda x=2, y=4: x + y, 3, 3) == 6
|
||||
assert m.fn_2_arg(lambda x, *args, **kwargs: x + len(args), 5, 2) == 6
|
||||
|
||||
assert m.fn_0_or_1_arg(lambda: 3) == 3
|
||||
assert m.fn_0_or_1_arg(lambda x: x) == 1
|
||||
|
||||
# the 0 arg is bound first, both are possible, the 0 arg is chosen
|
||||
assert m.fn_0_or_1_arg(lambda x=2: x) == 2
|
||||
|
||||
with pytest.raises(TypeError):
|
||||
m.fn_1_or_2_or_3_arg(lambda: 0)
|
||||
|
||||
assert m.fn_1_or_2_or_3_arg(lambda x=4: x) == 1
|
||||
assert m.fn_1_or_2_or_3_arg(lambda x, y: x + y) == 3 # 1 + 2
|
||||
assert m.fn_1_or_2_or_3_arg(lambda x, y, z: x * y * z) == 6 # 1 * 2 * 3
|
||||
|
||||
# the 1 arg is bound first
|
||||
assert m.fn_1_or_2_or_3_arg(lambda *args: sum(args)) == 1
|
||||
Reference in New Issue
Block a user