2022-05-14 09:48:27 +00:00
|
|
|
#if TESTS_BUILD and ANGELSCRIPT
|
2022-02-11 11:17:27 +00:00
|
|
|
#include <doctest.h>
|
2020-04-23 22:05:43 +00:00
|
|
|
#include "../../../../src/ScriptResolving/AngelScript/AngelScriptResolver.hpp"
|
2021-09-22 17:02:01 +00:00
|
|
|
#include "../../../../src/ScriptResolving/AngelScript/ContextPool.hpp"
|
2020-01-23 14:10:08 +00:00
|
|
|
#include "../../../TestLibrary/TestLibrary.hpp"
|
2020-01-18 12:07:56 +00:00
|
|
|
|
|
|
|
static std::unordered_map<const char*, const char*> _scripts =
|
|
|
|
std::unordered_map<const char*, const char*>{{"testScript1", R"(
|
2020-02-16 13:38:05 +00:00
|
|
|
namespace Pokemon{
|
2020-04-10 12:57:20 +00:00
|
|
|
[Pokemon effect=testScript1]
|
2021-03-07 16:09:30 +00:00
|
|
|
class testScript1 : PkmnScript {
|
2020-04-07 10:05:37 +00:00
|
|
|
bool testName(const Forme@ s, const constString &in name){ return s.Name == name; }
|
2020-01-18 12:07:56 +00:00
|
|
|
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; }
|
2020-04-06 18:03:44 +00:00
|
|
|
bool testGetAbility(const Forme@ s, const constString &in ability){ return s.GetAbility(false, 0) == ability; }
|
2020-02-16 13:38:05 +00:00
|
|
|
}}
|
2020-01-18 12:07:56 +00:00
|
|
|
)"}};
|
|
|
|
|
|
|
|
struct ScriptData {
|
2020-02-06 15:25:55 +00:00
|
|
|
AngelScriptScript* Script = nullptr;
|
2020-04-23 22:05:43 +00:00
|
|
|
AngelScriptResolver* Resolver = nullptr;
|
2020-02-06 15:25:55 +00:00
|
|
|
asIScriptFunction* Func = nullptr;
|
|
|
|
asIScriptContext* Context = nullptr;
|
2020-01-18 12:07:56 +00:00
|
|
|
|
|
|
|
~ScriptData() {
|
|
|
|
Script->GetContextPool()->ReturnContextToPool(Context);
|
|
|
|
delete Script;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-04-23 22:05:43 +00:00
|
|
|
static AngelScriptResolver* _resolverCache = nullptr;
|
2020-04-28 12:48:56 +00:00
|
|
|
static AngelScriptResolver* GetScriptResolver(PkmnLib::Battling::BattleLibrary* mainLib) {
|
|
|
|
if (_resolverCache == nullptr) {
|
2020-04-23 22:05:43 +00:00
|
|
|
_resolverCache = dynamic_cast<AngelScriptResolver*>(PkmnLib::Battling::BattleLibrary::CreateScriptResolver());
|
2020-02-01 15:56:09 +00:00
|
|
|
_resolverCache->Initialize(mainLib);
|
2020-04-28 12:48:56 +00:00
|
|
|
_resolverCache->CreateScript("testScript1", _scripts["testScript1"]);
|
2020-02-01 15:56:09 +00:00
|
|
|
_resolverCache->FinalizeModule();
|
|
|
|
}
|
|
|
|
return _resolverCache;
|
|
|
|
}
|
|
|
|
|
2020-07-04 13:50:30 +00:00
|
|
|
static ScriptData GetScript(PkmnLib::Battling::BattleLibrary* mainLib, const ArbUt::StringView& funcName) {
|
2020-02-01 15:56:09 +00:00
|
|
|
auto lib = GetScriptResolver(mainLib);
|
2021-10-29 21:54:44 +00:00
|
|
|
auto s = lib->LoadScript(nullptr, ScriptCategory::Creature, "testScript1"_cnc);
|
2020-01-18 12:07:56 +00:00
|
|
|
auto script = dynamic_cast<AngelScriptScript*>(s);
|
2020-04-10 12:57:20 +00:00
|
|
|
REQUIRE(script != nullptr);
|
|
|
|
|
2020-01-18 12:07:56 +00:00
|
|
|
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();
|
2020-04-06 18:03:44 +00:00
|
|
|
auto data = GetScript(mainLib, "testName"_cnc);
|
2020-01-18 12:07:56 +00:00
|
|
|
|
2020-02-27 17:59:15 +00:00
|
|
|
auto forme = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc)->GetDefaultForme();
|
2020-05-27 15:26:25 +00:00
|
|
|
data.Context->SetArgObject(0, (void*)forme.GetRaw());
|
2020-01-18 12:07:56 +00:00
|
|
|
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();
|
2020-04-06 18:03:44 +00:00
|
|
|
auto data = GetScript(mainLib, "testWeight"_cnc);
|
2020-01-18 12:07:56 +00:00
|
|
|
|
2020-02-27 17:59:15 +00:00
|
|
|
auto forme = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc)->GetDefaultForme();
|
2020-05-27 15:26:25 +00:00
|
|
|
data.Context->SetArgObject(0, (void*)forme.GetRaw());
|
2020-01-18 12:07:56 +00:00
|
|
|
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();
|
2020-04-06 18:03:44 +00:00
|
|
|
auto data = GetScript(mainLib, "testHeight"_cnc);
|
2020-01-18 12:07:56 +00:00
|
|
|
|
2020-02-27 17:59:15 +00:00
|
|
|
auto forme = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc)->GetDefaultForme();
|
2020-05-27 15:26:25 +00:00
|
|
|
data.Context->SetArgObject(0, (void*)forme.GetRaw());
|
2020-01-18 12:07:56 +00:00
|
|
|
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();
|
2020-04-06 18:03:44 +00:00
|
|
|
auto data = GetScript(mainLib, "testBaseExperience"_cnc);
|
2020-01-18 12:07:56 +00:00
|
|
|
|
2020-02-27 17:59:15 +00:00
|
|
|
auto forme = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc)->GetDefaultForme();
|
2020-05-27 15:26:25 +00:00
|
|
|
data.Context->SetArgObject(0, (void*)forme.GetRaw());
|
2020-01-18 12:07:56 +00:00
|
|
|
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();
|
2020-04-06 18:03:44 +00:00
|
|
|
auto data = GetScript(mainLib, "testTypeCount"_cnc);
|
2020-01-18 12:07:56 +00:00
|
|
|
|
2020-02-27 17:59:15 +00:00
|
|
|
auto forme = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc)->GetDefaultForme();
|
2020-05-27 15:26:25 +00:00
|
|
|
data.Context->SetArgObject(0, (void*)forme.GetRaw());
|
2020-01-18 12:07:56 +00:00
|
|
|
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();
|
2020-04-06 18:03:44 +00:00
|
|
|
auto data = GetScript(mainLib, "testGetType"_cnc);
|
2020-01-18 12:07:56 +00:00
|
|
|
|
2020-02-27 17:59:15 +00:00
|
|
|
auto forme = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc)->GetDefaultForme();
|
2020-05-27 15:26:25 +00:00
|
|
|
data.Context->SetArgObject(0, (void*)forme.GetRaw());
|
2020-01-18 12:07:56 +00:00
|
|
|
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.
|
2020-04-06 18:03:44 +00:00
|
|
|
for (uint8_t statInt = static_cast<uint8_t>(CreatureLib::Library::Statistic::Health);
|
|
|
|
statInt != static_cast<uint8_t>(CreatureLib::Library::Statistic::Speed); statInt++) {
|
|
|
|
auto stat = static_cast<CreatureLib::Library::Statistic>(statInt);
|
2020-01-18 12:07:56 +00:00
|
|
|
|
2020-04-06 18:03:44 +00:00
|
|
|
auto data = GetScript(mainLib, "testGetStatistic"_cnc);
|
2020-02-27 17:59:15 +00:00
|
|
|
auto forme = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc)->GetDefaultForme();
|
2020-05-27 15:26:25 +00:00
|
|
|
data.Context->SetArgObject(0, (void*)forme.GetRaw());
|
2020-02-12 19:36:05 +00:00
|
|
|
data.Context->SetArgDWord(1, static_cast<asDWORD>(stat));
|
2020-01-18 12:07:56 +00:00
|
|
|
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();
|
|
|
|
|
2020-04-06 18:03:44 +00:00
|
|
|
auto data = GetScript(mainLib, "testGetAbility"_cnc);
|
2020-02-27 17:59:15 +00:00
|
|
|
auto forme = mainLib->GetSpeciesLibrary()->Get("testSpecies2"_cnc)->GetDefaultForme();
|
2020-05-27 15:26:25 +00:00
|
|
|
data.Context->SetArgObject(0, (void*)forme.GetRaw());
|
2021-11-15 11:47:02 +00:00
|
|
|
auto ability = forme->GetAbility(CreatureLib::Library::TalentIndex(false, 0))->GetName();
|
2020-01-18 12:07:56 +00:00
|
|
|
data.Context->SetArgAddress(1, &ability);
|
|
|
|
REQUIRE(data.Context->Execute() == asEXECUTION_FINISHED);
|
2020-04-07 10:04:23 +00:00
|
|
|
REQUIRE((bool)data.Context->GetReturnWord());
|
2020-01-18 12:07:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|