#ifdef TESTS_BUILD #include "../../extern/catch.hpp" #include "../../src/ScriptResolving/AngelScript/AngelScripResolver.hpp" #include "../TestLibrary/TestLibrary.hpp" static std::unordered_map _scripts = std::unordered_map{ {"testScript1", R"( class testScript1 { int add(int a, int b) { return a + b; } void testFunc2(const Species@ s){ if (s.Name != "testSpecies2"){ throw("err"); } } } )"} }; static const char* _testLoadFunc(const char* name) { return _scripts[name]; } 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, then delete it") { auto lib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); lib->Initialize(TestLibrary::GetLibrary()); lib->SetCreateFunction(&_testLoadFunc); 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->SetCreateFunction(&_testLoadFunc); lib->CreateScript("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->SetCreateFunction(&_testLoadFunc); lib->CreateScript("testScript1"); lib->FinalizeModule(); auto obj = lib->LoadScript(AngelScripResolver::ScriptCategory::Creature, "testScript1"); 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->SetCreateFunction(&_testLoadFunc); lib->CreateScript("testScript1"); lib->FinalizeModule(); auto obj = dynamic_cast(lib->LoadScript(AngelScripResolver::ScriptCategory::Creature, "testScript1")); auto ctxPool = obj->GetContextPool(); auto ctx = ctxPool->RequestContext(); auto func = obj->PrepareMethod("add", 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; } #endif