diff --git a/src/AngelScript/AngelScripResolver.cpp b/src/AngelScript/AngelScripResolver.cpp index 6de6a8a..df013c9 100644 --- a/src/AngelScript/AngelScripResolver.cpp +++ b/src/AngelScript/AngelScripResolver.cpp @@ -5,6 +5,7 @@ #include "TypeRegistry/Library/RegisterItemTypes.hpp" #include "TypeRegistry/Library/RegisterMoveTypes.hpp" #include "TypeRegistry/Library/RegisterSpeciesTypes.hpp" +#include "TypeRegistry/Library/RegisterStaticLibraryTypes.hpp" #include "TypeRegistry/Library/RegisterTypeLibrary.hpp" CreatureLib::Battling::ScriptResolver* PkmnLib::Battling::BattleLibrary::CreateScriptResolver() { @@ -36,6 +37,7 @@ void AngelScripResolver::Initialize(CreatureLib::Battling::BattleLibrary* librar RegisterMoveTypes::Register(_engine); RegisterGrowthRateTypes::Register(_engine); RegisterTypeLibrary::Register(_engine); + RegisterStaticLibraryTypes::Register(_engine); _mainModule = _engine->GetModule("pkmn", asGM_ALWAYS_CREATE); diff --git a/src/AngelScript/TypeRegistry/Library/RegisterStaticLibraryTypes.cpp b/src/AngelScript/TypeRegistry/Library/RegisterStaticLibraryTypes.cpp new file mode 100644 index 0000000..460ae2e --- /dev/null +++ b/src/AngelScript/TypeRegistry/Library/RegisterStaticLibraryTypes.cpp @@ -0,0 +1,43 @@ +#include "RegisterStaticLibraryTypes.hpp" +#include +#include "../../../Library/PokemonLibrary.hpp" + +void RegisterStaticLibraryTypes::Register(asIScriptEngine* engine) { + RegisterLibrarySettingsType(engine); + RegisterLibraryType(engine); +} + +void RegisterStaticLibraryTypes::RegisterLibrarySettingsType(asIScriptEngine* engine) { + [[maybe_unused]] int r = engine->RegisterObjectType("LibrarySettings", 0, asOBJ_REF | asOBJ_NOCOUNT); + r = engine->RegisterObjectMethod("LibrarySettings", "uint8 get_MaximalLevel() const property", + asMETHOD(CreatureLib::Library::LibrarySettings, GetMaximalLevel), asCALL_THISCALL); + assert(r >= 0); + r = engine->RegisterObjectMethod("LibrarySettings", "uint8 get_MaximalMoves() const property", + asMETHOD(CreatureLib::Library::LibrarySettings, GetMaximalMoves), asCALL_THISCALL); + assert(r >= 0); +} + +void RegisterStaticLibraryTypes::RegisterLibraryType(asIScriptEngine* engine) { + [[maybe_unused]] int r = engine->RegisterObjectType("StaticLibrary", 0, asOBJ_REF | asOBJ_NOCOUNT); + assert(r >= 0); + r = engine->RegisterObjectMethod("StaticLibrary", "const LibrarySettings& get_Settings() const property", + asMETHOD(PkmnLib::Library::PokemonLibrary, GetSettings), asCALL_THISCALL); + assert(r >= 0); + r = engine->RegisterObjectMethod("StaticLibrary", "const SpeciesLibrary@ get_SpeciesLibrary() const property", + asMETHOD(PkmnLib::Library::PokemonLibrary, GetSpeciesLibrary), asCALL_THISCALL); + assert(r >= 0); + r = engine->RegisterObjectMethod("StaticLibrary", "const MoveLibrary@ get_MoveLibrary() const property", + asMETHOD(PkmnLib::Library::PokemonLibrary, GetMoveLibrary), asCALL_THISCALL); + assert(r >= 0); + r = engine->RegisterObjectMethod("StaticLibrary", "const ItemLibrary@ get_ItemLibrary() const property", + asMETHOD(PkmnLib::Library::PokemonLibrary, GetItemLibrary), asCALL_THISCALL); + assert(r >= 0); + r = engine->RegisterObjectMethod("StaticLibrary", "const GrowthRateLibrary@ get_GrowthRateLibrary() const property", + asMETHOD(PkmnLib::Library::PokemonLibrary, GetGrowthRates), asCALL_THISCALL); + assert(r >= 0); + r = engine->RegisterObjectMethod("StaticLibrary", "const TypeLibrary@ get_TypeLibrary() const property", + asMETHOD(PkmnLib::Library::PokemonLibrary, GetTypeLibrary), asCALL_THISCALL); + assert(r >= 0); + + +} diff --git a/src/AngelScript/TypeRegistry/Library/RegisterStaticLibraryTypes.hpp b/src/AngelScript/TypeRegistry/Library/RegisterStaticLibraryTypes.hpp new file mode 100644 index 0000000..8354334 --- /dev/null +++ b/src/AngelScript/TypeRegistry/Library/RegisterStaticLibraryTypes.hpp @@ -0,0 +1,12 @@ +#ifndef PKMNLIB_REGISTERSTATICLIBRARYTYPES_HPP +#define PKMNLIB_REGISTERSTATICLIBRARYTYPES_HPP + +#include +class RegisterStaticLibraryTypes { + static void RegisterLibrarySettingsType(asIScriptEngine* engine); + static void RegisterLibraryType(asIScriptEngine* engine); +public: + static void Register(asIScriptEngine* engine); +}; + +#endif // PKMNLIB_REGISTERSTATICLIBRARYTYPES_HPP diff --git a/tests/ScriptTests/ScriptTypeTests/FormesTests.cpp b/tests/ScriptTests/ScriptTypeTests/Library/FormesTests.cpp similarity index 97% rename from tests/ScriptTests/ScriptTypeTests/FormesTests.cpp rename to tests/ScriptTests/ScriptTypeTests/Library/FormesTests.cpp index 8712386..513be39 100644 --- a/tests/ScriptTests/ScriptTypeTests/FormesTests.cpp +++ b/tests/ScriptTests/ScriptTypeTests/Library/FormesTests.cpp @@ -1,7 +1,7 @@ #ifdef TESTS_BUILD -#include "../../../extern/catch.hpp" -#include "../../../src/AngelScript/AngelScripResolver.hpp" -#include "../../TestLibrary/TestLibrary.hpp" +#include "../../../../extern/catch.hpp" +#include "../../../../src/AngelScript/AngelScripResolver.hpp" +#include "../../../TestLibrary/TestLibrary.hpp" static std::unordered_map _scripts = std::unordered_map{{"testScript1", R"( diff --git a/tests/ScriptTests/ScriptTypeTests/ItemDataTests.cpp b/tests/ScriptTests/ScriptTypeTests/Library/ItemDataTests.cpp similarity index 95% rename from tests/ScriptTests/ScriptTypeTests/ItemDataTests.cpp rename to tests/ScriptTests/ScriptTypeTests/Library/ItemDataTests.cpp index 442c0bc..437ec08 100644 --- a/tests/ScriptTests/ScriptTypeTests/ItemDataTests.cpp +++ b/tests/ScriptTests/ScriptTypeTests/Library/ItemDataTests.cpp @@ -1,7 +1,7 @@ #ifdef TESTS_BUILD -#include "../../../extern/catch.hpp" -#include "../../../src/AngelScript/AngelScripResolver.hpp" -#include "../../TestLibrary/TestLibrary.hpp" +#include "../../../../extern/catch.hpp" +#include "../../../../src/AngelScript/AngelScripResolver.hpp" +#include "../../../TestLibrary/TestLibrary.hpp" static std::unordered_map _scripts = std::unordered_map{{"testScript1", R"( diff --git a/tests/ScriptTests/ScriptTypeTests/MoveTests.cpp b/tests/ScriptTests/ScriptTypeTests/Library/MoveTests.cpp similarity index 97% rename from tests/ScriptTests/ScriptTypeTests/MoveTests.cpp rename to tests/ScriptTests/ScriptTypeTests/Library/MoveTests.cpp index a348e93..cfe417e 100644 --- a/tests/ScriptTests/ScriptTypeTests/MoveTests.cpp +++ b/tests/ScriptTests/ScriptTypeTests/Library/MoveTests.cpp @@ -1,7 +1,7 @@ #ifdef TESTS_BUILD -#include "../../../extern/catch.hpp" -#include "../../../src/AngelScript/AngelScripResolver.hpp" -#include "../../TestLibrary/TestLibrary.hpp" +#include "../../../../extern/catch.hpp" +#include "../../../../src/AngelScript/AngelScripResolver.hpp" +#include "../../../TestLibrary/TestLibrary.hpp" static std::unordered_map _scripts = std::unordered_map{{"testScript1", R"( diff --git a/tests/ScriptTests/ScriptTypeTests/SpeciesTests.cpp b/tests/ScriptTests/ScriptTypeTests/Library/SpeciesTests.cpp similarity index 97% rename from tests/ScriptTests/ScriptTypeTests/SpeciesTests.cpp rename to tests/ScriptTests/ScriptTypeTests/Library/SpeciesTests.cpp index f9067e8..95bec04 100644 --- a/tests/ScriptTests/ScriptTypeTests/SpeciesTests.cpp +++ b/tests/ScriptTests/ScriptTypeTests/Library/SpeciesTests.cpp @@ -1,7 +1,7 @@ #ifdef TESTS_BUILD -#include "../../../extern/catch.hpp" -#include "../../../src/AngelScript/AngelScripResolver.hpp" -#include "../../TestLibrary/TestLibrary.hpp" +#include "../../../../extern/catch.hpp" +#include "../../../../src/AngelScript/AngelScripResolver.hpp" +#include "../../../TestLibrary/TestLibrary.hpp" static std::unordered_map _scripts = std::unordered_map{{"testScript1", R"( diff --git a/tests/ScriptTests/ScriptTypeTests/Library/StaticLibraryTests.cpp b/tests/ScriptTests/ScriptTypeTests/Library/StaticLibraryTests.cpp new file mode 100644 index 0000000..08715a9 --- /dev/null +++ b/tests/ScriptTests/ScriptTypeTests/Library/StaticLibraryTests.cpp @@ -0,0 +1,147 @@ +#ifdef TESTS_BUILD +#include "../../../../extern/catch.hpp" +#include "../../../../src/AngelScript/AngelScripResolver.hpp" +#include "../../../TestLibrary/TestLibrary.hpp" + +static std::unordered_map _scripts = + std::unordered_map{{"testScript1", R"( +class testScript1 { + 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; } +} +)"}}; + +static const char* _testLoadFunc(const char* name) { return _scripts[name]; } + +struct ScriptData { + AngelScriptScript* Script; + AngelScripResolver* Resolver; + asIScriptFunction* Func; + asIScriptContext* Context; + + ~ScriptData() { + Script->GetContextPool()->ReturnContextToPool(Context); + delete Script; + delete Resolver; + } +}; + +static ScriptData GetScript(PkmnLib::Battling::BattleLibrary* mainLib, const char* funcName) { + auto lib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); + lib->Initialize(mainLib); + lib->SetCreateFunction(&_testLoadFunc); + lib->CreateScript("testScript1"); + lib->FinalizeModule(); + auto s = lib->LoadScript(AngelScripResolver::ScriptCategory::Creature, "testScript1"); + auto script = dynamic_cast(s); + 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"); + + data.Context->SetArgObject(0, const_cast(mainLib->GetStaticLib())); + 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"); + + data.Context->SetArgObject(0, const_cast(mainLib->GetStaticLib())); + data.Context->SetArgByte(1, mainLib->GetStaticLib()->GetSettings().GetMaximalMoves()); + + 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"); + + data.Context->SetArgObject(0, const_cast(mainLib->GetStaticLib())); + data.Context->SetArgObject( + 1, const_cast(mainLib->GetStaticLib()->GetSpeciesLibrary())); + + 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"); + + data.Context->SetArgObject(0, const_cast(mainLib->GetStaticLib())); + data.Context->SetArgObject(1, + const_cast(mainLib->GetStaticLib()->GetMoveLibrary())); + + 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"); + + data.Context->SetArgObject(0, const_cast(mainLib->GetStaticLib())); + data.Context->SetArgObject(1, + const_cast(mainLib->GetStaticLib()->GetItemLibrary())); + + 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"); + + data.Context->SetArgObject(0, const_cast(mainLib->GetStaticLib())); + data.Context->SetArgObject( + 1, const_cast(mainLib->GetStaticLib()->GetGrowthRates())); + + 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"); + + data.Context->SetArgObject(0, const_cast(mainLib->GetStaticLib())); + data.Context->SetArgObject( + 1, const_cast(mainLib->GetStaticLib()->GetTypeLibrary())); + + auto result = data.Context->Execute(); + REQUIRE(result == asEXECUTION_FINISHED); + auto v = (bool)data.Context->GetReturnWord(); + REQUIRE(v); +} + +#endif \ No newline at end of file