mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-01 00:45:34 +00:00
Lua coroutine crash tests
This commit is contained in:
parent
4f25796029
commit
5cf96a808e
2 changed files with 56 additions and 0 deletions
|
@ -27,6 +27,7 @@ file(GLOB UNITTEST_SRC_FILES
|
||||||
lua/test_configuration.cpp
|
lua/test_configuration.cpp
|
||||||
lua/test_l10n.cpp
|
lua/test_l10n.cpp
|
||||||
lua/test_storage.cpp
|
lua/test_storage.cpp
|
||||||
|
lua/test_async.cpp
|
||||||
|
|
||||||
lua/test_ui_content.cpp
|
lua/test_ui_content.cpp
|
||||||
|
|
||||||
|
|
55
apps/openmw_test_suite/lua/test_async.cpp
Normal file
55
apps/openmw_test_suite/lua/test_async.cpp
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
#include "gmock/gmock.h"
|
||||||
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
|
#include <components/lua/luastate.hpp>
|
||||||
|
#include <components/lua/scriptscontainer.hpp>
|
||||||
|
|
||||||
|
#include "../testing_util.hpp"
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
using namespace testing;
|
||||||
|
using namespace TestingOpenMW;
|
||||||
|
|
||||||
|
struct LuaCoroutineCallbackTest : Test
|
||||||
|
{
|
||||||
|
void SetUp() override
|
||||||
|
{
|
||||||
|
mLua.open_libraries(sol::lib::coroutine);
|
||||||
|
mLua["callback"] = [&](sol::protected_function fn) -> LuaUtil::Callback {
|
||||||
|
sol::table hiddenData(mLua, sol::create);
|
||||||
|
hiddenData[LuaUtil::ScriptsContainer::sScriptIdKey] = sol::table(mLua, sol::create);
|
||||||
|
return LuaUtil::Callback{ std::move(fn), hiddenData };
|
||||||
|
};
|
||||||
|
mLua["pass"] = [this](LuaUtil::Callback callback) { mCb = callback; };
|
||||||
|
}
|
||||||
|
|
||||||
|
sol::state mLua;
|
||||||
|
LuaUtil::Callback mCb;
|
||||||
|
};
|
||||||
|
|
||||||
|
TEST_F(LuaCoroutineCallbackTest, CoroutineCallbacks)
|
||||||
|
{
|
||||||
|
internal::CaptureStdout();
|
||||||
|
mLua.safe_script(R"X(
|
||||||
|
local s = 'test'
|
||||||
|
coroutine.wrap(function()
|
||||||
|
pass(callback(function(v) print(s) end))
|
||||||
|
end)()
|
||||||
|
)X");
|
||||||
|
mLua.collect_garbage();
|
||||||
|
mCb.call();
|
||||||
|
EXPECT_THAT(internal::GetCapturedStdout(), "test\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(LuaCoroutineCallbackTest, ErrorInCoroutineCallbacks)
|
||||||
|
{
|
||||||
|
mLua.safe_script(R"X(
|
||||||
|
coroutine.wrap(function()
|
||||||
|
pass(callback(function() error('COROUTINE CALLBACK') end))
|
||||||
|
end)()
|
||||||
|
)X");
|
||||||
|
mLua.collect_garbage();
|
||||||
|
EXPECT_ERROR(mCb.call(), "COROUTINE CALLBACK");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue