NazaraEngine/tests/Engine/Lua/LuaInstance.cpp

85 lines
1.9 KiB
C++

#include <Nazara/Lua/LuaInstance.hpp>
#include <Catch/catch.hpp>
#include <iostream>
SCENARIO("LuaInstance", "[LUA][LUAINSTANCE]")
{
GIVEN("One lua instance")
{
Nz::LuaInstance luaInstance;
WHEN("We set memory constraint")
{
luaInstance.SetMemoryLimit(1'000);
THEN("If we excess memory, it should crash")
{
REQUIRE_THROWS_WITH(luaInstance.Execute(R"(
global t = {}
for 1,10000000 do
t[i] = i
end
)"), Catch::Matchers::Contains("memory"));
}
}
WHEN("We set time constraint")
{
luaInstance.SetTimeLimit(10);
THEN("If we excess time, it should produce an error")
{
CHECK(!luaInstance.Execute(R"(
function ack(M,N)
if M == 0 then return N + 1 end
if N == 0 then return ack(M-1,1) end
return ack(M-1,ack(M, N-1))
end
ack(100, 100)
)"));
REQUIRE_THAT(luaInstance.GetLastError().ToStdString(), Catch::Matchers::Contains("time"));
}
}
}
GIVEN("Two instances")
{
Nz::LuaInstance luaInstance;
int memoryLimit = 10'000;
int timeLimit = 1'000;
luaInstance.SetMemoryLimit(memoryLimit);
luaInstance.SetTimeLimit(timeLimit);
int value = 5;
luaInstance.PushInteger(value);
WHEN("We use move constructor")
{
Nz::LuaInstance movedInstance(std::move(luaInstance));
THEN("We should be able to retrieve the value")
{
CHECK(movedInstance.CheckInteger(1) == value);
CHECK(movedInstance.GetMemoryLimit() == memoryLimit);
CHECK(movedInstance.GetTimeLimit() == timeLimit);
}
}
WHEN("We use move assignment")
{
Nz::LuaInstance movedInstance;
movedInstance.PushInteger(value + 1);
movedInstance = std::move(luaInstance);
THEN("We should be able to retrieve the value")
{
CHECK(movedInstance.CheckInteger(1) == value);
CHECK(movedInstance.GetMemoryLimit() == memoryLimit);
CHECK(movedInstance.GetTimeLimit() == timeLimit);
}
}
}
}