// sol2 // The MIT License (MIT) // Copyright (c) 2013-2022 Rapptz, ThePhD and contributors // Permission is hereby granted, free of charge, to any person obtaining a copy of // this software and associated documentation files (the "Software"), to deal in // the Software without restriction, including without limitation the rights to // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of // the Software, and to permit persons to whom the Software is furnished to do so, // subject to the following conditions: // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include "sol_test.hpp" #include "common_classes.hpp" #include #include #include #include #include struct utility_counter { sol::stack_count count(sol::this_state s) { return sol::stack::multi_push(s, 1, 2, 3, 4); }; }; struct optional_ref_t { int x = 0; }; std::mutex basic_init_require_mutex; void basic_initialization_and_lib_open() { sol::state lua; try { lua.open_libraries(); lua["a"] = 24; int a = lua["a"]; { std::lock_guard lg(basic_init_require_mutex); REQUIRE(a == 24); } } catch (const sol::error& e) { std::lock_guard lg(basic_init_require_mutex); INFO(e.what()); REQUIRE(false); } catch (...) { std::lock_guard lg(basic_init_require_mutex); REQUIRE(false); } } TEST_CASE("utility/variant", "test that variant can be round-tripped") { SECTION("okay") { sol::state lua; lua.open_libraries(sol::lib::base); lua.set_function("f", [](int v) { return v == 2; }); lua.set_function("g", [](std::variant vv) { int v = std::get(vv); return v == 2; }); lua["v"] = std::variant(2); { auto result = lua.safe_script("assert(f(v))", sol::script_pass_on_error); REQUIRE(result.valid()); }; { auto result = lua.safe_script("assert(g(v))", sol::script_pass_on_error); REQUIRE(result.valid()); }; } SECTION("throws") { sol::state lua; lua.open_libraries(sol::lib::base); lua.set_function("f", [](int v) { return v == 2; }); lua.set_function("g", [](std::variant vv) { int v = std::get(vv); return v == 2; }); lua["v"] = std::variant(std::string("bark")); { auto result = lua.safe_script("assert(f(v))", sol::script_pass_on_error); REQUIRE_FALSE(result.valid()); }; { auto result = lua.safe_script("assert(g(v))", sol::script_pass_on_error); REQUIRE_FALSE(result.valid()); }; } } namespace detail { template struct optional_rebinder; template