summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/sol2/test_functions.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/sol2/test_functions.cpp')
-rw-r--r--3rdparty/sol2/test_functions.cpp117
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);
+}