#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 MoveData@ s, const constString &in name){ return s.Name == name; } bool testType(const MoveData@ s, uint8 type){ return s.Type == type; } bool testCategory(const MoveData@ s, MoveCategory category){ return s.Category == category; } bool testBasePower(const MoveData@ s, uint8 basePower){ return s.BasePower == basePower; } bool testAccuracy(const MoveData@ s, uint8 accuracy){ return s.Accuracy == accuracy; } bool testBaseUsages(const MoveData@ s, uint8 baseUsages){ return s.BaseUsages == baseUsages; } bool testTarget(const MoveData@ s, MoveTarget target){ return s.Target == target; } bool testPriority(const MoveData@ s, int8 priority){ return s.Priority == priority; } }} )"}}; 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 Move Name in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testName"_cnc); auto move = mainLib->GetMoveLibrary()->GetByHash("testMove"_cnc); data.Context->SetArgObject(0, (void*)move.GetRaw()); auto name = move->GetName(); data.Context->SetArgAddress(1, &name); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Move Type in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testType"_cnc); auto move = mainLib->GetMoveLibrary()->GetByHash("testMove"_cnc); data.Context->SetArgObject(0, (void*)move.GetRaw()); data.Context->SetArgByte(1, move->GetType()); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Move Category in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testCategory"_cnc); auto move = mainLib->GetMoveLibrary()->GetByHash("testMove"_cnc); data.Context->SetArgObject(0, (void*)move.GetRaw()); data.Context->SetArgDWord(1, (asDWORD)move->GetCategory()); auto result = data.Context->Execute(); INFO("exception: " << data.Context->GetExceptionString()); REQUIRE(result == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnByte()); } TEST_CASE("Validate Move BasePower in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testBasePower"_cnc); auto move = mainLib->GetMoveLibrary()->GetByHash("testMove"_cnc); data.Context->SetArgObject(0, (void*)move.GetRaw()); data.Context->SetArgByte(1, move->GetBasePower()); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Move Accuracy in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testAccuracy"_cnc); auto move = mainLib->GetMoveLibrary()->GetByHash("testMove"_cnc); data.Context->SetArgObject(0, (void*)move.GetRaw()); data.Context->SetArgByte(1, move->GetAccuracy()); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Move BaseUsages in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testBaseUsages"_cnc); auto move = mainLib->GetMoveLibrary()->GetByHash("testMove"_cnc); data.Context->SetArgObject(0, (void*)move.GetRaw()); data.Context->SetArgByte(1, move->GetBaseUsages()); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Move Target in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testTarget"_cnc); auto move = mainLib->GetMoveLibrary()->GetByHash("testMove"_cnc); data.Context->SetArgObject(0, (void*)move.GetRaw()); data.Context->SetArgDWord(1, (uint32_t)move->GetTarget()); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } TEST_CASE("Validate Move Priority in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testPriority"_cnc); auto move = mainLib->GetMoveLibrary()->GetByHash("testMove"_cnc); data.Context->SetArgObject(0, (void*)move.GetRaw()); data.Context->SetArgByte(1, move->GetPriority()); REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); REQUIRE((bool)data.Context->GetReturnWord()); } #endif