#if TESTS_BUILD && ANGELSCRIPT #include #include "../../../../TestLibrary/TestLibrary.hpp" #include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp" #include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp" static std::unordered_map _scripts = std::unordered_map{{"testScript1", R"( namespace Pokemon{ [Pokemon effect=testScript1] class testScript1 : PkmnScript { bool testName(const Species@ s, const constString &in name){ return s.Name == name; } bool testId(const Species@ s, uint16 id){ return s.Id == id; } bool testGenderRate(const Species@ s, float rate){ return s.GenderRate == rate; } bool testCaptureRate(const Species@ s, uint8 rate){ return s.CaptureRate == rate; } bool testGetForme(const Species@ s, const Forme@ forme){ return s.GetForme("default") is forme; } bool testGetDefaultForme(const Species@ s, const Forme@ forme){ return s.DefaultForme is forme; } }} )"}}; struct ScriptData { AngelScriptScript* Script; AngelScriptResolver* Resolver; asIScriptFunction* Func; asIScriptContext* Context; ~ScriptData() { Script->GetContextPool()->ReturnContextToPool(Context); delete Script; } }; static AngelScriptResolver* _resolverCache = nullptr; static AngelScriptResolver* GetScriptResolver(PkmnLib::Battling::BattleLibrary* mainLib) { if (_resolverCache == nullptr) { _resolverCache = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); _resolverCache->Initialize(mainLib); _resolverCache->CreateScript("testScript1", _scripts["testScript1"]); _resolverCache->FinalizeModule(); } return _resolverCache; } static ScriptData GetScript(PkmnLib::Battling::BattleLibrary* mainLib, const ArbUt::StringView& funcName) { auto lib = GetScriptResolver(mainLib); auto s = lib->LoadScript(nullptr, ScriptCategory::Creature, "testScript1"_cnc).TakeOwnership(); auto script = dynamic_cast(s); REQUIRE(script != nullptr); auto ctxPool = script->GetContextPool(); auto ctx = ctxPool->RequestContext(); auto func = script->PrepareMethod(funcName, ctx); REQUIRE(func != nullptr); return {.Script = script, .Resolver = lib, .Func = func, .Context = ctx}; } TEST_CASE("Validate Species Name in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testName"_cnc); auto species = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc); data.Context->SetArgObject(0, (void*)species.GetRaw()); auto name = species->GetName(); data.Context->SetArgAddress(1, &name); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate Species Id in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testId"_cnc); auto species = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc); data.Context->SetArgObject(0, (void*)species.GetRaw()); data.Context->SetArgWord(1, species->GetId()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate Species Gender Rate in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testGenderRate"_cnc); auto species = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc); data.Context->SetArgObject(0, (void*)species.GetRaw()); data.Context->SetArgFloat(1, species->GetGenderRate()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnDWord(); REQUIRE(v); } TEST_CASE("Validate Species Capture Rate in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testCaptureRate"_cnc); auto species = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc); data.Context->SetArgObject(0, (void*)species.GetRaw()); data.Context->SetArgByte(1, species->GetCaptureRate()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate Species Get Forme in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testGetForme"_cnc); auto species = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc); data.Context->SetArgObject(0, (void*)species.GetRaw()); data.Context->SetArgObject(1, (void*)species->GetForme("default"_cnc).GetRaw()); auto result = data.Context->Execute(); if (result == asEXECUTION_EXCEPTION) { FAIL(data.Context->GetExceptionString()); } REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate Species Get Default Forme in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testGetDefaultForme"_cnc); auto species = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc); data.Context->SetArgObject(0, (void*)species.GetRaw()); data.Context->SetArgObject(1, (void*)species->GetDefaultForme().GetRaw()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } #endif