From f32db7a751d85a5b4ded65209e630f64d0a9b352 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 18 Jan 2020 13:07:56 +0100 Subject: [PATCH] Tests for forme fields in AngelScript. --- src/AngelScript/AngelScripResolver.cpp | 1 + .../Library/RegisterSpeciesTypes.cpp | 2 +- src/Library/Species/PokemonForme.hpp | 1 + .../ScriptTypeTests/FormesTests.cpp | 168 ++++++++++++++++++ .../ScriptTypeTests/SpeciesTests.cpp | 6 +- 5 files changed, 174 insertions(+), 4 deletions(-) create mode 100644 tests/ScriptTests/ScriptTypeTests/FormesTests.cpp diff --git a/src/AngelScript/AngelScripResolver.cpp b/src/AngelScript/AngelScripResolver.cpp index 9bd3dfe..6de6a8a 100644 --- a/src/AngelScript/AngelScripResolver.cpp +++ b/src/AngelScript/AngelScripResolver.cpp @@ -18,6 +18,7 @@ void AngelScripResolver::Initialize(CreatureLib::Battling::BattleLibrary* librar _engine->SetEngineProperty(asEP_DISALLOW_VALUE_ASSIGN_FOR_REF_TYPE, true); _engine->SetEngineProperty(asEP_ALWAYS_IMPL_DEFAULT_CONSTRUCT, true); _engine->SetEngineProperty(asEP_AUTO_GARBAGE_COLLECT, false); + _engine->SetEngineProperty(asEP_REQUIRE_ENUM_SCOPE, true); int32_t r = _engine->SetMessageCallback(asFUNCTION(MessageCallback), nullptr, asCALL_CDECL); if (r < 0) diff --git a/src/AngelScript/TypeRegistry/Library/RegisterSpeciesTypes.cpp b/src/AngelScript/TypeRegistry/Library/RegisterSpeciesTypes.cpp index a708d6b..ed22176 100644 --- a/src/AngelScript/TypeRegistry/Library/RegisterSpeciesTypes.cpp +++ b/src/AngelScript/TypeRegistry/Library/RegisterSpeciesTypes.cpp @@ -85,7 +85,7 @@ void RegisterSpeciesTypes::RegisterFormeType(asIScriptEngine* engine) { r = engine->RegisterObjectMethod("Forme", "int get_TypeCount() const property", asMETHOD(PkmnLib::Library::PokemonForme, GetTypeCount), asCALL_THISCALL); assert(r >= 0); - r = engine->RegisterObjectMethod("Forme", "float GetType(int index) const", + r = engine->RegisterObjectMethod("Forme", "uint8 GetType(int index) const", asMETHOD(PkmnLib::Library::PokemonForme, GetType), asCALL_THISCALL); assert(r >= 0); r = engine->RegisterObjectMethod("Forme", "uint GetStatistic(Statistic stat) const", diff --git a/src/Library/Species/PokemonForme.hpp b/src/Library/Species/PokemonForme.hpp index 093cee6..0cb508a 100644 --- a/src/Library/Species/PokemonForme.hpp +++ b/src/Library/Species/PokemonForme.hpp @@ -12,6 +12,7 @@ namespace PkmnLib::Library { private: public: + inline const std::string& GetAbility(int index) const { return GetTalent(index); } }; } diff --git a/tests/ScriptTests/ScriptTypeTests/FormesTests.cpp b/tests/ScriptTests/ScriptTypeTests/FormesTests.cpp new file mode 100644 index 0000000..8712386 --- /dev/null +++ b/tests/ScriptTests/ScriptTypeTests/FormesTests.cpp @@ -0,0 +1,168 @@ +#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 testName(const Forme@ s, const string &in name){ return s.Name == name; } + bool testWeight(const Forme@ s, float weight){ return s.Weight == weight; } + bool testHeight(const Forme@ s, float height){ return s.Height == height; } + bool testBaseExperience(const Forme@ s, uint baseExperience){ return s.BaseExperience == baseExperience; } + bool testTypeCount(const Forme@ s, int typeCount){ return s.TypeCount == typeCount; } + bool testGetType(const Forme@ s, uint8 type){ return s.GetType(0) == type; } + bool testGetStatistic(const Forme@ s, Statistic stat, uint value){ return s.GetStatistic(stat) == value; } + bool testGetAbility(const Forme@ s, const string &in ability){ return s.GetAbility(0) == ability; } +} +)"}}; + +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 Forme Name in Script") { + auto mainLib = TestLibrary::GetLibrary(); + auto data = GetScript(mainLib, "testName"); + + auto forme = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2")->GetDefaultForme(); + data.Context->SetArgObject(0, const_cast(forme)); + auto name = forme->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 Forme Weight in Script") { + auto mainLib = TestLibrary::GetLibrary(); + auto data = GetScript(mainLib, "testWeight"); + + auto forme = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2")->GetDefaultForme(); + data.Context->SetArgObject(0, const_cast(forme)); + data.Context->SetArgFloat(1, forme->GetWeight()); + + auto result = data.Context->Execute(); + REQUIRE(result == asEXECUTION_FINISHED); + auto v = (bool)data.Context->GetReturnWord(); + REQUIRE(v); +} + +TEST_CASE("Validate Forme Height in Script") { + auto mainLib = TestLibrary::GetLibrary(); + auto data = GetScript(mainLib, "testHeight"); + + auto forme = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2")->GetDefaultForme(); + data.Context->SetArgObject(0, const_cast(forme)); + data.Context->SetArgFloat(1, forme->GetHeight()); + + auto result = data.Context->Execute(); + REQUIRE(result == asEXECUTION_FINISHED); + auto v = (bool)data.Context->GetReturnWord(); + REQUIRE(v); +} + +TEST_CASE("Validate Forme Base Experience in Script") { + auto mainLib = TestLibrary::GetLibrary(); + auto data = GetScript(mainLib, "testBaseExperience"); + + auto forme = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2")->GetDefaultForme(); + data.Context->SetArgObject(0, const_cast(forme)); + data.Context->SetArgDWord(1, forme->GetBaseExperience()); + + auto result = data.Context->Execute(); + REQUIRE(result == asEXECUTION_FINISHED); + auto v = (bool)data.Context->GetReturnWord(); + REQUIRE(v); +} + +TEST_CASE("Validate Forme Type Count in Script") { + auto mainLib = TestLibrary::GetLibrary(); + auto data = GetScript(mainLib, "testTypeCount"); + + auto forme = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2")->GetDefaultForme(); + data.Context->SetArgObject(0, const_cast(forme)); + data.Context->SetArgDWord(1, forme->GetTypeCount()); + + auto result = data.Context->Execute(); + REQUIRE(result == asEXECUTION_FINISHED); + auto v = (bool)data.Context->GetReturnWord(); + REQUIRE(v); +} + +TEST_CASE("Validate Forme GetType in Script") { + auto mainLib = TestLibrary::GetLibrary(); + auto data = GetScript(mainLib, "testGetType"); + + auto forme = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2")->GetDefaultForme(); + data.Context->SetArgObject(0, const_cast(forme)); + data.Context->SetArgByte(1, forme->GetType(0)); + + auto result = data.Context->Execute(); + REQUIRE(result == asEXECUTION_FINISHED); + auto v = (bool)data.Context->GetReturnWord(); + REQUIRE(v); +} + +TEST_CASE("Validate Forme GetStatistic in Script") { + auto mainLib = TestLibrary::GetLibrary(); + + // Iterate over each stat, ensure they return the expected value. + for (uint8_t statInt = CreatureLib::Core::Statistic::Health; statInt != CreatureLib::Core::Statistic::Speed; + statInt++) { + auto stat = static_cast(statInt); + + auto data = GetScript(mainLib, "testGetStatistic"); + auto forme = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2")->GetDefaultForme(); + data.Context->SetArgObject(0, const_cast(forme)); + data.Context->SetArgDWord(1, stat); + data.Context->SetArgDWord(2, forme->GetStatistic(stat)); + REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); + REQUIRE((bool)data.Context->GetReturnWord()); + } +} + +TEST_CASE("Validate Forme GetAbility in Script") { + auto mainLib = TestLibrary::GetLibrary(); + + auto data = GetScript(mainLib, "testGetAbility"); + auto forme = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2")->GetDefaultForme(); + data.Context->SetArgObject(0, const_cast(forme)); + auto ability = forme->GetAbility(0); + data.Context->SetArgAddress(1, &ability); + REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED); + REQUIRE((bool)data.Context->GetReturnWord()); +} + + +#endif \ No newline at end of file diff --git a/tests/ScriptTests/ScriptTypeTests/SpeciesTests.cpp b/tests/ScriptTests/ScriptTypeTests/SpeciesTests.cpp index f68a3d7..f9067e8 100644 --- a/tests/ScriptTests/ScriptTypeTests/SpeciesTests.cpp +++ b/tests/ScriptTests/ScriptTypeTests/SpeciesTests.cpp @@ -30,7 +30,7 @@ struct ScriptData{ } }; -ScriptData GetScript(PkmnLib::Battling::BattleLibrary* mainLib, const char* funcName){ +static ScriptData GetScript(PkmnLib::Battling::BattleLibrary* mainLib, const char* funcName){ auto lib = dynamic_cast(PkmnLib::Battling::BattleLibrary::CreateScriptResolver()); lib->Initialize(mainLib); lib->SetCreateFunction(&_testLoadFunc); @@ -133,8 +133,7 @@ TEST_CASE("Validate Species Get Default Forme in Script") { auto data = GetScript(mainLib, "testGetDefaultForme"); auto species = mainLib->GetSpeciesLibrary()->GetPkmnSpecies("testSpecies2"); - data.Context->SetArgObject( - 0, const_cast(species)); + data.Context->SetArgObject(0, const_cast(species)); data.Context->SetArgObject(1, const_cast(species->GetDefaultForme())); auto result = data.Context->Execute(); @@ -144,4 +143,5 @@ TEST_CASE("Validate Species Get Default Forme in Script") { } + #endif \ No newline at end of file