#if TESTS_BUILD and 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 Item@ i, const constString &in name){ return i.Name == name; } bool testCategory(const Item@ i, ItemCategory category){ return i.Category == category; } bool testBattleCategory(const Item@ i, BattleItemCategory category){ return i.BattleCategory == category; } bool testPrice(const Item@ i, int price){ return i.Price == price; } }} )"}}; struct ScriptData { AngelScriptScript* Script = nullptr; AngelScriptResolver* Resolver = nullptr; asIScriptFunction* Func = nullptr; asIScriptContext* Context = nullptr; ~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 Item Name in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testName"_cnc); auto item = mainLib->GetItemLibrary()->Get("testItem"_cnc); data.Context->SetArgObject(0, (void*)item.GetRaw()); auto name = item->GetName(); data.Context->SetArgAddress(1, &name); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Item Category in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testCategory"_cnc); auto item = mainLib->GetItemLibrary()->Get("testItem"_cnc); data.Context->SetArgObject(0, (void*)item.GetRaw()); data.Context->SetArgDWord(1, static_cast(item->GetCategory())); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Item Battle Category in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testBattleCategory"_cnc); auto item = mainLib->GetItemLibrary()->Get("testItem"_cnc); data.Context->SetArgObject(0, (void*)item.GetRaw()); data.Context->SetArgDWord(1, static_cast(item->GetBattleCategory())); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Item Price in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testPrice"_cnc); auto item = mainLib->GetItemLibrary()->Get("testItem"_cnc); data.Context->SetArgObject(0, (void*)item.GetRaw()); data.Context->SetArgDWord(1, static_cast(item->GetPrice())); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } #endif