67 lines
2.4 KiB
C++
67 lines
2.4 KiB
C++
#include "zeroerr/assert.h"
|
|
#include "zeroerr/unittest.h"
|
|
|
|
#include "rpg/RPGActor.h"
|
|
#include "rpg/Skill.h"
|
|
|
|
using namespace eve::rpg;
|
|
|
|
TEST_CASE("rpg.actorCheckpoint.roundTripAndAtomicFailure") {
|
|
SkillRegistry::clear();
|
|
SkillDefinition strike;
|
|
strike.id = "skill.strike";
|
|
SkillRegistry::registerSkill(strike);
|
|
|
|
RPGActor *source = RPGActor::createActor();
|
|
REQUIRE(source != nullptr);
|
|
source->setBaseAttribute("attack", 18.0);
|
|
source->setBaseAttribute("hp", 100.0);
|
|
source->setCurrent("hp", 47.0);
|
|
source->learnSkill("skill.strike");
|
|
source->setSkillCooldown("skill.strike", 5.0f);
|
|
REQUIRE(source->restoreProgression(4, 25.0, 120.0).ok());
|
|
auto encoded = source->checkpointJson();
|
|
REQUIRE(encoded.ok());
|
|
|
|
RPGActor *restored = RPGActor::createActor();
|
|
REQUIRE(restored != nullptr);
|
|
restored->setBaseAttribute("attack", 1.0);
|
|
restored->setBaseAttribute("hp", 100.0);
|
|
restored->setCurrent("hp", 100.0);
|
|
REQUIRE(restored->restoreCheckpointJson(encoded.value()).ok());
|
|
CHECK_EQ(restored->getBaseAttribute("attack"), 18.0);
|
|
CHECK_EQ(restored->getCurrent("hp"), 47.0);
|
|
CHECK_EQ(restored->getLevel(), 4);
|
|
CHECK_EQ(restored->getXp(), 25.0);
|
|
CHECK(restored->knowsSkill("skill.strike"));
|
|
CHECK_EQ(restored->getSkillCooldown("skill.strike"), 0.0f);
|
|
|
|
auto malformed = restored->restoreCheckpointJson(
|
|
R"({"schema":"eve.rpg.actor-checkpoint","version":1,"baseAttributes":[],"class":{"id":"","skillsSyncedUpTo":0},"learnedSkills":[],"progression":{"level":0,"xp":0,"xpToNext":1},"traits":[],"vitals":{}})");
|
|
CHECK(!malformed.ok());
|
|
CHECK_EQ(restored->getBaseAttribute("attack"), 18.0);
|
|
CHECK_EQ(restored->getLevel(), 4);
|
|
CHECK_EQ(restored->getCurrent("hp"), 47.0);
|
|
|
|
source->release();
|
|
restored->release();
|
|
SkillRegistry::clear();
|
|
}
|
|
|
|
TEST_CASE("rpg.actorCheckpoint.rejectsUnsafeCapture") {
|
|
SkillRegistry::clear();
|
|
SkillDefinition channel;
|
|
channel.id = "skill.channel";
|
|
channel.castTime = 2.0f;
|
|
SkillRegistry::registerSkill(channel);
|
|
RPGActor *actor = RPGActor::createActor();
|
|
REQUIRE(actor != nullptr);
|
|
actor->learnSkill("skill.channel");
|
|
REQUIRE(actor->beginCastSkill("skill.channel", actor));
|
|
CHECK(!actor->checkpointJson().ok());
|
|
actor->cancelCastSkill();
|
|
CHECK(actor->checkpointJson().ok());
|
|
actor->release();
|
|
SkillRegistry::clear();
|
|
}
|