Files
Viano-Core/tests/clientless/test_adventure_profession_profile.py
T

55 lines
3.0 KiB
Python

"""Execute the production profession parser with real Lua and saved profiles."""
from pathlib import Path
import subprocess
import tempfile
root = Path(__file__).resolve().parents[2]
source = (root/'src/server/game/World/ClientlessLuaEngine.cpp').read_text()
a = source.index(' lua_getfield(_state,rootTable,"professions");')
b = source.index(' // All autonomous level60+', a)
code = r'''
#include <lua.hpp>
#include "AdventureProfessionPolicy.h"
#include <cassert>
#define TC_LOG_WARN(...) ((void)0)
struct Profile { AdventureProfessionPolicy::Professions PrimaryProfessions; };
Profile parse(lua_State* _state) {
Profile profile;int rootTable=lua_gettop(_state);
'''+source[a:b]+r'''
assert(lua_gettop(_state)==rootTable);return profile;
}
void check(Profile const& p,bool mining,bool herbs) {
using namespace AdventureProfessionPolicy;
assert(Allowed("work_mining",p.PrimaryProfessions)==mining);
assert(Allowed("ore_inspect",p.PrimaryProfessions)==mining);
assert(Allowed("work_smelting",p.PrimaryProfessions)==mining);
assert(Allowed("work_blacksmithing",p.PrimaryProfessions)==mining);
assert(Allowed("work_herbalism",p.PrimaryProfessions)==herbs);
assert(Allowed("work_alchemy",p.PrimaryProfessions)==herbs);
for(auto kind:{"work_first_aid","work_cooking","work_wood","profession_tools"})assert(Allowed(kind,p.PrimaryProfessions));
assert(SkillAllowed(356,p.PrimaryProfessions));assert(!SkillAllowed(99999,p.PrimaryProfessions));
}
int main(int argc,char** argv) {
lua_State* L=luaL_newstate();luaL_openlibs(L);
assert(luaL_dofile(L,argv[1])==LUA_OK);check(parse(L),true,false);lua_settop(L,0);
assert(luaL_dofile(L,argv[2])==LUA_OK);check(parse(L),false,false);lua_settop(L,0);
for(auto text:{"return {}","return {professions={primary={}}}",
"return {professions={primary={'Mining','unknown',17,false,{}}}}",
"return {professions={primary='mining'}}","return {professions=false}"}) {
assert(luaL_dostring(L,text)==LUA_OK);check(parse(L),false,false);lua_settop(L,0);
}
assert(luaL_dostring(L,"return {professions={primary={'herbalism','alchemy','alchemy'}}}")==LUA_OK);
auto herbs=parse(L);check(herbs,false,true);assert(herbs.PrimaryProfessions.size()==2);
using namespace AdventureProfessionPolicy;
assert(Legacy("ore")=="work_mining"&&Legacy("forge")=="work_blacksmithing"&&Legacy("unknown").empty());
assert(!Allowed(Legacy("ore"),herbs.PrimaryProfessions));
lua_close(L);
}
'''
with tempfile.TemporaryDirectory(prefix='vcore-profession-profile-') as folder:
cpp=Path(folder)/'test.cpp'; binary=Path(folder)/'test';cpp.write_text(code)
flags=subprocess.check_output(['pkg-config','--cflags','--libs','lua5.4'],text=True).split()
subprocess.run(['c++','-std=c++17','-I',str(root/'src/server/game/World'),str(cpp),'-o',str(binary),*flags],check=True)
profiles=root/'src/server/scripts/Custom/clientless/adventure/profiles'
subprocess.run([str(binary),str(profiles/'arthoran.lua'),str(profiles/'generic.lua')],check=True)
print('Production profession parser, real Lua profiles, primary restrictions and secondary permissions passed.')