diff options
Diffstat (limited to '3rdparty/sol2/test_functions.cpp')
-rw-r--r-- | 3rdparty/sol2/test_functions.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/3rdparty/sol2/test_functions.cpp b/3rdparty/sol2/test_functions.cpp index 60a3c7020ef..f47a08dc6e1 100644 --- a/3rdparty/sol2/test_functions.cpp +++ b/3rdparty/sol2/test_functions.cpp @@ -12,6 +12,19 @@ std::function<int()> makefn() { return fx; } +template <typename T> +T va_func(sol::variadic_args va, T first) { + T s = 0; + for (auto arg : va) { + T v = arg; + s += v; + } + std::cout << first << std::endl; + std::cout << s << std::endl; + + return s; +} + void takefn(std::function<int()> purr) { if (purr() != 0x1456789) throw 0; @@ -947,3 +960,107 @@ TEST_CASE("functions/stack-protect", "make sure functions don't impede on the st } REQUIRE(sg.check_stack()); } + +TEST_CASE("functions/same-type-closures", "make sure destructions are per-object, not per-type, by destroying one type multiple times") { + static std::set<void*> last_my_closures; + static bool checking_closures = false; + static bool check_failed = false; + + struct my_closure { + int& n; + + my_closure(int& n) : n(n) {} + ~my_closure() noexcept(false) { + if (!checking_closures) + return; + void* addr = static_cast<void*>(this); + auto f = last_my_closures.find(addr); + if (f != last_my_closures.cend()) { + check_failed = true; + } + last_my_closures.insert(f, addr); + } + + int operator() () { + ++n; return n; + } + }; + + int n = 250; + my_closure a(n); + my_closure b(n); + { + sol::state lua; + + lua.set_function("f", a); + lua.set_function("g", b); + checking_closures = true; + } + REQUIRE_FALSE(check_failed); + REQUIRE(last_my_closures.size() == 2); +} + +TEST_CASE("functions/stack-multi-return", "Make sure the stack is protected after multi-returns") { + sol::state lua; + lua.script("function f () return 1, 2, 3, 4, 5 end"); + + { + sol::stack_guard sg(lua); + sol::stack::push(lua, double(256.78)); + { + int a, b, c, d, e; + sol::stack_guard sg2(lua); + sol::function f = lua["f"]; + sol::tie(a, b, c, d, e) = f(); + REQUIRE(a == 1); + REQUIRE(b == 2); + REQUIRE(c == 3); + REQUIRE(d == 4); + REQUIRE(e == 5); + } + double f = sol::stack::pop<double>(lua); + REQUIRE(f == 256.78); + } +} + +TEST_CASE("functions/protected-stack-multi-return", "Make sure the stack is protected after multi-returns") { + sol::state lua; + lua.script("function f () return 1, 2, 3, 4, 5 end"); + + { + sol::stack_guard sg(lua); + sol::stack::push(lua, double(256.78)); + { + int a, b, c, d, e; + sol::stack_guard sg2(lua); + sol::protected_function pf = lua["f"]; + sol::tie(a, b, c, d, e) = pf(); + REQUIRE(a == 1); + REQUIRE(b == 2); + REQUIRE(c == 3); + REQUIRE(d == 4); + REQUIRE(e == 5); + } + double f = sol::stack::pop<double>(lua); + REQUIRE(f == 256.78); + } +} + +TEST_CASE("functions/overloaded-variadic", "make sure variadics work to some degree with overloading") { + sol::state lua; + lua.open_libraries(); + + sol::table ssl = lua.create_named_table("ssl"); + ssl.set_function("test", sol::overload(&va_func<int>, &va_func<double>)); + + lua.script("a = ssl.test(1, 2, 3)"); + lua.script("b = ssl.test(1, 2)"); + lua.script("c = ssl.test(2.2)"); + + int a = lua["a"]; + int b = lua["b"]; + double c = lua["c"]; + REQUIRE(a == 6); + REQUIRE(b == 3); + REQUIRE(c == 2.2); +} |