#if TESTS_BUILD && ANGELSCRIPT #include #include "../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp" #include "../../src/ScriptResolving/AngelScript/ContextPool.hpp" #include "../TestLibrary/TestLibrary.hpp" static std::unordered_map _scripts = std::unordered_map{{"testScript1", R"( namespace Pokemon{ [Pokemon effect=testScript1] class testScript1 : PkmnScript { int add(int a, int b) { return a + b; } void testFunc2(const Species@ s){ if (s.Name != "testSpecies2"){ throw("err"); } } void OnInitialize(const BattleLibrary@ library, const narray@ parameters) override { } } } )"}}; TEST_CASE("Get a script resolver, initialize it, then delete it") { auto lib = PkmnLib::Battling::BattleLibrary::CreateScriptResolver(); lib->Initialize(TestLibrary::GetLibrary()); delete lib; } TEST_CASE("Get a script resolver, set script load function, load script, then build module") { auto lib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); lib->Initialize(TestLibrary::GetLibrary()); lib->CreateScript("testScript1", _scripts["testScript1"]); lib->FinalizeModule(); delete lib; } TEST_CASE("Build script resolver, then create object") { auto lib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); lib->Initialize(TestLibrary::GetLibrary()); lib->CreateScript("testScript1", _scripts["testScript1"]); lib->FinalizeModule(); auto obj = lib->LoadScript(nullptr, ScriptCategory::Creature, "testScript1"_cnc); delete obj; delete lib; } TEST_CASE("Build script resolver, create object, invoke addition method") { auto lib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); lib->Initialize(TestLibrary::GetLibrary()); lib->CreateScript("testScript1", _scripts["testScript1"]); lib->FinalizeModule(); auto obj = dynamic_cast(lib->LoadScript(nullptr, ScriptCategory::Creature, "testScript1"_cnc)); REQUIRE(obj != nullptr); auto ctxPool = obj->GetContextPool(); auto ctx = ctxPool->RequestContext(); auto func = obj->PrepareMethod("add"_cnc, ctx); REQUIRE(func != nullptr); ctx->SetArgDWord(0, 5); ctx->SetArgDWord(1, 100); auto result = ctx->Execute(); if (result == asEXECUTION_EXCEPTION) { FAIL(ctx->GetExceptionString()); } CHECK(result == asEXECUTION_FINISHED); auto returnValue = ctx->GetReturnDWord(); REQUIRE(returnValue == 105); ctxPool->ReturnContextToPool(ctx); delete obj; delete lib; } TEST_CASE("Get a script resolver, save the byte code to memory, create new script resolver from it") { auto originLib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); originLib->Initialize(TestLibrary::GetLibrary()); originLib->CreateScript("testScript1", _scripts["testScript1"]); originLib->FinalizeModule(); auto obj = dynamic_cast(originLib->LoadScript(nullptr, ScriptCategory::Creature, "testScript1"_cnc)); REQUIRE(obj != nullptr); REQUIRE(obj->GetType()->GetOnInitialize().Exists); delete obj; size_t size; auto byteCode = originLib->WriteByteCodeToMemory(size); auto newLib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); newLib->Initialize(TestLibrary::GetLibrary()); newLib->LoadByteCodeFromMemory(byteCode, size); obj = dynamic_cast(newLib->LoadScript(nullptr, ScriptCategory::Creature, "testScript1"_cnc)); REQUIRE(obj != nullptr); REQUIRE(obj->GetType()->GetOnInitialize().Exists); delete obj; delete originLib; delete newLib; free(byteCode); } TEST_CASE("Get a script resolver, save the byte code to file, create new script resolver from it") { auto originLib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); originLib->Initialize(TestLibrary::GetLibrary()); originLib->CreateScript("testScript1", _scripts["testScript1"]); originLib->FinalizeModule(); originLib->WriteByteCodeToFile("foo.bin"); auto newLib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); newLib->Initialize(TestLibrary::GetLibrary()); newLib->LoadByteCodeFromFile("foo.bin"); auto obj = dynamic_cast(newLib->LoadScript(nullptr, ScriptCategory::Creature, "testScript1"_cnc)); REQUIRE(obj != nullptr); delete obj; delete originLib; delete newLib; remove("foo.bin"); } #endif