#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 testMaximumLevel(const StaticLibrary@ s, uint8 level){ return s.Settings.MaximalLevel == level; } bool testMaximumMoves(const StaticLibrary@ s, uint8 moveCount){ return s.Settings.MaximalMoves == moveCount; } bool testSpeciesLibrary(const StaticLibrary@ s, const SpeciesLibrary@ speciesLib){ return s.SpeciesLibrary is speciesLib; } bool testMoveLibrary(const StaticLibrary@ s, const MoveLibrary@ moveLib){ return s.MoveLibrary is moveLib; } bool testItemLibrary(const StaticLibrary@ s, const ItemLibrary@ itemLib){ return s.ItemLibrary is itemLib; } bool testGrowthRateLibrary(const StaticLibrary@ s, const GrowthRateLibrary@ gl){ return s.GrowthRateLibrary is gl; } bool testTypeLibrary(const StaticLibrary@ s, const TypeLibrary@ tl){ return s.TypeLibrary is tl; } }} )"}}; 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 StaticLibrary Maximum Level in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testMaximumLevel"_cnc); data.Context->SetArgObject(0, (void*)mainLib->GetStaticLib().get()); data.Context->SetArgByte(1, mainLib->GetStaticLib()->GetSettings()->GetMaximalLevel()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate StaticLibrary Maximum Moves in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testMaximumMoves"_cnc); data.Context->SetArgObject(0, (void*)mainLib->GetStaticLib().get()); data.Context->SetArgByte(1, mainLib->GetStaticLib()->GetSettings()->GetMaximalAttacks()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate StaticLibrary Species Library in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testSpeciesLibrary"_cnc); data.Context->SetArgObject(0, (void*)mainLib->GetStaticLib().get()); data.Context->SetArgObject(1, (void*)mainLib->GetStaticLib()->GetSpeciesLibrary().get()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate StaticLibrary Move Library in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testMoveLibrary"_cnc); data.Context->SetArgObject(0, (void*)mainLib->GetStaticLib().get()); data.Context->SetArgObject(1, (void*)mainLib->GetStaticLib()->GetMoveLibrary().get()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate StaticLibrary Item Library in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testItemLibrary"_cnc); data.Context->SetArgObject(0, (void*)mainLib->GetStaticLib().get()); data.Context->SetArgObject(1, (void*)mainLib->GetStaticLib()->GetItemLibrary().get()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate StaticLibrary Growth Rate Library in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testGrowthRateLibrary"_cnc); data.Context->SetArgObject(0, (void*)mainLib->GetStaticLib().get()); data.Context->SetArgObject(1, (void*)mainLib->GetStaticLib()->GetGrowthRates().get()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } TEST_CASE("Validate StaticLibrary Type Library in Script") { auto mainLib = TestLibrary::GetLibrary(); auto data = GetScript(mainLib, "testTypeLibrary"_cnc); data.Context->SetArgObject(0, (void*)mainLib->GetStaticLib().get()); data.Context->SetArgObject(1, (void*)mainLib->GetStaticLib()->GetTypeLibrary().get()); auto result = data.Context->Execute(); REQUIRE(result == asEXECUTION_FINISHED); auto v = (bool)data.Context->GetReturnWord(); REQUIRE(v); } #endif